diff --git a/Godeps/LICENSES b/Godeps/LICENSES index a05313334c9..34d781f7bc1 100644 --- a/Godeps/LICENSES +++ b/Godeps/LICENSES @@ -2542,237 +2542,6 @@ THE SOFTWARE. ================================================================================ -================================================================================ -= vendor/github.com/bazelbuild/bazel-gazelle 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/bazelbuild/bazel-gazelle/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 -================================================================================ - - -================================================================================ -= vendor/github.com/bazelbuild/buildtools licensed under: = - -Copyright 2016 Google 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. - -= vendor/github.com/bazelbuild/buildtools/LICENSE adb52eb384caedba181cd51fbcdf4b99 -================================================================================ - - ================================================================================ = vendor/github.com/beorn7/perks licensed under: = @@ -2831,35 +2600,6 @@ THE SOFTWARE. ================================================================================ -================================================================================ -= vendor/github.com/BurntSushi/toml licensed under: = - -The MIT License (MIT) - -Copyright (c) 2013 TOML authors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -= vendor/github.com/BurntSushi/toml/COPYING 9e24c0e2a784c1d1fcabb279f4f107e0 -================================================================================ - - ================================================================================ = vendor/github.com/caddyserver/caddy licensed under: = @@ -3069,36 +2809,6 @@ THE SOFTWARE. ================================================================================ -================================================================================ -= vendor/github.com/cespare/prettybench licensed under: = - -Copyright (c) 2014 Caleb Spare - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -= vendor/github.com/cespare/prettybench/LICENSE.txt 673caf450638c643cfede79f39c33087 -================================================================================ - - ================================================================================ = vendor/github.com/chai2010/gettext-go licensed under: = @@ -3374,36 +3084,6 @@ SOFTWARE. ================================================================================ -================================================================================ -= vendor/github.com/client9/misspell licensed under: = - -The MIT License (MIT) - -Copyright (c) 2015-2017 Nick Galbreath - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -= vendor/github.com/client9/misspell/LICENSE 387f6b7d6741c8a7f4f7e3c2bbdf97e4 -================================================================================ - - ================================================================================ = vendor/github.com/clusterhq/flocker-go licensed under: = @@ -7230,34 +6910,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================================================ -================================================================================ -= vendor/github.com/fatih/color licensed under: = - -The MIT License (MIT) - -Copyright (c) 2013 Fatih Arslan - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -= vendor/github.com/fatih/color/LICENSE.md 316e6d590bdcde7993fb175662c0dd5a -================================================================================ - - ================================================================================ = vendor/github.com/fsnotify/fsnotify licensed under: = @@ -13563,52 +13215,6 @@ THE SOFTWARE. ================================================================================ -================================================================================ -= vendor/github.com/mattn/go-colorable licensed under: = - -The MIT License (MIT) - -Copyright (c) 2016 Yasuhiro Matsumoto - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -= vendor/github.com/mattn/go-colorable/LICENSE 24ce168f90aec2456a73de1839037245 -================================================================================ - - -================================================================================ -= vendor/github.com/mattn/go-isatty licensed under: = - -Copyright (c) Yasuhiro MATSUMOTO - -MIT License (Expat) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -= vendor/github.com/mattn/go-isatty/LICENSE f509beadd5a11227c27b5d2ad6c9f2c6 -================================================================================ - - ================================================================================ = vendor/github.com/matttproud/golang_protobuf_extensions licensed under: = @@ -20586,41 +20192,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================================================ -================================================================================ -= vendor/golang.org/x/lint licensed under: = - -Copyright (c) 2013 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -= vendor/golang.org/x/lint/LICENSE 4c728948788b1a02f33ae4e906546eef -================================================================================ - - ================================================================================ = vendor/golang.org/x/net licensed under: = @@ -22220,265 +21791,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================================================ -================================================================================ -= vendor/gotest.tools licensed under: = - -Copyright 2018 gotest.tools authors - -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/gotest.tools/LICENSE 26d13e18e6e60338287c11c73cc80ff5 -================================================================================ - - -================================================================================ -= vendor/gotest.tools/gotestsum 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/gotest.tools/gotestsum/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 -================================================================================ - - -================================================================================ -= vendor/honnef.co/go/tools licensed under: = - -Copyright (c) 2016 Dominik Honnef - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -= vendor/honnef.co/go/tools/LICENSE ca0492e2abd2c12b3f3c25d6e33972ad -================================================================================ - - ================================================================================ = vendor/k8s.io/gengo licensed under: = @@ -23307,215 +22619,6 @@ third-party archives. ================================================================================ -================================================================================ -= vendor/k8s.io/repo-infra 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/k8s.io/repo-infra/LICENSE e3fc50a88d0a364313df4b21ef20c29e -================================================================================ - - ================================================================================ = vendor/k8s.io/system-validators licensed under: = diff --git a/build/root/.kazelcfg.json b/build/root/.kazelcfg.json index 342cc3e0dab..23518e90e46 100644 --- a/build/root/.kazelcfg.json +++ b/build/root/.kazelcfg.json @@ -3,6 +3,7 @@ "SkippedPaths": [ "^_.*", "/_", + "^hack/tools", "^third_party/etcd.*" ], "AddSourcesRules": true, diff --git a/build/tools.go b/build/tools.go index 5faebdb6475..33958d7bfba 100644 --- a/build/tools.go +++ b/build/tools.go @@ -20,16 +20,8 @@ limitations under the License. package tools import ( - _ "github.com/bazelbuild/bazel-gazelle/cmd/gazelle" - _ "github.com/bazelbuild/buildtools/buildozer" - _ "github.com/cespare/prettybench" - _ "github.com/client9/misspell/cmd/misspell" _ "github.com/go-bindata/go-bindata/go-bindata" _ "github.com/onsi/ginkgo/ginkgo" - _ "golang.org/x/lint/golint" - _ "gotest.tools" - _ "gotest.tools/gotestsum" - _ "honnef.co/go/tools/cmd/staticcheck" _ "k8s.io/code-generator/cmd/go-to-protobuf" _ "k8s.io/code-generator/cmd/go-to-protobuf/protoc-gen-gogo" _ "k8s.io/gengo/examples/deepcopy-gen/generators" @@ -37,5 +29,4 @@ import ( _ "k8s.io/gengo/examples/import-boss/generators" _ "k8s.io/gengo/examples/set-gen/generators" _ "k8s.io/kube-openapi/cmd/openapi-gen" - _ "k8s.io/repo-infra/cmd/kazel" ) diff --git a/go.mod b/go.mod index 6769f3453dc..7b0f0d47614 100644 --- a/go.mod +++ b/go.mod @@ -20,13 +20,9 @@ require ( github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e github.com/auth0/go-jwt-middleware v0.0.0-20170425171159-5493cabe49f7 // indirect github.com/aws/aws-sdk-go v1.28.2 - github.com/bazelbuild/bazel-gazelle v0.19.1-0.20191105222053-70208cbdc798 - github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89 github.com/blang/semver v3.5.0+incompatible github.com/boltdb/bolt v1.3.1 // indirect github.com/caddyserver/caddy v1.0.3 - github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c - github.com/client9/misspell v0.3.4 github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313 github.com/codegangsta/negroni v1.0.0 // indirect github.com/container-storage-interface/spec v1.2.0 @@ -73,6 +69,7 @@ require ( github.com/libopenstorage/openstorage v1.0.0 github.com/lithammer/dedent v1.1.0 github.com/lpabon/godbc v0.1.1 // indirect + github.com/magiconair/properties v1.8.1 // indirect github.com/miekg/dns v1.1.4 github.com/moby/ipvs v1.0.0 github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb // indirect @@ -105,7 +102,6 @@ require ( github.com/vmware/govmomi v0.20.3 go.etcd.io/etcd v0.5.0-alpha.5.0.20200401174654-e694b7bb0875 golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 - golang.org/x/lint v0.0.0-20190409202823-959b441ac422 golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd @@ -118,9 +114,6 @@ require ( gopkg.in/gcfg.v1 v1.2.0 gopkg.in/square/go-jose.v2 v2.2.2 gopkg.in/yaml.v2 v2.2.8 - gotest.tools v2.2.0+incompatible - gotest.tools/gotestsum v0.3.5 - honnef.co/go/tools v0.0.1-2019.2.2 k8s.io/api v0.0.0 k8s.io/apiextensions-apiserver v0.0.0 k8s.io/apimachinery v0.0.0 @@ -145,7 +138,6 @@ require ( k8s.io/kubelet v0.0.0 k8s.io/legacy-cloud-providers v0.0.0 k8s.io/metrics v0.0.0 - k8s.io/repo-infra v0.0.1-alpha.1 k8s.io/sample-apiserver v0.0.0 k8s.io/system-validators v1.1.2 k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89 @@ -174,39 +166,30 @@ replace ( github.com/Microsoft/go-winio => github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 github.com/Microsoft/hcsshim => github.com/Microsoft/hcsshim v0.0.0-20190417211021-672e52e9209d github.com/NYTimes/gziphandler => github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46 - github.com/OpenPeeDeeP/depguard => github.com/OpenPeeDeeP/depguard v1.0.1 github.com/PuerkitoBio/purell => github.com/PuerkitoBio/purell v1.1.1 github.com/PuerkitoBio/urlesc => github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 - github.com/StackExchange/wmi => github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 github.com/agnivade/levenshtein => github.com/agnivade/levenshtein v1.0.1 github.com/ajstarks/svgo => github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af github.com/alecthomas/template => github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc github.com/alecthomas/units => github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf github.com/andreyvit/diff => github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 - github.com/anmitsu/go-shlex => github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 github.com/armon/circbuf => github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e github.com/armon/consul-api => github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 github.com/asaskevich/govalidator => github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a github.com/auth0/go-jwt-middleware => github.com/auth0/go-jwt-middleware v0.0.0-20170425171159-5493cabe49f7 github.com/aws/aws-sdk-go => github.com/aws/aws-sdk-go v1.28.2 - github.com/bazelbuild/bazel-gazelle => github.com/bazelbuild/bazel-gazelle v0.19.1-0.20191105222053-70208cbdc798 - github.com/bazelbuild/buildtools => github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89 - github.com/bazelbuild/rules_go => github.com/bazelbuild/rules_go v0.0.0-20190719190356-6dae44dc5cab github.com/beorn7/perks => github.com/beorn7/perks v1.0.0 github.com/bgentry/speakeasy => github.com/bgentry/speakeasy v0.1.0 github.com/bifurcation/mint => github.com/bifurcation/mint v0.0.0-20180715133206-93c51c6ce115 github.com/blang/semver => github.com/blang/semver v3.5.0+incompatible github.com/boltdb/bolt => github.com/boltdb/bolt v1.3.1 - github.com/bradfitz/go-smtpd => github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625 github.com/caddyserver/caddy => github.com/caddyserver/caddy v1.0.3 github.com/cenkalti/backoff => github.com/cenkalti/backoff v2.1.1+incompatible github.com/census-instrumentation/opencensus-proto => github.com/census-instrumentation/opencensus-proto v0.2.1 - github.com/cespare/prettybench => github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c github.com/chai2010/gettext-go => github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 github.com/checkpoint-restore/go-criu => github.com/checkpoint-restore/go-criu v0.0.0-20190109184317-bdb7599cd87b github.com/cheekybits/genny => github.com/cheekybits/genny v0.0.0-20170328200008-9127e812e1e9 github.com/cilium/ebpf => github.com/cilium/ebpf v0.0.0-20191113100448-d9fb101ca1fb - github.com/client9/misspell => github.com/client9/misspell v0.3.4 github.com/clusterhq/flocker-go => github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313 github.com/cockroachdb/datadriven => github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa github.com/codegangsta/negroni => github.com/codegangsta/negroni v1.0.0 @@ -250,16 +233,12 @@ replace ( github.com/fogleman/gg => github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90 github.com/fsnotify/fsnotify => github.com/fsnotify/fsnotify v1.4.9 github.com/ghodss/yaml => github.com/ghodss/yaml v1.0.0 - github.com/gliderlabs/ssh => github.com/gliderlabs/ssh v0.1.1 github.com/go-acme/lego => github.com/go-acme/lego v2.5.0+incompatible github.com/go-bindata/go-bindata => github.com/go-bindata/go-bindata v3.1.1+incompatible - github.com/go-critic/go-critic => github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540 github.com/go-ini/ini => github.com/go-ini/ini v1.9.0 github.com/go-kit/kit => github.com/go-kit/kit v0.8.0 - github.com/go-lintpack/lintpack => github.com/go-lintpack/lintpack v0.5.2 github.com/go-logfmt/logfmt => github.com/go-logfmt/logfmt v0.3.0 github.com/go-logr/logr => github.com/go-logr/logr v0.1.0 - github.com/go-ole/go-ole => github.com/go-ole/go-ole v1.2.1 github.com/go-openapi/analysis => github.com/go-openapi/analysis v0.19.5 github.com/go-openapi/errors => github.com/go-openapi/errors v0.19.2 github.com/go-openapi/jsonpointer => github.com/go-openapi/jsonpointer v0.19.3 @@ -272,16 +251,6 @@ replace ( github.com/go-openapi/validate => github.com/go-openapi/validate v0.19.5 github.com/go-ozzo/ozzo-validation => github.com/go-ozzo/ozzo-validation v3.5.0+incompatible github.com/go-stack/stack => github.com/go-stack/stack v1.8.0 - github.com/go-toolsmith/astcast => github.com/go-toolsmith/astcast v1.0.0 - github.com/go-toolsmith/astcopy => github.com/go-toolsmith/astcopy v1.0.0 - github.com/go-toolsmith/astequal => github.com/go-toolsmith/astequal v1.0.0 - github.com/go-toolsmith/astfmt => github.com/go-toolsmith/astfmt v1.0.0 - github.com/go-toolsmith/astinfo => github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21 - github.com/go-toolsmith/astp => github.com/go-toolsmith/astp v1.0.0 - github.com/go-toolsmith/pkgload => github.com/go-toolsmith/pkgload v1.0.0 - github.com/go-toolsmith/strparse => github.com/go-toolsmith/strparse v1.0.0 - github.com/go-toolsmith/typep => github.com/go-toolsmith/typep v1.0.0 - github.com/gobwas/glob => github.com/gobwas/glob v0.2.3 github.com/godbus/dbus => github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e github.com/gogo/protobuf => github.com/gogo/protobuf v1.3.1 github.com/golang/freetype => github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 @@ -289,35 +258,15 @@ replace ( github.com/golang/groupcache => github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903 github.com/golang/mock => github.com/golang/mock v1.3.1 github.com/golang/protobuf => github.com/golang/protobuf v1.3.3 - github.com/golangci/check => github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 - github.com/golangci/dupl => github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a - github.com/golangci/errcheck => github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 - github.com/golangci/go-misc => github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 - github.com/golangci/go-tools => github.com/golangci/go-tools v0.0.0-20190318055746-e32c54105b7c - github.com/golangci/goconst => github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 - github.com/golangci/gocyclo => github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee - github.com/golangci/gofmt => github.com/golangci/gofmt v0.0.0-20181222123516-0b8337e80d98 - github.com/golangci/golangci-lint => github.com/golangci/golangci-lint v1.18.0 - github.com/golangci/gosec => github.com/golangci/gosec v0.0.0-20190211064107-66fb7fc33547 - github.com/golangci/ineffassign => github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc - github.com/golangci/lint-1 => github.com/golangci/lint-1 v0.0.0-20190420132249-ee948d087217 - github.com/golangci/maligned => github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca - github.com/golangci/misspell => github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 - github.com/golangci/prealloc => github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 - github.com/golangci/revgrep => github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 - github.com/golangci/unconvert => github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 github.com/golangplus/bytes => github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450 github.com/golangplus/fmt => github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995 github.com/golangplus/testing => github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e github.com/google/btree => github.com/google/btree v1.0.0 github.com/google/cadvisor => github.com/google/cadvisor v0.36.1-0.20200323171535-8af10c683a96 github.com/google/go-cmp => github.com/google/go-cmp v0.4.0 - github.com/google/go-github => github.com/google/go-github v17.0.0+incompatible - github.com/google/go-querystring => github.com/google/go-querystring v1.0.0 github.com/google/gofuzz => github.com/google/gofuzz v1.1.0 github.com/google/martian => github.com/google/martian v2.1.0+incompatible github.com/google/pprof => github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57 - github.com/google/renameio => github.com/google/renameio v0.1.0 github.com/google/uuid => github.com/google/uuid v1.1.1 github.com/googleapis/gax-go/v2 => github.com/googleapis/gax-go/v2 v2.0.4 github.com/googleapis/gnostic => github.com/googleapis/gnostic v0.4.1 @@ -326,7 +275,6 @@ replace ( github.com/gorilla/context => github.com/gorilla/context v1.1.1 github.com/gorilla/mux => github.com/gorilla/mux v1.7.3 github.com/gorilla/websocket => github.com/gorilla/websocket v1.4.0 - github.com/gostaticanalysis/analysisutil => github.com/gostaticanalysis/analysisutil v0.0.3 github.com/gregjones/httpcache => github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 github.com/grpc-ecosystem/go-grpc-middleware => github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 github.com/grpc-ecosystem/go-grpc-prometheus => github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 @@ -340,7 +288,6 @@ replace ( github.com/imdario/mergo => github.com/imdario/mergo v0.3.5 github.com/inconshreveable/mousetrap => github.com/inconshreveable/mousetrap v1.0.0 github.com/ishidawataru/sctp => github.com/ishidawataru/sctp v0.0.0-20190723014705-7c296d48a2b5 - github.com/jellevandenhooff/dkim => github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1 github.com/jimstudt/http-authentication => github.com/jimstudt/http-authentication v0.0.0-20140401203705-3eca13d6893a github.com/jmespath/go-jmespath => github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af github.com/jonboulle/clockwork => github.com/jonboulle/clockwork v0.1.0 @@ -352,7 +299,6 @@ replace ( github.com/karrick/godirwalk => github.com/karrick/godirwalk v1.7.5 github.com/kisielk/errcheck => github.com/kisielk/errcheck v1.2.0 github.com/kisielk/gotool => github.com/kisielk/gotool v1.0.0 - github.com/klauspost/compress => github.com/klauspost/compress v1.4.1 github.com/klauspost/cpuid => github.com/klauspost/cpuid v1.2.0 github.com/konsorten/go-windows-terminal-sequences => github.com/konsorten/go-windows-terminal-sequences v1.0.2 github.com/kr/logfmt => github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 @@ -363,7 +309,6 @@ replace ( github.com/libopenstorage/openstorage => github.com/libopenstorage/openstorage v1.0.0 github.com/liggitt/tabwriter => github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de github.com/lithammer/dedent => github.com/lithammer/dedent v1.1.0 - github.com/logrusorgru/aurora => github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e github.com/lpabon/godbc => github.com/lpabon/godbc v0.1.1 github.com/lucas-clemente/aes12 => github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f github.com/lucas-clemente/quic-clients => github.com/lucas-clemente/quic-clients v0.1.0 @@ -373,16 +318,14 @@ replace ( github.com/mailru/easyjson => github.com/mailru/easyjson v0.7.0 github.com/marten-seemann/qtls => github.com/marten-seemann/qtls v0.2.3 github.com/mattn/go-colorable => github.com/mattn/go-colorable v0.0.9 - github.com/mattn/go-isatty => github.com/mattn/go-isatty v0.0.9 + github.com/mattn/go-isatty => github.com/mattn/go-isatty v0.0.4 github.com/mattn/go-runewidth => github.com/mattn/go-runewidth v0.0.2 - github.com/mattn/goveralls => github.com/mattn/goveralls v0.0.2 github.com/matttproud/golang_protobuf_extensions => github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 github.com/mholt/certmagic => github.com/mholt/certmagic v0.6.2-0.20190624175158-6a42ef9fe8c2 github.com/miekg/dns => github.com/miekg/dns v1.1.4 github.com/mindprince/gonvml => github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989 github.com/mistifyio/go-zfs => github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible github.com/mitchellh/go-homedir => github.com/mitchellh/go-homedir v1.1.0 - github.com/mitchellh/go-ps => github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936 github.com/mitchellh/go-wordwrap => github.com/mitchellh/go-wordwrap v1.0.0 github.com/mitchellh/mapstructure => github.com/mitchellh/mapstructure v1.1.2 github.com/moby/ipvs => github.com/moby/ipvs v1.0.0 @@ -391,7 +334,6 @@ replace ( github.com/modern-go/reflect2 => github.com/modern-go/reflect2 v1.0.1 github.com/mohae/deepcopy => github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb github.com/morikuni/aec => github.com/morikuni/aec v1.0.0 - github.com/mozilla/tls-observatory => github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40 github.com/mrunalp/fileutils => github.com/mrunalp/fileutils v0.0.0-20171103030105-7d4729fb3618 github.com/munnerz/goautoneg => github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 github.com/mvdan/xurls => github.com/mvdan/xurls v1.1.0 @@ -399,7 +341,6 @@ replace ( github.com/mxk/go-flowrate => github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f github.com/naoina/go-stringutil => github.com/naoina/go-stringutil v0.1.0 github.com/naoina/toml => github.com/naoina/toml v0.1.1 - github.com/nbutton23/zxcvbn-go => github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663 github.com/olekukonko/tablewriter => github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5 github.com/onsi/ginkgo => github.com/onsi/ginkgo v1.11.0 github.com/onsi/gomega => github.com/onsi/gomega v1.7.0 @@ -417,27 +358,19 @@ replace ( github.com/prometheus/client_model => github.com/prometheus/client_model v0.2.0 github.com/prometheus/common => github.com/prometheus/common v0.4.1 github.com/prometheus/procfs => github.com/prometheus/procfs v0.0.5 - github.com/quasilyte/go-consistent => github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c github.com/quobyte/api => github.com/quobyte/api v0.1.2 github.com/remyoudompheng/bigfft => github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446 github.com/robfig/cron => github.com/robfig/cron v1.1.0 github.com/rogpeppe/fastuuid => github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af - github.com/rogpeppe/go-internal => github.com/rogpeppe/go-internal v1.3.0 github.com/rubiojr/go-vhd => github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c github.com/russross/blackfriday => github.com/russross/blackfriday v1.5.2 - github.com/ryanuber/go-glob => github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735 github.com/satori/go.uuid => github.com/satori/go.uuid v1.2.0 github.com/seccomp/libseccomp-golang => github.com/seccomp/libseccomp-golang v0.9.1 github.com/sergi/go-diff => github.com/sergi/go-diff v1.0.0 - github.com/shirou/gopsutil => github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7 - github.com/shirou/w32 => github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 - github.com/shurcooL/go => github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e - github.com/shurcooL/go-goon => github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 github.com/sirupsen/logrus => github.com/sirupsen/logrus v1.4.2 github.com/smartystreets/assertions => github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d github.com/smartystreets/goconvey => github.com/smartystreets/goconvey v1.6.4 github.com/soheilhy/cmux => github.com/soheilhy/cmux v0.1.4 - github.com/sourcegraph/go-diff => github.com/sourcegraph/go-diff v0.5.1 github.com/spf13/afero => github.com/spf13/afero v1.2.2 github.com/spf13/cast => github.com/spf13/cast v1.3.0 github.com/spf13/cobra => github.com/spf13/cobra v0.0.5 @@ -448,19 +381,12 @@ replace ( github.com/stretchr/objx => github.com/stretchr/objx v0.2.0 github.com/stretchr/testify => github.com/stretchr/testify v1.4.0 github.com/syndtr/gocapability => github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 - github.com/tarm/serial => github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 github.com/thecodeteam/goscaleio => github.com/thecodeteam/goscaleio v0.1.0 github.com/tidwall/pretty => github.com/tidwall/pretty v1.0.0 - github.com/timakin/bodyclose => github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec github.com/tmc/grpc-websocket-proxy => github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 github.com/ugorji/go/codec => github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 - github.com/ultraware/funlen => github.com/ultraware/funlen v0.0.2 github.com/urfave/cli => github.com/urfave/cli v1.20.0 github.com/urfave/negroni => github.com/urfave/negroni v1.0.0 - github.com/valyala/bytebufferpool => github.com/valyala/bytebufferpool v1.0.0 - github.com/valyala/fasthttp => github.com/valyala/fasthttp v1.2.0 - github.com/valyala/quicktemplate => github.com/valyala/quicktemplate v1.1.1 - github.com/valyala/tcplisten => github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a github.com/vektah/gqlparser => github.com/vektah/gqlparser v1.1.2 github.com/vishvananda/netlink => github.com/vishvananda/netlink v1.1.0 github.com/vishvananda/netns => github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df @@ -475,17 +401,13 @@ replace ( go.uber.org/atomic => go.uber.org/atomic v1.3.2 go.uber.org/multierr => go.uber.org/multierr v1.1.0 go.uber.org/zap => go.uber.org/zap v1.10.0 - go4.org => go4.org v0.0.0-20180809161055-417644f6feb5 - golang.org/x/build => golang.org/x/build v0.0.0-20190927031335-2835ba2e683f golang.org/x/crypto => golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 golang.org/x/exp => golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495 golang.org/x/image => golang.org/x/image v0.0.0-20190227222117-0694c2d4d067 golang.org/x/lint => golang.org/x/lint v0.0.0-20190409202823-959b441ac422 golang.org/x/mobile => golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6 - golang.org/x/mod => golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e golang.org/x/net => golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e golang.org/x/oauth2 => golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 - golang.org/x/perf => golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852 golang.org/x/sync => golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e golang.org/x/sys => golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a // pinned to release-branch.go1.13 golang.org/x/text => golang.org/x/text v0.3.2 @@ -499,14 +421,11 @@ replace ( google.golang.org/appengine => google.golang.org/appengine v1.5.0 google.golang.org/genproto => google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb google.golang.org/grpc => google.golang.org/grpc v1.26.0 - gopkg.in/airbrake/gobrake.v2 => gopkg.in/airbrake/gobrake.v2 v2.0.9 gopkg.in/alecthomas/kingpin.v2 => gopkg.in/alecthomas/kingpin.v2 v2.2.6 gopkg.in/check.v1 => gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 gopkg.in/cheggaaa/pb.v1 => gopkg.in/cheggaaa/pb.v1 v1.0.25 - gopkg.in/errgo.v2 => gopkg.in/errgo.v2 v2.1.0 gopkg.in/fsnotify.v1 => gopkg.in/fsnotify.v1 v1.4.7 gopkg.in/gcfg.v1 => gopkg.in/gcfg.v1 v1.2.0 - gopkg.in/gemnasium/logrus-airbrake-hook.v2 => gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 gopkg.in/inf.v0 => gopkg.in/inf.v0 v0.9.1 gopkg.in/mcuadros/go-syslog.v2 => gopkg.in/mcuadros/go-syslog.v2 v2.2.1 gopkg.in/natefinch/lumberjack.v2 => gopkg.in/natefinch/lumberjack.v2 v2.0.0 @@ -516,10 +435,8 @@ replace ( gopkg.in/warnings.v0 => gopkg.in/warnings.v0 v0.1.1 gopkg.in/yaml.v2 => gopkg.in/yaml.v2 v2.2.8 gotest.tools => gotest.tools v2.2.0+incompatible - gotest.tools/gotestsum => gotest.tools/gotestsum v0.3.5 gotest.tools/v3 => gotest.tools/v3 v3.0.2 - grpc.go4.org => grpc.go4.org v0.0.0-20170609214715-11d0a25b4919 - honnef.co/go/tools => honnef.co/go/tools v0.0.1-2019.2.2 + honnef.co/go/tools => honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a k8s.io/api => ./staging/src/k8s.io/api k8s.io/apiextensions-apiserver => ./staging/src/k8s.io/apiextensions-apiserver k8s.io/apimachinery => ./staging/src/k8s.io/apimachinery @@ -544,7 +461,6 @@ replace ( k8s.io/kubelet => ./staging/src/k8s.io/kubelet k8s.io/legacy-cloud-providers => ./staging/src/k8s.io/legacy-cloud-providers k8s.io/metrics => ./staging/src/k8s.io/metrics - k8s.io/repo-infra => k8s.io/repo-infra v0.0.1-alpha.1 k8s.io/sample-apiserver => ./staging/src/k8s.io/sample-apiserver k8s.io/sample-cli-plugin => ./staging/src/k8s.io/sample-cli-plugin k8s.io/sample-controller => ./staging/src/k8s.io/sample-controller @@ -555,14 +471,10 @@ replace ( modernc.org/mathutil => modernc.org/mathutil v1.0.0 modernc.org/strutil => modernc.org/strutil v1.0.0 modernc.org/xc => modernc.org/xc v1.0.0 - mvdan.cc/interfacer => mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed - mvdan.cc/lint => mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b - mvdan.cc/unparam => mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34 rsc.io/pdf => rsc.io/pdf v0.1.1 sigs.k8s.io/apiserver-network-proxy/konnectivity-client => sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7 sigs.k8s.io/kustomize => sigs.k8s.io/kustomize v2.0.3+incompatible sigs.k8s.io/structured-merge-diff/v3 => sigs.k8s.io/structured-merge-diff/v3 v3.0.0 sigs.k8s.io/yaml => sigs.k8s.io/yaml v1.2.0 - sourcegraph.com/sqs/pbtypes => sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 vbom.ml/util => vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc ) diff --git a/go.sum b/go.sum index cd03c6af6a8..60915d6e2af 100644 --- a/go.sum +++ b/go.sum @@ -37,18 +37,15 @@ github.com/Microsoft/hcsshim v0.0.0-20190417211021-672e52e9209d h1:u64+IetywsPQ0 github.com/Microsoft/hcsshim v0.0.0-20190417211021-672e52e9209d/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46 h1:lsxEuwrXEAokXB9qhlbKWPpo3KMLZQ5WB5WLQRW1uq0= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= @@ -58,12 +55,6 @@ github.com/auth0/go-jwt-middleware v0.0.0-20170425171159-5493cabe49f7 h1:irR1cO6 github.com/auth0/go-jwt-middleware v0.0.0-20170425171159-5493cabe49f7/go.mod h1:LWMyo4iOLWXHGdBki7NIht1kHru/0wM179h+d3g8ATM= github.com/aws/aws-sdk-go v1.28.2 h1:j5IXG9CdyLfcVfICqo1PXVv+rua+QQHbkXuvuU/JF+8= github.com/aws/aws-sdk-go v1.28.2/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/bazelbuild/bazel-gazelle v0.19.1-0.20191105222053-70208cbdc798 h1:1pcd3bq1rC5X4nz56fdK0oQrz9CZup6DGZl8isCPthk= -github.com/bazelbuild/bazel-gazelle v0.19.1-0.20191105222053-70208cbdc798/go.mod h1:rPwzNHUqEzngx1iVBfO/2X2npKaT3tqPqqHW6rVsn/A= -github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89 h1:3B/ZE1a6eEJ/4Jf/M6RM2KBouN8yKCUcMmXzSyWqa3g= -github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= -github.com/bazelbuild/rules_go v0.0.0-20190719190356-6dae44dc5cab h1:wzbawlkLtl2ze9w/312NHZ84c7kpUCtlkD8HgFY27sw= -github.com/bazelbuild/rules_go v0.0.0-20190719190356-6dae44dc5cab/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= @@ -72,13 +63,10 @@ github.com/blang/semver v3.5.0+incompatible h1:CGxCgetQ64DKk7rdZ++Vfnb1+ogGNnB17 github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/caddyserver/caddy v1.0.3 h1:i9gRhBgvc5ifchwWtSe7pDpsdS9+Q0Rw9oYQmYUTw1w= github.com/caddyserver/caddy v1.0.3/go.mod h1:G+ouvOY32gENkJC+jhgl62TyhvqEsFaDiZ4uw0RzP1E= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c h1:p8i+qCbr/dNhS2FoQhRpSS7X5+IlxTa94nRNYXu4fyo= -github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c/go.mod h1:Xe6ZsFhtM8HrDku0pxJ3/Lr51rwykrzgFwpmTzleatY= github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 h1:7aWHqerlJ41y6FOsEUvknqgXnGmJyJSbjhAWq5pO4F8= github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/checkpoint-restore/go-criu v0.0.0-20190109184317-bdb7599cd87b h1:T4nWG1TXIxeor8mAu5bFguPJgSIGhZqv/f0z55KCrJM= @@ -86,8 +74,6 @@ github.com/checkpoint-restore/go-criu v0.0.0-20190109184317-bdb7599cd87b/go.mod github.com/cheekybits/genny v0.0.0-20170328200008-9127e812e1e9/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/cilium/ebpf v0.0.0-20191113100448-d9fb101ca1fb h1:bQ0NJ9dAB8vsw7ffajBDX/7Wr64BdLWeJkYY36UkeRY= github.com/cilium/ebpf v0.0.0-20191113100448-d9fb101ca1fb/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313 h1:eIHD9GNM3Hp7kcRW5mvcz7WTR3ETeoYYKwpgA04kaXE= github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313/go.mod h1:P1wt9Z3DP8O6W3rvwCt0REIlshg1InHImaLW0t3ObY0= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y= @@ -167,17 +153,13 @@ github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-acme/lego v2.5.0+incompatible/go.mod h1:yzMNe9CasVUhkquNvti5nAtPmG94USbYxYrZfTkIn0M= github.com/go-bindata/go-bindata v3.1.1+incompatible h1:tR4f0e4VTO7LK6B2YWyAoVEzG9ByG1wrXB4TL9+jiYg= github.com/go-bindata/go-bindata v3.1.1+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= -github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA= github.com/go-ini/ini v1.9.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI= github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY= @@ -202,16 +184,6 @@ github.com/go-ozzo/ozzo-validation v3.5.0+incompatible h1:sUy/in/P6askYr16XJgTKq github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= @@ -225,23 +197,6 @@ github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/go-tools v0.0.0-20190318055746-e32c54105b7c/go.mod h1:unzUULGw35sjyOYjUt0jMTXqHlZPpPc6e+xfO4cd6mM= -github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= -github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= -github.com/golangci/gofmt v0.0.0-20181222123516-0b8337e80d98/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.18.0/go.mod h1:kaqo8l0OZKYPtjNmG4z4HrWLgcYNIJ9B9q3LWri9uLg= -github.com/golangci/gosec v0.0.0-20190211064107-66fb7fc33547/go.mod h1:0qUabqiIQgfmlAmulqxyiGkkyF6/tOGSnY2cnPVwrzU= -github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= -github.com/golangci/lint-1 v0.0.0-20190420132249-ee948d087217/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= -github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450 h1:7xqw01UYS+KCI25bMrPxwNYkSns2Db1ziQPpVq99FpE= github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995 h1:f5gsjBiF9tRRVomCvrkGMMWI8W1f2OBFar2c5oakAP0= @@ -254,13 +209,10 @@ github.com/google/cadvisor v0.36.1-0.20200323171535-8af10c683a96 h1:au7bcM+rjGXL github.com/google/cadvisor v0.36.1-0.20200323171535-8af10c683a96/go.mod h1:OTAGfVYYYA6MI5yPZ1/81PGoh6gfXpcQIyb3mXX7C3M= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= @@ -276,7 +228,6 @@ github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 h1:z53tR0945TRRQO/fLEVPI6SMv7ZflF0TEaTAoU7tOzg= @@ -302,7 +253,6 @@ github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NH github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/ishidawataru/sctp v0.0.0-20190723014705-7c296d48a2b5 h1:qPmlgoeRS18y2dT+iAH5vEKZgIqgiPi2Y8UCu/b7Aq8= github.com/ishidawataru/sctp v0.0.0-20190723014705-7c296d48a2b5/go.mod h1:DM4VvS+hD/kDi1U1QsX2fnZowwBhqD0Dk3bRPKF/Oc8= -github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jimstudt/http-authentication v0.0.0-20140401203705-3eca13d6893a/go.mod h1:wK6yTYYcgjHE1Z1QtXACPDjcFJyBskHEdagmnq3vsP8= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af h1:pmfjZENx5imkbgOkpRUYLnmbU7UEFbjtDA2hxJ1ichM= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -319,8 +269,6 @@ github.com/karrick/godirwalk v1.7.5 h1:VbzFqwXwNbAZoA6W5odrLr+hKK197CcENcPh6E/gJ github.com/karrick/godirwalk v1.7.5/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.4.1 h1:8VMb5+0wMgdBykOV96DwNwKFQ+WTI4pzYURP99CcB9E= -github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -337,7 +285,6 @@ github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhn github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lpabon/godbc v0.1.1 h1:ilqjArN1UOENJJdM34I2YHKmF/B0gGq4VLoSGy9iAao= github.com/lpabon/godbc v0.1.1/go.mod h1:Jo9QV0cf3U6jZABgiJ2skINAXb9j8m51r07g4KI92ZA= github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f/go.mod h1:JpH9J1c9oX6otFSgdUHwUBUizmKlrMjxWnIAjff4m04= @@ -351,10 +298,8 @@ github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7 github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mholt/certmagic v0.6.2-0.20190624175158-6a42ef9fe8c2/go.mod h1:g4cOPxcjV0oFq3qwpjSA30LReKD8AoIfwAY9VvG35NY= @@ -366,7 +311,6 @@ github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible h1 github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= @@ -383,7 +327,6 @@ github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb h1:e+l77LJOEqXTIQih github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= github.com/mrunalp/fileutils v0.0.0-20171103030105-7d4729fb3618 h1:7InQ7/zrOh6SlFjaXFubv0xX0HsuC9qJsdqm7bNQpYM= github.com/mrunalp/fileutils v0.0.0-20171103030105-7d4729fb3618/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= @@ -395,7 +338,6 @@ github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -429,28 +371,21 @@ github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8= github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= github.com/quobyte/api v0.1.2 h1:lPHLsuvtjFyk8WhC4uHoHRkScijIHcffTWBBP+YpzYo= github.com/quobyte/api v0.1.2/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/robfig/cron v1.1.0 h1:jk4/Hud3TTdcrJgUOBgsqrZBarcxl6ADIjSC2iniwLY= github.com/robfig/cron v1.1.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c h1:ht7N4d/B7Ezf58nvMNVF3OlvDlz9pp+WHVcRNS0nink= github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/seccomp/libseccomp-golang v0.9.1 h1:NJjM5DNFOs0s3kYE1WUOr6G8V97sdt46rlXTMfXGWBo= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= @@ -459,7 +394,6 @@ github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIK github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= @@ -480,25 +414,18 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 h1:b6uOv7YOFK0TYG7HtkIgExQo+2RdLuwRft63jn2HWj8= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/thecodeteam/goscaleio v0.1.0 h1:SB5tO98lawC+UK8ds/U2jyfOCH7GTcFztcF5x9gbut4= github.com/thecodeteam/goscaleio v0.1.0/go.mod h1:68sdkZAsK8bvEwBlbQnlLS+xU+hvLYM/iQ8KXej1AwM= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8 h1:ndzgwNDnKIqyCvHTXaCqh9KlOWKvBry6nuXMJmonVsE= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 h1:3SVOIvH7Ae1KRYyQWRjXWJEA9sS/c/pjvH++55Gr648= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= -github.com/valyala/quicktemplate v1.1.1/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= @@ -525,8 +452,6 @@ go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -golang.org/x/build v0.0.0-20190927031335-2835ba2e683f/go.mod h1:fYw7AShPAhGMdXqA9gRadk/CcMsvLlClpE5oBwnS3dM= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495 h1:I6A9Ag9FpEKOjcKrRNjQkPHawoXIhKyTGfvvjFAiiAk= @@ -535,12 +460,10 @@ golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMx golang.org/x/lint v0.0.0-20190409202823-959b441ac422 h1:QzoH/1pFpZguR8NrRHLcO6jKqfv2zpuSqZLgdm7ZmjI= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= @@ -566,17 +489,14 @@ google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb h1:ADPHZzpzM4tk4V4 google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.0 h1:0HIbH907iBTAntm+88IJV2qmJALDAh8sPekI9Vc1fm0= gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/mcuadros/go-syslog.v2 v2.2.1/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U= @@ -593,13 +513,9 @@ gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/gotestsum v0.3.5 h1:VePOWRsuWFYpfp/G8mbmOZKxO5T3501SEGQRUdvq7h0= -gotest.tools/gotestsum v0.3.5/go.mod h1:Mnf3e5FUzXbkCfynWBGOwLssY7gTQgCHObK9tMpAriY= gotest.tools/v3 v3.0.2 h1:kG1BFyqVHuQoVQiR1bWGnfz/fmHvvuiSPIV7rvl360E= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= -honnef.co/go/tools v0.0.1-2019.2.2 h1:TEgegKbBqByGUb1Coo1pc2qIdf2xw6v0mYyLSYtyopE= -honnef.co/go/tools v0.0.1-2019.2.2/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= k8s.io/gengo v0.0.0-20200205140755-e0e292d8aa12 h1:pZzawYyz6VRNPVYpqGv61LWCimQv1BihyeqFrp50/G4= k8s.io/gengo v0.0.0-20200205140755-e0e292d8aa12/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/heapster v1.2.0-beta.1 h1:lUsE/AHOMHpi3MLlBEkaU8Esxm5QhdyCrv1o7ot0s84= @@ -608,8 +524,6 @@ k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/kube-openapi v0.0.0-20200403204345-e1beb1bd0f35 h1:FDWYFE3itI1G8UFOMjUuLbROZExo+Rrfm/Qaf473rm4= k8s.io/kube-openapi v0.0.0-20200403204345-e1beb1bd0f35/go.mod h1:NwPpO8COeh/j9Q9ModsqBxwHcWDo/PmrJOPyquZCC1A= -k8s.io/repo-infra v0.0.1-alpha.1 h1:2us1n30u3cOcoPsacNfCvCssS9B9Yldr1ZGOdK0728U= -k8s.io/repo-infra v0.0.1-alpha.1/go.mod h1:wO1t9WaB99V80ljbeENTnayuEEwNZt7gECYh/CEyOJ8= k8s.io/system-validators v1.1.2 h1:0xzEb0PqnDnUOuf/2E/gaJBOBN7j+qf0LIn12jw3oc4= k8s.io/system-validators v1.1.2/go.mod h1:bPldcLgkIUK22ALflnsXk8pvkTEndYdNuaHH6gRrl0Q= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89 h1:d4vVOjXm687F1iLSP2q3lyPPuyvTUt3aVoBpi2DqRsU= @@ -619,9 +533,6 @@ modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7 h1:uuHDyjllyzRyCIvvn0OBjiRB0SgBZGqHNYAmjR7fO50= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= @@ -631,6 +542,5 @@ sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJ sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc h1:MksmcCZQWAQJCTA5T0jgI/0sJ51AVm4Z41MrmfczEoc= vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI= diff --git a/hack/jenkins/benchmark-dockerized.sh b/hack/jenkins/benchmark-dockerized.sh index 6a5af932c09..efc7d23c18f 100755 --- a/hack/jenkins/benchmark-dockerized.sh +++ b/hack/jenkins/benchmark-dockerized.sh @@ -43,8 +43,11 @@ export PATH=${GOPATH}/bin:${PWD}/third_party/etcd:/usr/local/go/bin:${PATH} # As individual scripts make use of go modules, they can explicitly set GO111MODULE=on export GO111MODULE=off -go install k8s.io/kubernetes/vendor/github.com/cespare/prettybench -go install k8s.io/kubernetes/vendor/gotest.tools/gotestsum +# Install tools we need +pushd "${KUBE_ROOT}/hack/tools" >/dev/null + GO111MODULE=on go install github.com/cespare/prettybench + GO111MODULE=on go install gotest.tools/gotestsum +popd >/dev/null # Disable the Go race detector. export KUBE_RACE=" " diff --git a/hack/jenkins/test-dockerized.sh b/hack/jenkins/test-dockerized.sh index c55b55284bd..69a9852dacd 100755 --- a/hack/jenkins/test-dockerized.sh +++ b/hack/jenkins/test-dockerized.sh @@ -42,7 +42,10 @@ export PATH=${GOPATH}/bin:${PWD}/third_party/etcd:/usr/local/go/bin:${PATH} # As individual scripts make use of go modules, they can explicitly set GO111MODULE=on export GO111MODULE=off -go install k8s.io/kubernetes/vendor/gotest.tools/gotestsum +# Install tools we need +pushd "./hack/tools" >/dev/null + GO111MODULE=on go install gotest.tools/gotestsum +popd >/dev/null # Enable the Go race detector. export KUBE_RACE=-race diff --git a/hack/make-rules/test.sh b/hack/make-rules/test.sh index cf617c972c6..729b7b3c9ea 100755 --- a/hack/make-rules/test.sh +++ b/hack/make-rules/test.sh @@ -225,8 +225,8 @@ produceJUnitXMLReport() { junit_xml_filename="${junit_filename_prefix}.xml" if ! command -v gotestsum >/dev/null 2>&1; then - kube::log::error "gotestsum not found; please install with " \ - "GO111MODULE=off go install k8s.io/kubernetes/vendor/gotest.tools/gotestsum" + kube::log::error "gotestsum not found; please cd to hack/tools and install with " \ + "GO111MODULE=on go install gotest.tools/gotestsum" return fi gotestsum --junitfile "${junit_xml_filename}" --raw-command cat "${junit_filename_prefix}"*.stdout diff --git a/hack/make-rules/vet.sh b/hack/make-rules/vet.sh index 40ed0c9e5db..81374d8139e 100755 --- a/hack/make-rules/vet.sh +++ b/hack/make-rules/vet.sh @@ -49,7 +49,7 @@ if [[ ${#targets[@]} -eq 0 ]]; then # Do not run on third_party directories or generated client code or build tools. while IFS='' read -r line; do targets+=("${line}") - done < <(go list -e ./... | grep -E -v "/(build|third_party|vendor|staging|clientset_generated)/") + done < <(go list -e ./... | grep -E -v "/(build|third_party|vendor|staging|clientset_generated|hack)/") fi go vet "${goflags[@]:+${goflags[@]}}" "${targets[@]}" diff --git a/hack/tools/.gitignore b/hack/tools/.gitignore new file mode 100644 index 00000000000..48b8bf9072d --- /dev/null +++ b/hack/tools/.gitignore @@ -0,0 +1 @@ +vendor/ diff --git a/hack/tools/LICENSES b/hack/tools/LICENSES new file mode 100644 index 00000000000..4a5a159bcab --- /dev/null +++ b/hack/tools/LICENSES @@ -0,0 +1,1641 @@ + +================================================================================ += vendor/github.com/bazelbuild/bazel-gazelle 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/bazelbuild/bazel-gazelle/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 +================================================================================ + + +================================================================================ += vendor/github.com/bazelbuild/buildtools licensed under: = + +Copyright 2016 Google 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. + += vendor/github.com/bazelbuild/buildtools/LICENSE adb52eb384caedba181cd51fbcdf4b99 +================================================================================ + + +================================================================================ += vendor/github.com/BurntSushi/toml licensed under: = + +The MIT License (MIT) + +Copyright (c) 2013 TOML authors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + += vendor/github.com/BurntSushi/toml/COPYING 9e24c0e2a784c1d1fcabb279f4f107e0 +================================================================================ + + +================================================================================ += vendor/github.com/cespare/prettybench licensed under: = + +Copyright (c) 2014 Caleb Spare + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + += vendor/github.com/cespare/prettybench/LICENSE.txt 673caf450638c643cfede79f39c33087 +================================================================================ + + +================================================================================ += vendor/github.com/client9/misspell licensed under: = + +The MIT License (MIT) + +Copyright (c) 2015-2017 Nick Galbreath + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + += vendor/github.com/client9/misspell/LICENSE 387f6b7d6741c8a7f4f7e3c2bbdf97e4 +================================================================================ + + +================================================================================ += vendor/github.com/fatih/color licensed under: = + +The MIT License (MIT) + +Copyright (c) 2013 Fatih Arslan + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + += vendor/github.com/fatih/color/LICENSE.md 316e6d590bdcde7993fb175662c0dd5a +================================================================================ + + +================================================================================ += vendor/github.com/golang/protobuf licensed under: = + +Copyright 2010 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + += vendor/github.com/golang/protobuf/LICENSE 939cce1ec101726fa754e698ac871622 +================================================================================ + + +================================================================================ += vendor/github.com/jonboulle/clockwork 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/jonboulle/clockwork/LICENSE 136e4f49dbf29942c572a3a8f6e88a77 +================================================================================ + + +================================================================================ += vendor/github.com/mattn/go-colorable licensed under: = + +The MIT License (MIT) + +Copyright (c) 2016 Yasuhiro Matsumoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + += vendor/github.com/mattn/go-colorable/LICENSE 24ce168f90aec2456a73de1839037245 +================================================================================ + + +================================================================================ += vendor/github.com/mattn/go-isatty licensed under: = + +Copyright (c) Yasuhiro MATSUMOTO + +MIT License (Expat) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + += vendor/github.com/mattn/go-isatty/LICENSE f509beadd5a11227c27b5d2ad6c9f2c6 +================================================================================ + + +================================================================================ += vendor/github.com/pelletier/go-toml licensed under: = + +The MIT License (MIT) + +Copyright (c) 2013 - 2017 Thomas Pelletier, Eric Anderton + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + += vendor/github.com/pelletier/go-toml/LICENSE dc9ea87a81f62b8871b2a4158edbfde6 +================================================================================ + + +================================================================================ += vendor/github.com/pkg/errors licensed under: = + +Copyright (c) 2015, Dave Cheney +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + += vendor/github.com/pkg/errors/LICENSE 6fe682a02df52c6653f33bd0f7126b5a +================================================================================ + + +================================================================================ += vendor/github.com/pmezard/go-difflib licensed under: = + +Copyright (c) 2013, Patrick Mezard +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + The names of its contributors may not be used to endorse or promote +products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + += vendor/github.com/pmezard/go-difflib/LICENSE e9a2ebb8de779a07500ddecca806145e +================================================================================ + + +================================================================================ += vendor/github.com/sirupsen/logrus licensed under: = + +The MIT License (MIT) + +Copyright (c) 2014 Simon Eskildsen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + += vendor/github.com/sirupsen/logrus/LICENSE 8dadfef729c08ec4e631c4f6fc5d43a0 +================================================================================ + + +================================================================================ += vendor/github.com/spf13/pflag licensed under: = + +Copyright (c) 2012 Alex Ogier. All rights reserved. +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + += vendor/github.com/spf13/pflag/LICENSE 1e8b7dc8b906737639131047a590f21d +================================================================================ + + +================================================================================ += vendor/golang.org/x/crypto licensed under: = + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + += vendor/golang.org/x/crypto/LICENSE 5d4950ecb7b26d2c5e4e7b4e0dd74707 +================================================================================ + + +================================================================================ += vendor/golang.org/x/lint licensed under: = + +Copyright (c) 2013 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + += vendor/golang.org/x/lint/LICENSE 4c728948788b1a02f33ae4e906546eef +================================================================================ + + +================================================================================ += vendor/golang.org/x/sync licensed under: = + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + += vendor/golang.org/x/sync/LICENSE 5d4950ecb7b26d2c5e4e7b4e0dd74707 +================================================================================ + + +================================================================================ += vendor/golang.org/x/sys licensed under: = + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + += vendor/golang.org/x/sys/LICENSE 5d4950ecb7b26d2c5e4e7b4e0dd74707 +================================================================================ + + +================================================================================ += vendor/golang.org/x/tools licensed under: = + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + += vendor/golang.org/x/tools/LICENSE 5d4950ecb7b26d2c5e4e7b4e0dd74707 +================================================================================ + + +================================================================================ += vendor/gotest.tools licensed under: = + +Copyright 2018 gotest.tools authors + +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/gotest.tools/LICENSE 26d13e18e6e60338287c11c73cc80ff5 +================================================================================ + + +================================================================================ += vendor/gotest.tools/gotestsum 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/gotest.tools/gotestsum/LICENSE 3b83ef96387f14655fc854ddc3c6bd57 +================================================================================ + + +================================================================================ += vendor/honnef.co/go/tools licensed under: = + +Copyright (c) 2016 Dominik Honnef + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + += vendor/honnef.co/go/tools/LICENSE ca0492e2abd2c12b3f3c25d6e33972ad +================================================================================ + + +================================================================================ += vendor/k8s.io/klog 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: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +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 +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/k8s.io/klog/LICENSE 19cbd64715b51267a47bf3750cc6a8a5 +================================================================================ + + +================================================================================ += vendor/k8s.io/repo-infra 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/k8s.io/repo-infra/LICENSE e3fc50a88d0a364313df4b21ef20c29e +================================================================================ + diff --git a/hack/tools/Makefile b/hack/tools/Makefile new file mode 100644 index 00000000000..a68ba568b4c --- /dev/null +++ b/hack/tools/Makefile @@ -0,0 +1,65 @@ +# Copyright 2020 The Kubernetes Authors. +# +# 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. + +export GO111MODULE=on + +GOBIN ?= $(shell go env GOPATH)/bin +DEP_PROGS=\ + $(GOBIN)/buildozer\ + $(GOBIN)/gazelle\ + $(GOBIN)/golint\ + $(GOBIN)/gotestsum\ + $(GOBIN)/kazel\ + $(GOBIN)/misspell\ + $(GOBIN)/prettybench\ + $(GOBIN)/staticcheck\ + +.PHONY: all +all: clean build + +.PHONY: clean +clean: + rm -f $(DEP_PROGS) + rm -rf vendor/ + +.PHONY: build +build: $(DEP_PROGS) + +.PHONY: deps +deps: + go mod vendor + +$(GOBIN)/buildozer: deps + go install github.com/bazelbuild/buildtools/buildozer + +$(GOBIN)/gazelle: deps + go install github.com/bazelbuild/bazel-gazelle/cmd/gazelle + +$(GOBIN)/golint: deps + go install golang.org/x/lint/golint + +$(GOBIN)/gotestsum: deps + go install gotest.tools/gotestsum + +$(GOBIN)/kazel: deps + go install k8s.io/repo-infra/cmd/kazel + +$(GOBIN)/misspell: deps + go install github.com/client9/misspell/cmd/misspell + +$(GOBIN)/prettybench: deps + go install github.com/cespare/prettybench + +$(GOBIN)/staticcheck: deps + go install honnef.co/go/tools/cmd/staticcheck diff --git a/hack/tools/README.md b/hack/tools/README.md new file mode 100644 index 00000000000..292e587b5bf --- /dev/null +++ b/hack/tools/README.md @@ -0,0 +1,5 @@ +This directory contains a stub go module used to track version of development +tools like the ones needed for updating bazel BUILD files. + +Run `make build` to download the dependencies, build the binaries and add +them to your `$GOBIN` directory. diff --git a/hack/tools/go.mod b/hack/tools/go.mod new file mode 100644 index 00000000000..f07b69d9e14 --- /dev/null +++ b/hack/tools/go.mod @@ -0,0 +1,15 @@ +module k8s.io/kubernetes/hack/tools + +go 1.13 + +require ( + github.com/bazelbuild/bazel-gazelle v0.19.1-0.20191105222053-70208cbdc798 + github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89 + github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c + github.com/client9/misspell v0.3.4 + golang.org/x/lint v0.0.0-20190409202823-959b441ac422 + gotest.tools v2.2.0+incompatible + gotest.tools/gotestsum v0.3.5 + honnef.co/go/tools v0.0.1-2019.2.2 + k8s.io/repo-infra v0.0.1-alpha.1 +) diff --git a/hack/tools/go.sum b/hack/tools/go.sum new file mode 100644 index 00000000000..20b637f87eb --- /dev/null +++ b/hack/tools/go.sum @@ -0,0 +1,372 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/OpenPeeDeeP/depguard v1.0.0/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o= +github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us= +github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/bazelbuild/bazel-gazelle v0.18.2/go.mod h1:D0ehMSbS+vesFsLGiD6JXu3mVEzOlfUl8wNnq+x/9p0= +github.com/bazelbuild/bazel-gazelle v0.19.1-0.20191105222053-70208cbdc798 h1:1pcd3bq1rC5X4nz56fdK0oQrz9CZup6DGZl8isCPthk= +github.com/bazelbuild/bazel-gazelle v0.19.1-0.20191105222053-70208cbdc798/go.mod h1:rPwzNHUqEzngx1iVBfO/2X2npKaT3tqPqqHW6rVsn/A= +github.com/bazelbuild/buildtools v0.0.0-20190731111112-f720930ceb60/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= +github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89 h1:3B/ZE1a6eEJ/4Jf/M6RM2KBouN8yKCUcMmXzSyWqa3g= +github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= +github.com/bazelbuild/rules_go v0.0.0-20190719190356-6dae44dc5cab h1:wzbawlkLtl2ze9w/312NHZ84c7kpUCtlkD8HgFY27sw= +github.com/bazelbuild/rules_go v0.0.0-20190719190356-6dae44dc5cab/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c h1:p8i+qCbr/dNhS2FoQhRpSS7X5+IlxTa94nRNYXu4fyo= +github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c/go.mod h1:Xe6ZsFhtM8HrDku0pxJ3/Lr51rwykrzgFwpmTzleatY= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fatih/color v1.6.0 h1:66qjqZk8kalYAvDRtM1AdAJQI0tj4Wrue3Eq3B3pmFU= +github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA= +github.com/go-lintpack/lintpack v0.5.2 h1:DI5mA3+eKdWeJ40nU4d6Wc26qmdG8RCi/btYq0TuRN0= +github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= +github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8= +github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= +github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ= +github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= +github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg= +github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= +github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= +github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk= +github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= +github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks= +github.com/go-toolsmith/pkgload v1.0.0 h1:4DFWWMXVfbcN5So1sBNW9+yeiMqLFGl1wFLTL5R0Tgg= +github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= +github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.0 h1:zKymWyA1TRYvqYrYDrfEMZULyrhcnGY3x7LDKU2XQaA= +github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gogo/protobuf v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.0.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= +github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 h1:YYWNAGTKWhKpcLLt7aSj/odlKrSrelQwlovBpDuf19w= +github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw= +github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= +github.com/golangci/go-tools v0.0.0-20190318055746-e32c54105b7c/go.mod h1:unzUULGw35sjyOYjUt0jMTXqHlZPpPc6e+xfO4cd6mM= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8= +github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee h1:J2XAy40+7yz70uaOiMbNnluTg7gyQhtGqLQncQh+4J8= +github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU= +github.com/golangci/gofmt v0.0.0-20181222123516-0b8337e80d98/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.18.0/go.mod h1:kaqo8l0OZKYPtjNmG4z4HrWLgcYNIJ9B9q3LWri9uLg= +github.com/golangci/gosec v0.0.0-20190211064107-66fb7fc33547/go.mod h1:0qUabqiIQgfmlAmulqxyiGkkyF6/tOGSnY2cnPVwrzU= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc h1:gLLhTLMk2/SutryVJ6D4VZCU3CUqr8YloG7FPIBWFpI= +github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU= +github.com/golangci/lint-1 v0.0.0-20190420132249-ee948d087217/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk= +github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us= +github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg= +github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= +github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3 h1:JVnpOZS+qxli+rgVl98ILOXVNbW+kb5wcxeGx8ShUIw= +github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/kisielk/gotool v0.0.0-20161130080628-0de1eaf82fa3/go.mod h1:jxZFDH7ILpTPQTk+E2s+z4CUas9lVNjIuKR4c5/zKgM= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= +github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= +github.com/nbutton23/zxcvbn-go v0.0.0-20160627004424-a22cb81b2ecd/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/pelletier/go-toml v1.1.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/sirupsen/logrus v1.0.5 h1:8c8b5uO0zS4X6RPl/sd1ENwSkIc0/H2PaHxE3udaE8I= +github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6 h1:hcP1GmhGigz/O7h1WVUM5KklBp1JoNS9FggWKdj/j3s= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sourcegraph/go-diff v0.5.1 h1:gO6i5zugwzo1RVTvgvfwCOSVegNuvnNi6bAD1QCmkHs= +github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE= +github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ultraware/funlen v0.0.1/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/ultraware/funlen v0.0.2 h1:Av96YVBwwNSe4MLR7iI/BIa3VyI7/djnto/pK3Uxbdo= +github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= +github.com/valyala/quicktemplate v1.1.1/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +golang.org/x/build v0.0.0-20190927031335-2835ba2e683f/go.mod h1:fYw7AShPAhGMdXqA9gRadk/CcMsvLlClpE5oBwnS3dM= +golang.org/x/crypto v0.0.0-20180426230345-b49d69b5da94/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190424203555-c05e17bb3b2d/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529 h1:iMGN4xG0cnqj3t+zOM8wUB0BiPKHEwSxEZCvzcbZuvk= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422 h1:QzoH/1pFpZguR8NrRHLcO6jKqfv2zpuSqZLgdm7ZmjI= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/net v0.0.0-20170915142106-8351a756f30f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190502183928-7f726cade0ab/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20171026204733-164713f0dfce/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190122071731-054c452bb702/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20170915090833-1cbadb444a80/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20170915040203-e531a2a1c15f/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190121143147-24cd39ecf745/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190122202912-9c309ee22fab/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190909030654-5b82db07426d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72 h1:bw9doJza/SFBEweII/rHQh338oozWyiFsBRHtrflcws= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gotest.tools v2.1.0+incompatible h1:5USw7CrJBYKqjg9R7QlA6jzqZKEAtvW82aNmsxxGPxw= +gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/gotestsum v0.3.5 h1:VePOWRsuWFYpfp/G8mbmOZKxO5T3501SEGQRUdvq7h0= +gotest.tools/gotestsum v0.3.5/go.mod h1:Mnf3e5FUzXbkCfynWBGOwLssY7gTQgCHObK9tMpAriY= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.2 h1:TEgegKbBqByGUb1Coo1pc2qIdf2xw6v0mYyLSYtyopE= +honnef.co/go/tools v0.0.1-2019.2.2/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/repo-infra v0.0.1-alpha.1 h1:2us1n30u3cOcoPsacNfCvCssS9B9Yldr1ZGOdK0728U= +k8s.io/repo-infra v0.0.1-alpha.1/go.mod h1:wO1t9WaB99V80ljbeENTnayuEEwNZt7gECYh/CEyOJ8= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 h1:JPJh2pk3+X4lXAkZIk2RuE/7/FoK9maXw+TNPJhVS/c= +sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/hack/tools/tools.go b/hack/tools/tools.go new file mode 100644 index 00000000000..21e4c981ba0 --- /dev/null +++ b/hack/tools/tools.go @@ -0,0 +1,36 @@ +/* +Copyright 2019 The Kubernetes Authors. + +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 tools is used to track binary dependencies with go modules +// https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module +package tools + +import ( + // linting tools + _ "github.com/client9/misspell/cmd/misspell" + _ "golang.org/x/lint/golint" + _ "honnef.co/go/tools/cmd/staticcheck" + + // benchmarking tools + _ "github.com/cespare/prettybench" + _ "gotest.tools" + _ "gotest.tools/gotestsum" + + // bazel-related tools + _ "github.com/bazelbuild/bazel-gazelle/cmd/gazelle" + _ "github.com/bazelbuild/buildtools/buildozer" + _ "k8s.io/repo-infra/cmd/kazel" +) diff --git a/hack/update-bazel.sh b/hack/update-bazel.sh index 524a66eccf8..688d442457a 100755 --- a/hack/update-bazel.sh +++ b/hack/update-bazel.sh @@ -24,11 +24,10 @@ source "${KUBE_ROOT}/hack/lib/init.sh" export GOBIN="${KUBE_OUTPUT_BINPATH}" PATH="${GOBIN}:${PATH}" -# Install tools we need, but only from vendor/... -pushd "${KUBE_ROOT}" >/dev/null - GO111MODULE=on GOFLAGS=-mod=vendor go install github.com/bazelbuild/bazel-gazelle/cmd/gazelle - GO111MODULE=on GOFLAGS=-mod=vendor go install github.com/bazelbuild/buildtools/buildozer - GO111MODULE=on GOFLAGS=-mod=vendor go install k8s.io/repo-infra/cmd/kazel +pushd "${KUBE_ROOT}/hack/tools" >/dev/null + GO111MODULE=on go install github.com/bazelbuild/bazel-gazelle/cmd/gazelle + GO111MODULE=on go install github.com/bazelbuild/buildtools/buildozer + GO111MODULE=on go install k8s.io/repo-infra/cmd/kazel popd >/dev/null # Find all of the staging repos. @@ -104,3 +103,6 @@ buildozer -quiet 'set clinkopts select({"@io_bazel_rules_go//go/platform:linux": if [[ $ret != 0 && $ret != 3 ]]; then exit 1 fi + +# Avoid bazel stuff in tools/ directory +rm hack/tools/BUILD diff --git a/hack/update-hack-tools.sh b/hack/update-hack-tools.sh new file mode 100755 index 00000000000..81f58af7f22 --- /dev/null +++ b/hack/update-hack-tools.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +# Copyright 2020 The Kubernetes Authors. +# +# 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. + +set -o errexit +set -o nounset +set -o pipefail + +KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. +source "${KUBE_ROOT}/hack/lib/init.sh" + +# Explicitly opt into go modules, even though we're inside a GOPATH directory +export GO111MODULE=on + +# Detect problematic GOPROXY settings that prevent lookup of dependencies +if [[ "${GOPROXY:-}" == "off" ]]; then + kube::log::error "Cannot run hack/update-hack-tools.sh with \$GOPROXY=off" + exit 1 +fi + +kube::golang::verify_go_version + +pushd "${KUBE_ROOT}/hack/tools" >/dev/null + echo "=== tidying go.mod/go.sum in hack/tools" + go mod edit -fmt + go mod tidy + go mod vendor + + LICENSE_ROOT="${PWD}" VENDOR_LICENSE_FILE="LICENSES" "${KUBE_ROOT}/hack/update-vendor-licenses.sh" + rm -rf vendor +popd >/dev/null diff --git a/hack/update-vendor-licenses.sh b/hack/update-vendor-licenses.sh index 99c3411cfae..908883b2ec7 100755 --- a/hack/update-vendor-licenses.sh +++ b/hack/update-vendor-licenses.sh @@ -153,21 +153,23 @@ fi LICENSE_ROOT="${LICENSE_ROOT:-${KUBE_ROOT}}" cd "${LICENSE_ROOT}" -VENDOR_LICENSE_FILE="Godeps/LICENSES" +VENDOR_LICENSE_FILE="${VENDOR_LICENSE_FILE:-"Godeps/LICENSES"}" TMP_LICENSE_FILE="/tmp/Godeps.LICENSES.$$" DEPS_DIR="vendor" declare -Ag CONTENT -# Put the K8S LICENSE on top -( -echo "================================================================================" -echo "= Kubernetes licensed under: =" -echo -cat "${LICENSE_ROOT}/LICENSE" -echo -echo "= LICENSE $(kube::util::md5 "${LICENSE_ROOT}/LICENSE")" -echo "================================================================================" -) > ${TMP_LICENSE_FILE} +if [[ -f "${LICENSE_ROOT}/LICENSE" ]]; then + # Put the K8S LICENSE on top + ( + echo "================================================================================" + echo "= Kubernetes licensed under: =" + echo + cat "${LICENSE_ROOT}/LICENSE" + echo + echo "= LICENSE $(kube::util::md5 "${LICENSE_ROOT}/LICENSE")" + echo "================================================================================" + ) > ${TMP_LICENSE_FILE} +fi # Loop through every vendored package for PACKAGE in $(go list -m -json all | jq -r .Path | sort -f); do @@ -219,4 +221,4 @@ __EOF__ echo done >> ${TMP_LICENSE_FILE} -cat ${TMP_LICENSE_FILE} > ${VENDOR_LICENSE_FILE} +cat ${TMP_LICENSE_FILE} > "${VENDOR_LICENSE_FILE}" diff --git a/hack/verify-golint.sh b/hack/verify-golint.sh index a42a118afd4..c6f7022bd96 100755 --- a/hack/verify-golint.sh +++ b/hack/verify-golint.sh @@ -33,9 +33,11 @@ kube::golang::verify_go_version export GOBIN="${KUBE_OUTPUT_BINPATH}" PATH="${GOBIN}:${PATH}" -# Install golint from vendor -echo 'installing golint from vendor' -go install k8s.io/kubernetes/vendor/golang.org/x/lint/golint +# Install golint +echo 'installing golint' +pushd "${KUBE_ROOT}/hack/tools" >/dev/null + GO111MODULE=on go install golang.org/x/lint/golint +popd >/dev/null cd "${KUBE_ROOT}" diff --git a/hack/verify-hack-tools.sh b/hack/verify-hack-tools.sh new file mode 100755 index 00000000000..c70436023ff --- /dev/null +++ b/hack/verify-hack-tools.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +# Copyright 2020 The Kubernetes Authors. +# +# 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. + +set -o errexit +set -o nounset +set -o pipefail + +KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. +source "${KUBE_ROOT}/hack/lib/init.sh" + +_tmpdir="$(kube::realpath "$(mktemp -d -t verify-hack-tools.XXXXXX)")" +kube::util::trap_add "rm -rf ${_tmpdir}" EXIT + +_tmp_gopath="${_tmpdir}/go" +_tmp_kuberoot="${_tmp_gopath}/src/k8s.io/kubernetes" +_tmp_hack="${_tmp_gopath}/src/k8s.io/kubernetes/hack" +mkdir -p "${_tmp_hack}/.." +cp -a "${KUBE_ROOT}/hack" "${_tmp_hack}/.." + +pushd "${_tmp_kuberoot}" >/dev/null +./hack/update-hack-tools.sh +popd + +diff=$(diff -Naupr "${KUBE_ROOT}/hack" "${_tmp_kuberoot}/hack" || true) + +if [[ -n "${diff}" ]]; then + echo "${diff}" >&2 + echo >&2 + echo "Run ./hack/update-hack-tools.sh" >&2 + exit 1 +fi diff --git a/hack/verify-spelling.sh b/hack/verify-spelling.sh index ec738bcf2c7..d3c9e9347d3 100755 --- a/hack/verify-spelling.sh +++ b/hack/verify-spelling.sh @@ -29,8 +29,10 @@ source "${KUBE_ROOT}/hack/lib/init.sh" export GOBIN="${KUBE_OUTPUT_BINPATH}" PATH="${GOBIN}:${PATH}" -# Install tools we need, but only from vendor/... -go install k8s.io/kubernetes/vendor/github.com/client9/misspell/cmd/misspell +# Install tools we need +pushd "${KUBE_ROOT}/hack/tools" >/dev/null + GO111MODULE=on go install github.com/client9/misspell/cmd/misspell +popd >/dev/null # Spell checking # All the skipping files are defined in hack/.spelling_failures diff --git a/hack/verify-staticcheck.sh b/hack/verify-staticcheck.sh index d66f4474eba..f9f99a52a20 100755 --- a/hack/verify-staticcheck.sh +++ b/hack/verify-staticcheck.sh @@ -51,9 +51,10 @@ export IFS='|'; ignore_pattern="^(${IGNORE[*]})\$"; unset IFS export GOBIN="${KUBE_OUTPUT_BINPATH}" PATH="${GOBIN}:${PATH}" -# Install staticcheck from vendor -echo 'installing staticcheck from vendor' -go install k8s.io/kubernetes/vendor/honnef.co/go/tools/cmd/staticcheck +# Install staticcheck +pushd "${KUBE_ROOT}/hack/tools" >/dev/null + GO111MODULE=on go install honnef.co/go/tools/cmd/staticcheck +popd >/dev/null cd "${KUBE_ROOT}" @@ -67,7 +68,7 @@ while IFS='' read -r line; do all_packages+=("./$line") done < <( hack/make-rules/helpers/cache_go_dirs.sh "${KUBE_ROOT}/_tmp/all_go_dirs" | grep "^${FOCUS:-.}" | - grep -vE "(third_party|generated|clientset_generated|/_)" | + grep -vE "(third_party|generated|clientset_generated|hack|/_)" | grep -vE "$ignore_pattern" ) failing_packages=() diff --git a/test/typecheck/main.go b/test/typecheck/main.go index 9e073be31f1..9a7f4e34783 100644 --- a/test/typecheck/main.go +++ b/test/typecheck/main.go @@ -82,6 +82,9 @@ var ( // edit/record.go doesn't compile without gopkg.in/yaml.v2 // in $GOSRC/$GOROOT (both typecheck and the shell script). "pkg/kubectl/cmd/testdata/edit", + // Tools we use for maintaining the code base but not necessarily + // ship as part of the release + "hack/tools", } ) diff --git a/vendor/BUILD b/vendor/BUILD index 51da9068e49..435e57763f1 100644 --- a/vendor/BUILD +++ b/vendor/BUILD @@ -21,7 +21,6 @@ filegroup( "//vendor/github.com/Azure/go-autorest/autorest:all-srcs", "//vendor/github.com/Azure/go-autorest/logger:all-srcs", "//vendor/github.com/Azure/go-autorest/tracing:all-srcs", - "//vendor/github.com/BurntSushi/toml:all-srcs", "//vendor/github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud:all-srcs", "//vendor/github.com/JeffAshton/win_pdh:all-srcs", "//vendor/github.com/MakeNowJust/heredoc:all-srcs", @@ -48,36 +47,12 @@ filegroup( "//vendor/github.com/aws/aws-sdk-go/service/elbv2:all-srcs", "//vendor/github.com/aws/aws-sdk-go/service/kms:all-srcs", "//vendor/github.com/aws/aws-sdk-go/service/sts:all-srcs", - "//vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle:all-srcs", - "//vendor/github.com/bazelbuild/bazel-gazelle/config:all-srcs", - "//vendor/github.com/bazelbuild/bazel-gazelle/flag:all-srcs", - "//vendor/github.com/bazelbuild/bazel-gazelle/internal/version:all-srcs", - "//vendor/github.com/bazelbuild/bazel-gazelle/internal/wspace:all-srcs", - "//vendor/github.com/bazelbuild/bazel-gazelle/label:all-srcs", - "//vendor/github.com/bazelbuild/bazel-gazelle/language:all-srcs", - "//vendor/github.com/bazelbuild/bazel-gazelle/merger:all-srcs", - "//vendor/github.com/bazelbuild/bazel-gazelle/pathtools:all-srcs", - "//vendor/github.com/bazelbuild/bazel-gazelle/repo:all-srcs", - "//vendor/github.com/bazelbuild/bazel-gazelle/resolve:all-srcs", - "//vendor/github.com/bazelbuild/bazel-gazelle/rule:all-srcs", - "//vendor/github.com/bazelbuild/bazel-gazelle/walk:all-srcs", - "//vendor/github.com/bazelbuild/buildtools/api_proto:all-srcs", - "//vendor/github.com/bazelbuild/buildtools/build:all-srcs", - "//vendor/github.com/bazelbuild/buildtools/build_proto:all-srcs", - "//vendor/github.com/bazelbuild/buildtools/buildozer:all-srcs", - "//vendor/github.com/bazelbuild/buildtools/edit:all-srcs", - "//vendor/github.com/bazelbuild/buildtools/file:all-srcs", - "//vendor/github.com/bazelbuild/buildtools/lang:all-srcs", - "//vendor/github.com/bazelbuild/buildtools/tables:all-srcs", - "//vendor/github.com/bazelbuild/buildtools/wspace:all-srcs", "//vendor/github.com/beorn7/perks/quantile:all-srcs", "//vendor/github.com/blang/semver:all-srcs", "//vendor/github.com/caddyserver/caddy/caddyfile:all-srcs", - "//vendor/github.com/cespare/prettybench:all-srcs", "//vendor/github.com/chai2010/gettext-go/gettext:all-srcs", "//vendor/github.com/checkpoint-restore/go-criu/rpc:all-srcs", "//vendor/github.com/cilium/ebpf:all-srcs", - "//vendor/github.com/client9/misspell:all-srcs", "//vendor/github.com/clusterhq/flocker-go:all-srcs", "//vendor/github.com/container-storage-interface/spec/lib/go/csi:all-srcs", "//vendor/github.com/containerd/console:all-srcs", @@ -129,7 +104,6 @@ filegroup( "//vendor/github.com/evanphx/json-patch:all-srcs", "//vendor/github.com/exponent-io/jsonpath:all-srcs", "//vendor/github.com/fatih/camelcase:all-srcs", - "//vendor/github.com/fatih/color:all-srcs", "//vendor/github.com/fsnotify/fsnotify:all-srcs", "//vendor/github.com/ghodss/yaml:all-srcs", "//vendor/github.com/go-bindata/go-bindata:all-srcs", @@ -238,8 +212,6 @@ filegroup( "//vendor/github.com/mailru/easyjson/buffer:all-srcs", "//vendor/github.com/mailru/easyjson/jlexer:all-srcs", "//vendor/github.com/mailru/easyjson/jwriter:all-srcs", - "//vendor/github.com/mattn/go-colorable:all-srcs", - "//vendor/github.com/mattn/go-isatty:all-srcs", "//vendor/github.com/matttproud/golang_protobuf_extensions/pbutil:all-srcs", "//vendor/github.com/miekg/dns:all-srcs", "//vendor/github.com/mindprince/gonvml:all-srcs", @@ -357,7 +329,6 @@ filegroup( "//vendor/golang.org/x/crypto/poly1305:all-srcs", "//vendor/golang.org/x/crypto/salsa20/salsa:all-srcs", "//vendor/golang.org/x/crypto/ssh:all-srcs", - "//vendor/golang.org/x/lint:all-srcs", "//vendor/golang.org/x/net/bpf:all-srcs", "//vendor/golang.org/x/net/context:all-srcs", "//vendor/golang.org/x/net/html:all-srcs", @@ -374,7 +345,6 @@ filegroup( "//vendor/golang.org/x/net/trace:all-srcs", "//vendor/golang.org/x/net/websocket:all-srcs", "//vendor/golang.org/x/oauth2:all-srcs", - "//vendor/golang.org/x/sync/errgroup:all-srcs", "//vendor/golang.org/x/sync/singleflight:all-srcs", "//vendor/golang.org/x/sys/cpu:all-srcs", "//vendor/golang.org/x/sys/unix:all-srcs", @@ -393,17 +363,11 @@ filegroup( "//vendor/golang.org/x/time/rate:all-srcs", "//vendor/golang.org/x/tools/benchmark/parse:all-srcs", "//vendor/golang.org/x/tools/container/intsets:all-srcs", - "//vendor/golang.org/x/tools/go/analysis:all-srcs", "//vendor/golang.org/x/tools/go/ast/astutil:all-srcs", - "//vendor/golang.org/x/tools/go/ast/inspector:all-srcs", - "//vendor/golang.org/x/tools/go/buildutil:all-srcs", "//vendor/golang.org/x/tools/go/gcexportdata:all-srcs", "//vendor/golang.org/x/tools/go/internal/gcimporter:all-srcs", "//vendor/golang.org/x/tools/go/internal/packagesdriver:all-srcs", "//vendor/golang.org/x/tools/go/packages:all-srcs", - "//vendor/golang.org/x/tools/go/types/objectpath:all-srcs", - "//vendor/golang.org/x/tools/go/types/typeutil:all-srcs", - "//vendor/golang.org/x/tools/go/vcs:all-srcs", "//vendor/golang.org/x/tools/imports:all-srcs", "//vendor/golang.org/x/tools/internal/fastwalk:all-srcs", "//vendor/golang.org/x/tools/internal/gopathwalk:all-srcs", @@ -448,28 +412,6 @@ filegroup( "//vendor/gopkg.in/tomb.v1:all-srcs", "//vendor/gopkg.in/warnings.v0:all-srcs", "//vendor/gopkg.in/yaml.v2:all-srcs", - "//vendor/gotest.tools:all-srcs", - "//vendor/honnef.co/go/tools/arg:all-srcs", - "//vendor/honnef.co/go/tools/cmd/staticcheck:all-srcs", - "//vendor/honnef.co/go/tools/config:all-srcs", - "//vendor/honnef.co/go/tools/deprecated:all-srcs", - "//vendor/honnef.co/go/tools/facts:all-srcs", - "//vendor/honnef.co/go/tools/functions:all-srcs", - "//vendor/honnef.co/go/tools/go/types/typeutil:all-srcs", - "//vendor/honnef.co/go/tools/internal/cache:all-srcs", - "//vendor/honnef.co/go/tools/internal/passes/buildssa:all-srcs", - "//vendor/honnef.co/go/tools/internal/renameio:all-srcs", - "//vendor/honnef.co/go/tools/internal/sharedcheck:all-srcs", - "//vendor/honnef.co/go/tools/lint:all-srcs", - "//vendor/honnef.co/go/tools/loader:all-srcs", - "//vendor/honnef.co/go/tools/printf:all-srcs", - "//vendor/honnef.co/go/tools/simple:all-srcs", - "//vendor/honnef.co/go/tools/ssa:all-srcs", - "//vendor/honnef.co/go/tools/ssautil:all-srcs", - "//vendor/honnef.co/go/tools/staticcheck:all-srcs", - "//vendor/honnef.co/go/tools/stylecheck:all-srcs", - "//vendor/honnef.co/go/tools/unused:all-srcs", - "//vendor/honnef.co/go/tools/version:all-srcs", "//vendor/k8s.io/gengo/args:all-srcs", "//vendor/k8s.io/gengo/examples/deepcopy-gen/generators:all-srcs", "//vendor/k8s.io/gengo/examples/defaulter-gen/generators:all-srcs", @@ -490,7 +432,6 @@ filegroup( "//vendor/k8s.io/kube-openapi/pkg/handler:all-srcs", "//vendor/k8s.io/kube-openapi/pkg/schemaconv:all-srcs", "//vendor/k8s.io/kube-openapi/pkg/util:all-srcs", - "//vendor/k8s.io/repo-infra/cmd/kazel:all-srcs", "//vendor/k8s.io/system-validators/validators:all-srcs", "//vendor/k8s.io/utils/buffer:all-srcs", "//vendor/k8s.io/utils/clock:all-srcs", diff --git a/vendor/github.com/BurntSushi/toml/.gitignore b/vendor/github.com/BurntSushi/toml/.gitignore deleted file mode 100644 index 0cd3800377d..00000000000 --- a/vendor/github.com/BurntSushi/toml/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -TAGS -tags -.*.swp -tomlcheck/tomlcheck -toml.test diff --git a/vendor/github.com/BurntSushi/toml/.travis.yml b/vendor/github.com/BurntSushi/toml/.travis.yml deleted file mode 100644 index 8b8afc4f0e0..00000000000 --- a/vendor/github.com/BurntSushi/toml/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: go -go: - - 1.1 - - 1.2 - - 1.3 - - 1.4 - - 1.5 - - 1.6 - - tip -install: - - go install ./... - - go get github.com/BurntSushi/toml-test -script: - - export PATH="$PATH:$HOME/gopath/bin" - - make test diff --git a/vendor/github.com/BurntSushi/toml/BUILD b/vendor/github.com/BurntSushi/toml/BUILD deleted file mode 100644 index 5cdb9525c84..00000000000 --- a/vendor/github.com/BurntSushi/toml/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "decode.go", - "decode_meta.go", - "doc.go", - "encode.go", - "encoding_types.go", - "encoding_types_1.1.go", - "lex.go", - "parse.go", - "type_check.go", - "type_fields.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/BurntSushi/toml", - importpath = "github.com/BurntSushi/toml", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/BurntSushi/toml/COMPATIBLE b/vendor/github.com/BurntSushi/toml/COMPATIBLE deleted file mode 100644 index 6efcfd0ce55..00000000000 --- a/vendor/github.com/BurntSushi/toml/COMPATIBLE +++ /dev/null @@ -1,3 +0,0 @@ -Compatible with TOML version -[v0.4.0](https://github.com/toml-lang/toml/blob/v0.4.0/versions/en/toml-v0.4.0.md) - diff --git a/vendor/github.com/BurntSushi/toml/COPYING b/vendor/github.com/BurntSushi/toml/COPYING deleted file mode 100644 index 01b5743200b..00000000000 --- a/vendor/github.com/BurntSushi/toml/COPYING +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 TOML authors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/github.com/BurntSushi/toml/Makefile b/vendor/github.com/BurntSushi/toml/Makefile deleted file mode 100644 index 3600848d331..00000000000 --- a/vendor/github.com/BurntSushi/toml/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -install: - go install ./... - -test: install - go test -v - toml-test toml-test-decoder - toml-test -encoder toml-test-encoder - -fmt: - gofmt -w *.go */*.go - colcheck *.go */*.go - -tags: - find ./ -name '*.go' -print0 | xargs -0 gotags > TAGS - -push: - git push origin master - git push github master - diff --git a/vendor/github.com/BurntSushi/toml/README.md b/vendor/github.com/BurntSushi/toml/README.md deleted file mode 100644 index 7c1b37ecc7a..00000000000 --- a/vendor/github.com/BurntSushi/toml/README.md +++ /dev/null @@ -1,218 +0,0 @@ -## TOML parser and encoder for Go with reflection - -TOML stands for Tom's Obvious, Minimal Language. This Go package provides a -reflection interface similar to Go's standard library `json` and `xml` -packages. This package also supports the `encoding.TextUnmarshaler` and -`encoding.TextMarshaler` interfaces so that you can define custom data -representations. (There is an example of this below.) - -Spec: https://github.com/toml-lang/toml - -Compatible with TOML version -[v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md) - -Documentation: https://godoc.org/github.com/BurntSushi/toml - -Installation: - -```bash -go get github.com/BurntSushi/toml -``` - -Try the toml validator: - -```bash -go get github.com/BurntSushi/toml/cmd/tomlv -tomlv some-toml-file.toml -``` - -[![Build Status](https://travis-ci.org/BurntSushi/toml.svg?branch=master)](https://travis-ci.org/BurntSushi/toml) [![GoDoc](https://godoc.org/github.com/BurntSushi/toml?status.svg)](https://godoc.org/github.com/BurntSushi/toml) - -### Testing - -This package passes all tests in -[toml-test](https://github.com/BurntSushi/toml-test) for both the decoder -and the encoder. - -### Examples - -This package works similarly to how the Go standard library handles `XML` -and `JSON`. Namely, data is loaded into Go values via reflection. - -For the simplest example, consider some TOML file as just a list of keys -and values: - -```toml -Age = 25 -Cats = [ "Cauchy", "Plato" ] -Pi = 3.14 -Perfection = [ 6, 28, 496, 8128 ] -DOB = 1987-07-05T05:45:00Z -``` - -Which could be defined in Go as: - -```go -type Config struct { - Age int - Cats []string - Pi float64 - Perfection []int - DOB time.Time // requires `import time` -} -``` - -And then decoded with: - -```go -var conf Config -if _, err := toml.Decode(tomlData, &conf); err != nil { - // handle error -} -``` - -You can also use struct tags if your struct field name doesn't map to a TOML -key value directly: - -```toml -some_key_NAME = "wat" -``` - -```go -type TOML struct { - ObscureKey string `toml:"some_key_NAME"` -} -``` - -### Using the `encoding.TextUnmarshaler` interface - -Here's an example that automatically parses duration strings into -`time.Duration` values: - -```toml -[[song]] -name = "Thunder Road" -duration = "4m49s" - -[[song]] -name = "Stairway to Heaven" -duration = "8m03s" -``` - -Which can be decoded with: - -```go -type song struct { - Name string - Duration duration -} -type songs struct { - Song []song -} -var favorites songs -if _, err := toml.Decode(blob, &favorites); err != nil { - log.Fatal(err) -} - -for _, s := range favorites.Song { - fmt.Printf("%s (%s)\n", s.Name, s.Duration) -} -``` - -And you'll also need a `duration` type that satisfies the -`encoding.TextUnmarshaler` interface: - -```go -type duration struct { - time.Duration -} - -func (d *duration) UnmarshalText(text []byte) error { - var err error - d.Duration, err = time.ParseDuration(string(text)) - return err -} -``` - -### More complex usage - -Here's an example of how to load the example from the official spec page: - -```toml -# This is a TOML document. Boom. - -title = "TOML Example" - -[owner] -name = "Tom Preston-Werner" -organization = "GitHub" -bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." -dob = 1979-05-27T07:32:00Z # First class dates? Why not? - -[database] -server = "192.168.1.1" -ports = [ 8001, 8001, 8002 ] -connection_max = 5000 -enabled = true - -[servers] - - # You can indent as you please. Tabs or spaces. TOML don't care. - [servers.alpha] - ip = "10.0.0.1" - dc = "eqdc10" - - [servers.beta] - ip = "10.0.0.2" - dc = "eqdc10" - -[clients] -data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it - -# Line breaks are OK when inside arrays -hosts = [ - "alpha", - "omega" -] -``` - -And the corresponding Go types are: - -```go -type tomlConfig struct { - Title string - Owner ownerInfo - DB database `toml:"database"` - Servers map[string]server - Clients clients -} - -type ownerInfo struct { - Name string - Org string `toml:"organization"` - Bio string - DOB time.Time -} - -type database struct { - Server string - Ports []int - ConnMax int `toml:"connection_max"` - Enabled bool -} - -type server struct { - IP string - DC string -} - -type clients struct { - Data [][]interface{} - Hosts []string -} -``` - -Note that a case insensitive match will be tried if an exact match can't be -found. - -A working example of the above can be found in `_examples/example.{go,toml}`. diff --git a/vendor/github.com/BurntSushi/toml/decode.go b/vendor/github.com/BurntSushi/toml/decode.go deleted file mode 100644 index b0fd51d5b6e..00000000000 --- a/vendor/github.com/BurntSushi/toml/decode.go +++ /dev/null @@ -1,509 +0,0 @@ -package toml - -import ( - "fmt" - "io" - "io/ioutil" - "math" - "reflect" - "strings" - "time" -) - -func e(format string, args ...interface{}) error { - return fmt.Errorf("toml: "+format, args...) -} - -// Unmarshaler is the interface implemented by objects that can unmarshal a -// TOML description of themselves. -type Unmarshaler interface { - UnmarshalTOML(interface{}) error -} - -// Unmarshal decodes the contents of `p` in TOML format into a pointer `v`. -func Unmarshal(p []byte, v interface{}) error { - _, err := Decode(string(p), v) - return err -} - -// Primitive is a TOML value that hasn't been decoded into a Go value. -// When using the various `Decode*` functions, the type `Primitive` may -// be given to any value, and its decoding will be delayed. -// -// A `Primitive` value can be decoded using the `PrimitiveDecode` function. -// -// The underlying representation of a `Primitive` value is subject to change. -// Do not rely on it. -// -// N.B. Primitive values are still parsed, so using them will only avoid -// the overhead of reflection. They can be useful when you don't know the -// exact type of TOML data until run time. -type Primitive struct { - undecoded interface{} - context Key -} - -// DEPRECATED! -// -// Use MetaData.PrimitiveDecode instead. -func PrimitiveDecode(primValue Primitive, v interface{}) error { - md := MetaData{decoded: make(map[string]bool)} - return md.unify(primValue.undecoded, rvalue(v)) -} - -// PrimitiveDecode is just like the other `Decode*` functions, except it -// decodes a TOML value that has already been parsed. Valid primitive values -// can *only* be obtained from values filled by the decoder functions, -// including this method. (i.e., `v` may contain more `Primitive` -// values.) -// -// Meta data for primitive values is included in the meta data returned by -// the `Decode*` functions with one exception: keys returned by the Undecoded -// method will only reflect keys that were decoded. Namely, any keys hidden -// behind a Primitive will be considered undecoded. Executing this method will -// update the undecoded keys in the meta data. (See the example.) -func (md *MetaData) PrimitiveDecode(primValue Primitive, v interface{}) error { - md.context = primValue.context - defer func() { md.context = nil }() - return md.unify(primValue.undecoded, rvalue(v)) -} - -// Decode will decode the contents of `data` in TOML format into a pointer -// `v`. -// -// TOML hashes correspond to Go structs or maps. (Dealer's choice. They can be -// used interchangeably.) -// -// TOML arrays of tables correspond to either a slice of structs or a slice -// of maps. -// -// TOML datetimes correspond to Go `time.Time` values. -// -// All other TOML types (float, string, int, bool and array) correspond -// to the obvious Go types. -// -// An exception to the above rules is if a type implements the -// encoding.TextUnmarshaler interface. In this case, any primitive TOML value -// (floats, strings, integers, booleans and datetimes) will be converted to -// a byte string and given to the value's UnmarshalText method. See the -// Unmarshaler example for a demonstration with time duration strings. -// -// Key mapping -// -// TOML keys can map to either keys in a Go map or field names in a Go -// struct. The special `toml` struct tag may be used to map TOML keys to -// struct fields that don't match the key name exactly. (See the example.) -// A case insensitive match to struct names will be tried if an exact match -// can't be found. -// -// The mapping between TOML values and Go values is loose. That is, there -// may exist TOML values that cannot be placed into your representation, and -// there may be parts of your representation that do not correspond to -// TOML values. This loose mapping can be made stricter by using the IsDefined -// and/or Undecoded methods on the MetaData returned. -// -// This decoder will not handle cyclic types. If a cyclic type is passed, -// `Decode` will not terminate. -func Decode(data string, v interface{}) (MetaData, error) { - rv := reflect.ValueOf(v) - if rv.Kind() != reflect.Ptr { - return MetaData{}, e("Decode of non-pointer %s", reflect.TypeOf(v)) - } - if rv.IsNil() { - return MetaData{}, e("Decode of nil %s", reflect.TypeOf(v)) - } - p, err := parse(data) - if err != nil { - return MetaData{}, err - } - md := MetaData{ - p.mapping, p.types, p.ordered, - make(map[string]bool, len(p.ordered)), nil, - } - return md, md.unify(p.mapping, indirect(rv)) -} - -// DecodeFile is just like Decode, except it will automatically read the -// contents of the file at `fpath` and decode it for you. -func DecodeFile(fpath string, v interface{}) (MetaData, error) { - bs, err := ioutil.ReadFile(fpath) - if err != nil { - return MetaData{}, err - } - return Decode(string(bs), v) -} - -// DecodeReader is just like Decode, except it will consume all bytes -// from the reader and decode it for you. -func DecodeReader(r io.Reader, v interface{}) (MetaData, error) { - bs, err := ioutil.ReadAll(r) - if err != nil { - return MetaData{}, err - } - return Decode(string(bs), v) -} - -// unify performs a sort of type unification based on the structure of `rv`, -// which is the client representation. -// -// Any type mismatch produces an error. Finding a type that we don't know -// how to handle produces an unsupported type error. -func (md *MetaData) unify(data interface{}, rv reflect.Value) error { - - // Special case. Look for a `Primitive` value. - if rv.Type() == reflect.TypeOf((*Primitive)(nil)).Elem() { - // Save the undecoded data and the key context into the primitive - // value. - context := make(Key, len(md.context)) - copy(context, md.context) - rv.Set(reflect.ValueOf(Primitive{ - undecoded: data, - context: context, - })) - return nil - } - - // Special case. Unmarshaler Interface support. - if rv.CanAddr() { - if v, ok := rv.Addr().Interface().(Unmarshaler); ok { - return v.UnmarshalTOML(data) - } - } - - // Special case. Handle time.Time values specifically. - // TODO: Remove this code when we decide to drop support for Go 1.1. - // This isn't necessary in Go 1.2 because time.Time satisfies the encoding - // interfaces. - if rv.Type().AssignableTo(rvalue(time.Time{}).Type()) { - return md.unifyDatetime(data, rv) - } - - // Special case. Look for a value satisfying the TextUnmarshaler interface. - if v, ok := rv.Interface().(TextUnmarshaler); ok { - return md.unifyText(data, v) - } - // BUG(burntsushi) - // The behavior here is incorrect whenever a Go type satisfies the - // encoding.TextUnmarshaler interface but also corresponds to a TOML - // hash or array. In particular, the unmarshaler should only be applied - // to primitive TOML values. But at this point, it will be applied to - // all kinds of values and produce an incorrect error whenever those values - // are hashes or arrays (including arrays of tables). - - k := rv.Kind() - - // laziness - if k >= reflect.Int && k <= reflect.Uint64 { - return md.unifyInt(data, rv) - } - switch k { - case reflect.Ptr: - elem := reflect.New(rv.Type().Elem()) - err := md.unify(data, reflect.Indirect(elem)) - if err != nil { - return err - } - rv.Set(elem) - return nil - case reflect.Struct: - return md.unifyStruct(data, rv) - case reflect.Map: - return md.unifyMap(data, rv) - case reflect.Array: - return md.unifyArray(data, rv) - case reflect.Slice: - return md.unifySlice(data, rv) - case reflect.String: - return md.unifyString(data, rv) - case reflect.Bool: - return md.unifyBool(data, rv) - case reflect.Interface: - // we only support empty interfaces. - if rv.NumMethod() > 0 { - return e("unsupported type %s", rv.Type()) - } - return md.unifyAnything(data, rv) - case reflect.Float32: - fallthrough - case reflect.Float64: - return md.unifyFloat64(data, rv) - } - return e("unsupported type %s", rv.Kind()) -} - -func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error { - tmap, ok := mapping.(map[string]interface{}) - if !ok { - if mapping == nil { - return nil - } - return e("type mismatch for %s: expected table but found %T", - rv.Type().String(), mapping) - } - - for key, datum := range tmap { - var f *field - fields := cachedTypeFields(rv.Type()) - for i := range fields { - ff := &fields[i] - if ff.name == key { - f = ff - break - } - if f == nil && strings.EqualFold(ff.name, key) { - f = ff - } - } - if f != nil { - subv := rv - for _, i := range f.index { - subv = indirect(subv.Field(i)) - } - if isUnifiable(subv) { - md.decoded[md.context.add(key).String()] = true - md.context = append(md.context, key) - if err := md.unify(datum, subv); err != nil { - return err - } - md.context = md.context[0 : len(md.context)-1] - } else if f.name != "" { - // Bad user! No soup for you! - return e("cannot write unexported field %s.%s", - rv.Type().String(), f.name) - } - } - } - return nil -} - -func (md *MetaData) unifyMap(mapping interface{}, rv reflect.Value) error { - tmap, ok := mapping.(map[string]interface{}) - if !ok { - if tmap == nil { - return nil - } - return badtype("map", mapping) - } - if rv.IsNil() { - rv.Set(reflect.MakeMap(rv.Type())) - } - for k, v := range tmap { - md.decoded[md.context.add(k).String()] = true - md.context = append(md.context, k) - - rvkey := indirect(reflect.New(rv.Type().Key())) - rvval := reflect.Indirect(reflect.New(rv.Type().Elem())) - if err := md.unify(v, rvval); err != nil { - return err - } - md.context = md.context[0 : len(md.context)-1] - - rvkey.SetString(k) - rv.SetMapIndex(rvkey, rvval) - } - return nil -} - -func (md *MetaData) unifyArray(data interface{}, rv reflect.Value) error { - datav := reflect.ValueOf(data) - if datav.Kind() != reflect.Slice { - if !datav.IsValid() { - return nil - } - return badtype("slice", data) - } - sliceLen := datav.Len() - if sliceLen != rv.Len() { - return e("expected array length %d; got TOML array of length %d", - rv.Len(), sliceLen) - } - return md.unifySliceArray(datav, rv) -} - -func (md *MetaData) unifySlice(data interface{}, rv reflect.Value) error { - datav := reflect.ValueOf(data) - if datav.Kind() != reflect.Slice { - if !datav.IsValid() { - return nil - } - return badtype("slice", data) - } - n := datav.Len() - if rv.IsNil() || rv.Cap() < n { - rv.Set(reflect.MakeSlice(rv.Type(), n, n)) - } - rv.SetLen(n) - return md.unifySliceArray(datav, rv) -} - -func (md *MetaData) unifySliceArray(data, rv reflect.Value) error { - sliceLen := data.Len() - for i := 0; i < sliceLen; i++ { - v := data.Index(i).Interface() - sliceval := indirect(rv.Index(i)) - if err := md.unify(v, sliceval); err != nil { - return err - } - } - return nil -} - -func (md *MetaData) unifyDatetime(data interface{}, rv reflect.Value) error { - if _, ok := data.(time.Time); ok { - rv.Set(reflect.ValueOf(data)) - return nil - } - return badtype("time.Time", data) -} - -func (md *MetaData) unifyString(data interface{}, rv reflect.Value) error { - if s, ok := data.(string); ok { - rv.SetString(s) - return nil - } - return badtype("string", data) -} - -func (md *MetaData) unifyFloat64(data interface{}, rv reflect.Value) error { - if num, ok := data.(float64); ok { - switch rv.Kind() { - case reflect.Float32: - fallthrough - case reflect.Float64: - rv.SetFloat(num) - default: - panic("bug") - } - return nil - } - return badtype("float", data) -} - -func (md *MetaData) unifyInt(data interface{}, rv reflect.Value) error { - if num, ok := data.(int64); ok { - if rv.Kind() >= reflect.Int && rv.Kind() <= reflect.Int64 { - switch rv.Kind() { - case reflect.Int, reflect.Int64: - // No bounds checking necessary. - case reflect.Int8: - if num < math.MinInt8 || num > math.MaxInt8 { - return e("value %d is out of range for int8", num) - } - case reflect.Int16: - if num < math.MinInt16 || num > math.MaxInt16 { - return e("value %d is out of range for int16", num) - } - case reflect.Int32: - if num < math.MinInt32 || num > math.MaxInt32 { - return e("value %d is out of range for int32", num) - } - } - rv.SetInt(num) - } else if rv.Kind() >= reflect.Uint && rv.Kind() <= reflect.Uint64 { - unum := uint64(num) - switch rv.Kind() { - case reflect.Uint, reflect.Uint64: - // No bounds checking necessary. - case reflect.Uint8: - if num < 0 || unum > math.MaxUint8 { - return e("value %d is out of range for uint8", num) - } - case reflect.Uint16: - if num < 0 || unum > math.MaxUint16 { - return e("value %d is out of range for uint16", num) - } - case reflect.Uint32: - if num < 0 || unum > math.MaxUint32 { - return e("value %d is out of range for uint32", num) - } - } - rv.SetUint(unum) - } else { - panic("unreachable") - } - return nil - } - return badtype("integer", data) -} - -func (md *MetaData) unifyBool(data interface{}, rv reflect.Value) error { - if b, ok := data.(bool); ok { - rv.SetBool(b) - return nil - } - return badtype("boolean", data) -} - -func (md *MetaData) unifyAnything(data interface{}, rv reflect.Value) error { - rv.Set(reflect.ValueOf(data)) - return nil -} - -func (md *MetaData) unifyText(data interface{}, v TextUnmarshaler) error { - var s string - switch sdata := data.(type) { - case TextMarshaler: - text, err := sdata.MarshalText() - if err != nil { - return err - } - s = string(text) - case fmt.Stringer: - s = sdata.String() - case string: - s = sdata - case bool: - s = fmt.Sprintf("%v", sdata) - case int64: - s = fmt.Sprintf("%d", sdata) - case float64: - s = fmt.Sprintf("%f", sdata) - default: - return badtype("primitive (string-like)", data) - } - if err := v.UnmarshalText([]byte(s)); err != nil { - return err - } - return nil -} - -// rvalue returns a reflect.Value of `v`. All pointers are resolved. -func rvalue(v interface{}) reflect.Value { - return indirect(reflect.ValueOf(v)) -} - -// indirect returns the value pointed to by a pointer. -// Pointers are followed until the value is not a pointer. -// New values are allocated for each nil pointer. -// -// An exception to this rule is if the value satisfies an interface of -// interest to us (like encoding.TextUnmarshaler). -func indirect(v reflect.Value) reflect.Value { - if v.Kind() != reflect.Ptr { - if v.CanSet() { - pv := v.Addr() - if _, ok := pv.Interface().(TextUnmarshaler); ok { - return pv - } - } - return v - } - if v.IsNil() { - v.Set(reflect.New(v.Type().Elem())) - } - return indirect(reflect.Indirect(v)) -} - -func isUnifiable(rv reflect.Value) bool { - if rv.CanSet() { - return true - } - if _, ok := rv.Interface().(TextUnmarshaler); ok { - return true - } - return false -} - -func badtype(expected string, data interface{}) error { - return e("cannot load TOML value of type %T into a Go %s", data, expected) -} diff --git a/vendor/github.com/BurntSushi/toml/decode_meta.go b/vendor/github.com/BurntSushi/toml/decode_meta.go deleted file mode 100644 index b9914a6798c..00000000000 --- a/vendor/github.com/BurntSushi/toml/decode_meta.go +++ /dev/null @@ -1,121 +0,0 @@ -package toml - -import "strings" - -// MetaData allows access to meta information about TOML data that may not -// be inferrable via reflection. In particular, whether a key has been defined -// and the TOML type of a key. -type MetaData struct { - mapping map[string]interface{} - types map[string]tomlType - keys []Key - decoded map[string]bool - context Key // Used only during decoding. -} - -// IsDefined returns true if the key given exists in the TOML data. The key -// should be specified hierarchially. e.g., -// -// // access the TOML key 'a.b.c' -// IsDefined("a", "b", "c") -// -// IsDefined will return false if an empty key given. Keys are case sensitive. -func (md *MetaData) IsDefined(key ...string) bool { - if len(key) == 0 { - return false - } - - var hash map[string]interface{} - var ok bool - var hashOrVal interface{} = md.mapping - for _, k := range key { - if hash, ok = hashOrVal.(map[string]interface{}); !ok { - return false - } - if hashOrVal, ok = hash[k]; !ok { - return false - } - } - return true -} - -// Type returns a string representation of the type of the key specified. -// -// Type will return the empty string if given an empty key or a key that -// does not exist. Keys are case sensitive. -func (md *MetaData) Type(key ...string) string { - fullkey := strings.Join(key, ".") - if typ, ok := md.types[fullkey]; ok { - return typ.typeString() - } - return "" -} - -// Key is the type of any TOML key, including key groups. Use (MetaData).Keys -// to get values of this type. -type Key []string - -func (k Key) String() string { - return strings.Join(k, ".") -} - -func (k Key) maybeQuotedAll() string { - var ss []string - for i := range k { - ss = append(ss, k.maybeQuoted(i)) - } - return strings.Join(ss, ".") -} - -func (k Key) maybeQuoted(i int) string { - quote := false - for _, c := range k[i] { - if !isBareKeyChar(c) { - quote = true - break - } - } - if quote { - return "\"" + strings.Replace(k[i], "\"", "\\\"", -1) + "\"" - } - return k[i] -} - -func (k Key) add(piece string) Key { - newKey := make(Key, len(k)+1) - copy(newKey, k) - newKey[len(k)] = piece - return newKey -} - -// Keys returns a slice of every key in the TOML data, including key groups. -// Each key is itself a slice, where the first element is the top of the -// hierarchy and the last is the most specific. -// -// The list will have the same order as the keys appeared in the TOML data. -// -// All keys returned are non-empty. -func (md *MetaData) Keys() []Key { - return md.keys -} - -// Undecoded returns all keys that have not been decoded in the order in which -// they appear in the original TOML document. -// -// This includes keys that haven't been decoded because of a Primitive value. -// Once the Primitive value is decoded, the keys will be considered decoded. -// -// Also note that decoding into an empty interface will result in no decoding, -// and so no keys will be considered decoded. -// -// In this sense, the Undecoded keys correspond to keys in the TOML document -// that do not have a concrete type in your representation. -func (md *MetaData) Undecoded() []Key { - undecoded := make([]Key, 0, len(md.keys)) - for _, key := range md.keys { - if !md.decoded[key.String()] { - undecoded = append(undecoded, key) - } - } - return undecoded -} diff --git a/vendor/github.com/BurntSushi/toml/doc.go b/vendor/github.com/BurntSushi/toml/doc.go deleted file mode 100644 index b371f396edc..00000000000 --- a/vendor/github.com/BurntSushi/toml/doc.go +++ /dev/null @@ -1,27 +0,0 @@ -/* -Package toml provides facilities for decoding and encoding TOML configuration -files via reflection. There is also support for delaying decoding with -the Primitive type, and querying the set of keys in a TOML document with the -MetaData type. - -The specification implemented: https://github.com/toml-lang/toml - -The sub-command github.com/BurntSushi/toml/cmd/tomlv can be used to verify -whether a file is a valid TOML document. It can also be used to print the -type of each key in a TOML document. - -Testing - -There are two important types of tests used for this package. The first is -contained inside '*_test.go' files and uses the standard Go unit testing -framework. These tests are primarily devoted to holistically testing the -decoder and encoder. - -The second type of testing is used to verify the implementation's adherence -to the TOML specification. These tests have been factored into their own -project: https://github.com/BurntSushi/toml-test - -The reason the tests are in a separate project is so that they can be used by -any implementation of TOML. Namely, it is language agnostic. -*/ -package toml diff --git a/vendor/github.com/BurntSushi/toml/encode.go b/vendor/github.com/BurntSushi/toml/encode.go deleted file mode 100644 index d905c21a246..00000000000 --- a/vendor/github.com/BurntSushi/toml/encode.go +++ /dev/null @@ -1,568 +0,0 @@ -package toml - -import ( - "bufio" - "errors" - "fmt" - "io" - "reflect" - "sort" - "strconv" - "strings" - "time" -) - -type tomlEncodeError struct{ error } - -var ( - errArrayMixedElementTypes = errors.New( - "toml: cannot encode array with mixed element types") - errArrayNilElement = errors.New( - "toml: cannot encode array with nil element") - errNonString = errors.New( - "toml: cannot encode a map with non-string key type") - errAnonNonStruct = errors.New( - "toml: cannot encode an anonymous field that is not a struct") - errArrayNoTable = errors.New( - "toml: TOML array element cannot contain a table") - errNoKey = errors.New( - "toml: top-level values must be Go maps or structs") - errAnything = errors.New("") // used in testing -) - -var quotedReplacer = strings.NewReplacer( - "\t", "\\t", - "\n", "\\n", - "\r", "\\r", - "\"", "\\\"", - "\\", "\\\\", -) - -// Encoder controls the encoding of Go values to a TOML document to some -// io.Writer. -// -// The indentation level can be controlled with the Indent field. -type Encoder struct { - // A single indentation level. By default it is two spaces. - Indent string - - // hasWritten is whether we have written any output to w yet. - hasWritten bool - w *bufio.Writer -} - -// NewEncoder returns a TOML encoder that encodes Go values to the io.Writer -// given. By default, a single indentation level is 2 spaces. -func NewEncoder(w io.Writer) *Encoder { - return &Encoder{ - w: bufio.NewWriter(w), - Indent: " ", - } -} - -// Encode writes a TOML representation of the Go value to the underlying -// io.Writer. If the value given cannot be encoded to a valid TOML document, -// then an error is returned. -// -// The mapping between Go values and TOML values should be precisely the same -// as for the Decode* functions. Similarly, the TextMarshaler interface is -// supported by encoding the resulting bytes as strings. (If you want to write -// arbitrary binary data then you will need to use something like base64 since -// TOML does not have any binary types.) -// -// When encoding TOML hashes (i.e., Go maps or structs), keys without any -// sub-hashes are encoded first. -// -// If a Go map is encoded, then its keys are sorted alphabetically for -// deterministic output. More control over this behavior may be provided if -// there is demand for it. -// -// Encoding Go values without a corresponding TOML representation---like map -// types with non-string keys---will cause an error to be returned. Similarly -// for mixed arrays/slices, arrays/slices with nil elements, embedded -// non-struct types and nested slices containing maps or structs. -// (e.g., [][]map[string]string is not allowed but []map[string]string is OK -// and so is []map[string][]string.) -func (enc *Encoder) Encode(v interface{}) error { - rv := eindirect(reflect.ValueOf(v)) - if err := enc.safeEncode(Key([]string{}), rv); err != nil { - return err - } - return enc.w.Flush() -} - -func (enc *Encoder) safeEncode(key Key, rv reflect.Value) (err error) { - defer func() { - if r := recover(); r != nil { - if terr, ok := r.(tomlEncodeError); ok { - err = terr.error - return - } - panic(r) - } - }() - enc.encode(key, rv) - return nil -} - -func (enc *Encoder) encode(key Key, rv reflect.Value) { - // Special case. Time needs to be in ISO8601 format. - // Special case. If we can marshal the type to text, then we used that. - // Basically, this prevents the encoder for handling these types as - // generic structs (or whatever the underlying type of a TextMarshaler is). - switch rv.Interface().(type) { - case time.Time, TextMarshaler: - enc.keyEqElement(key, rv) - return - } - - k := rv.Kind() - switch k { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, - reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, - reflect.Uint64, - reflect.Float32, reflect.Float64, reflect.String, reflect.Bool: - enc.keyEqElement(key, rv) - case reflect.Array, reflect.Slice: - if typeEqual(tomlArrayHash, tomlTypeOfGo(rv)) { - enc.eArrayOfTables(key, rv) - } else { - enc.keyEqElement(key, rv) - } - case reflect.Interface: - if rv.IsNil() { - return - } - enc.encode(key, rv.Elem()) - case reflect.Map: - if rv.IsNil() { - return - } - enc.eTable(key, rv) - case reflect.Ptr: - if rv.IsNil() { - return - } - enc.encode(key, rv.Elem()) - case reflect.Struct: - enc.eTable(key, rv) - default: - panic(e("unsupported type for key '%s': %s", key, k)) - } -} - -// eElement encodes any value that can be an array element (primitives and -// arrays). -func (enc *Encoder) eElement(rv reflect.Value) { - switch v := rv.Interface().(type) { - case time.Time: - // Special case time.Time as a primitive. Has to come before - // TextMarshaler below because time.Time implements - // encoding.TextMarshaler, but we need to always use UTC. - enc.wf(v.UTC().Format("2006-01-02T15:04:05Z")) - return - case TextMarshaler: - // Special case. Use text marshaler if it's available for this value. - if s, err := v.MarshalText(); err != nil { - encPanic(err) - } else { - enc.writeQuoted(string(s)) - } - return - } - switch rv.Kind() { - case reflect.Bool: - enc.wf(strconv.FormatBool(rv.Bool())) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, - reflect.Int64: - enc.wf(strconv.FormatInt(rv.Int(), 10)) - case reflect.Uint, reflect.Uint8, reflect.Uint16, - reflect.Uint32, reflect.Uint64: - enc.wf(strconv.FormatUint(rv.Uint(), 10)) - case reflect.Float32: - enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 32))) - case reflect.Float64: - enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 64))) - case reflect.Array, reflect.Slice: - enc.eArrayOrSliceElement(rv) - case reflect.Interface: - enc.eElement(rv.Elem()) - case reflect.String: - enc.writeQuoted(rv.String()) - default: - panic(e("unexpected primitive type: %s", rv.Kind())) - } -} - -// By the TOML spec, all floats must have a decimal with at least one -// number on either side. -func floatAddDecimal(fstr string) string { - if !strings.Contains(fstr, ".") { - return fstr + ".0" - } - return fstr -} - -func (enc *Encoder) writeQuoted(s string) { - enc.wf("\"%s\"", quotedReplacer.Replace(s)) -} - -func (enc *Encoder) eArrayOrSliceElement(rv reflect.Value) { - length := rv.Len() - enc.wf("[") - for i := 0; i < length; i++ { - elem := rv.Index(i) - enc.eElement(elem) - if i != length-1 { - enc.wf(", ") - } - } - enc.wf("]") -} - -func (enc *Encoder) eArrayOfTables(key Key, rv reflect.Value) { - if len(key) == 0 { - encPanic(errNoKey) - } - for i := 0; i < rv.Len(); i++ { - trv := rv.Index(i) - if isNil(trv) { - continue - } - panicIfInvalidKey(key) - enc.newline() - enc.wf("%s[[%s]]", enc.indentStr(key), key.maybeQuotedAll()) - enc.newline() - enc.eMapOrStruct(key, trv) - } -} - -func (enc *Encoder) eTable(key Key, rv reflect.Value) { - panicIfInvalidKey(key) - if len(key) == 1 { - // Output an extra newline between top-level tables. - // (The newline isn't written if nothing else has been written though.) - enc.newline() - } - if len(key) > 0 { - enc.wf("%s[%s]", enc.indentStr(key), key.maybeQuotedAll()) - enc.newline() - } - enc.eMapOrStruct(key, rv) -} - -func (enc *Encoder) eMapOrStruct(key Key, rv reflect.Value) { - switch rv := eindirect(rv); rv.Kind() { - case reflect.Map: - enc.eMap(key, rv) - case reflect.Struct: - enc.eStruct(key, rv) - default: - panic("eTable: unhandled reflect.Value Kind: " + rv.Kind().String()) - } -} - -func (enc *Encoder) eMap(key Key, rv reflect.Value) { - rt := rv.Type() - if rt.Key().Kind() != reflect.String { - encPanic(errNonString) - } - - // Sort keys so that we have deterministic output. And write keys directly - // underneath this key first, before writing sub-structs or sub-maps. - var mapKeysDirect, mapKeysSub []string - for _, mapKey := range rv.MapKeys() { - k := mapKey.String() - if typeIsHash(tomlTypeOfGo(rv.MapIndex(mapKey))) { - mapKeysSub = append(mapKeysSub, k) - } else { - mapKeysDirect = append(mapKeysDirect, k) - } - } - - var writeMapKeys = func(mapKeys []string) { - sort.Strings(mapKeys) - for _, mapKey := range mapKeys { - mrv := rv.MapIndex(reflect.ValueOf(mapKey)) - if isNil(mrv) { - // Don't write anything for nil fields. - continue - } - enc.encode(key.add(mapKey), mrv) - } - } - writeMapKeys(mapKeysDirect) - writeMapKeys(mapKeysSub) -} - -func (enc *Encoder) eStruct(key Key, rv reflect.Value) { - // Write keys for fields directly under this key first, because if we write - // a field that creates a new table, then all keys under it will be in that - // table (not the one we're writing here). - rt := rv.Type() - var fieldsDirect, fieldsSub [][]int - var addFields func(rt reflect.Type, rv reflect.Value, start []int) - addFields = func(rt reflect.Type, rv reflect.Value, start []int) { - for i := 0; i < rt.NumField(); i++ { - f := rt.Field(i) - // skip unexported fields - if f.PkgPath != "" && !f.Anonymous { - continue - } - frv := rv.Field(i) - if f.Anonymous { - t := f.Type - switch t.Kind() { - case reflect.Struct: - // Treat anonymous struct fields with - // tag names as though they are not - // anonymous, like encoding/json does. - if getOptions(f.Tag).name == "" { - addFields(t, frv, f.Index) - continue - } - case reflect.Ptr: - if t.Elem().Kind() == reflect.Struct && - getOptions(f.Tag).name == "" { - if !frv.IsNil() { - addFields(t.Elem(), frv.Elem(), f.Index) - } - continue - } - // Fall through to the normal field encoding logic below - // for non-struct anonymous fields. - } - } - - if typeIsHash(tomlTypeOfGo(frv)) { - fieldsSub = append(fieldsSub, append(start, f.Index...)) - } else { - fieldsDirect = append(fieldsDirect, append(start, f.Index...)) - } - } - } - addFields(rt, rv, nil) - - var writeFields = func(fields [][]int) { - for _, fieldIndex := range fields { - sft := rt.FieldByIndex(fieldIndex) - sf := rv.FieldByIndex(fieldIndex) - if isNil(sf) { - // Don't write anything for nil fields. - continue - } - - opts := getOptions(sft.Tag) - if opts.skip { - continue - } - keyName := sft.Name - if opts.name != "" { - keyName = opts.name - } - if opts.omitempty && isEmpty(sf) { - continue - } - if opts.omitzero && isZero(sf) { - continue - } - - enc.encode(key.add(keyName), sf) - } - } - writeFields(fieldsDirect) - writeFields(fieldsSub) -} - -// tomlTypeName returns the TOML type name of the Go value's type. It is -// used to determine whether the types of array elements are mixed (which is -// forbidden). If the Go value is nil, then it is illegal for it to be an array -// element, and valueIsNil is returned as true. - -// Returns the TOML type of a Go value. The type may be `nil`, which means -// no concrete TOML type could be found. -func tomlTypeOfGo(rv reflect.Value) tomlType { - if isNil(rv) || !rv.IsValid() { - return nil - } - switch rv.Kind() { - case reflect.Bool: - return tomlBool - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, - reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, - reflect.Uint64: - return tomlInteger - case reflect.Float32, reflect.Float64: - return tomlFloat - case reflect.Array, reflect.Slice: - if typeEqual(tomlHash, tomlArrayType(rv)) { - return tomlArrayHash - } - return tomlArray - case reflect.Ptr, reflect.Interface: - return tomlTypeOfGo(rv.Elem()) - case reflect.String: - return tomlString - case reflect.Map: - return tomlHash - case reflect.Struct: - switch rv.Interface().(type) { - case time.Time: - return tomlDatetime - case TextMarshaler: - return tomlString - default: - return tomlHash - } - default: - panic("unexpected reflect.Kind: " + rv.Kind().String()) - } -} - -// tomlArrayType returns the element type of a TOML array. The type returned -// may be nil if it cannot be determined (e.g., a nil slice or a zero length -// slize). This function may also panic if it finds a type that cannot be -// expressed in TOML (such as nil elements, heterogeneous arrays or directly -// nested arrays of tables). -func tomlArrayType(rv reflect.Value) tomlType { - if isNil(rv) || !rv.IsValid() || rv.Len() == 0 { - return nil - } - firstType := tomlTypeOfGo(rv.Index(0)) - if firstType == nil { - encPanic(errArrayNilElement) - } - - rvlen := rv.Len() - for i := 1; i < rvlen; i++ { - elem := rv.Index(i) - switch elemType := tomlTypeOfGo(elem); { - case elemType == nil: - encPanic(errArrayNilElement) - case !typeEqual(firstType, elemType): - encPanic(errArrayMixedElementTypes) - } - } - // If we have a nested array, then we must make sure that the nested - // array contains ONLY primitives. - // This checks arbitrarily nested arrays. - if typeEqual(firstType, tomlArray) || typeEqual(firstType, tomlArrayHash) { - nest := tomlArrayType(eindirect(rv.Index(0))) - if typeEqual(nest, tomlHash) || typeEqual(nest, tomlArrayHash) { - encPanic(errArrayNoTable) - } - } - return firstType -} - -type tagOptions struct { - skip bool // "-" - name string - omitempty bool - omitzero bool -} - -func getOptions(tag reflect.StructTag) tagOptions { - t := tag.Get("toml") - if t == "-" { - return tagOptions{skip: true} - } - var opts tagOptions - parts := strings.Split(t, ",") - opts.name = parts[0] - for _, s := range parts[1:] { - switch s { - case "omitempty": - opts.omitempty = true - case "omitzero": - opts.omitzero = true - } - } - return opts -} - -func isZero(rv reflect.Value) bool { - switch rv.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return rv.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return rv.Uint() == 0 - case reflect.Float32, reflect.Float64: - return rv.Float() == 0.0 - } - return false -} - -func isEmpty(rv reflect.Value) bool { - switch rv.Kind() { - case reflect.Array, reflect.Slice, reflect.Map, reflect.String: - return rv.Len() == 0 - case reflect.Bool: - return !rv.Bool() - } - return false -} - -func (enc *Encoder) newline() { - if enc.hasWritten { - enc.wf("\n") - } -} - -func (enc *Encoder) keyEqElement(key Key, val reflect.Value) { - if len(key) == 0 { - encPanic(errNoKey) - } - panicIfInvalidKey(key) - enc.wf("%s%s = ", enc.indentStr(key), key.maybeQuoted(len(key)-1)) - enc.eElement(val) - enc.newline() -} - -func (enc *Encoder) wf(format string, v ...interface{}) { - if _, err := fmt.Fprintf(enc.w, format, v...); err != nil { - encPanic(err) - } - enc.hasWritten = true -} - -func (enc *Encoder) indentStr(key Key) string { - return strings.Repeat(enc.Indent, len(key)-1) -} - -func encPanic(err error) { - panic(tomlEncodeError{err}) -} - -func eindirect(v reflect.Value) reflect.Value { - switch v.Kind() { - case reflect.Ptr, reflect.Interface: - return eindirect(v.Elem()) - default: - return v - } -} - -func isNil(rv reflect.Value) bool { - switch rv.Kind() { - case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return rv.IsNil() - default: - return false - } -} - -func panicIfInvalidKey(key Key) { - for _, k := range key { - if len(k) == 0 { - encPanic(e("Key '%s' is not a valid table name. Key names "+ - "cannot be empty.", key.maybeQuotedAll())) - } - } -} - -func isValidKeyName(s string) bool { - return len(s) != 0 -} diff --git a/vendor/github.com/BurntSushi/toml/encoding_types.go b/vendor/github.com/BurntSushi/toml/encoding_types.go deleted file mode 100644 index d36e1dd6002..00000000000 --- a/vendor/github.com/BurntSushi/toml/encoding_types.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build go1.2 - -package toml - -// In order to support Go 1.1, we define our own TextMarshaler and -// TextUnmarshaler types. For Go 1.2+, we just alias them with the -// standard library interfaces. - -import ( - "encoding" -) - -// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here -// so that Go 1.1 can be supported. -type TextMarshaler encoding.TextMarshaler - -// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined -// here so that Go 1.1 can be supported. -type TextUnmarshaler encoding.TextUnmarshaler diff --git a/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go b/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go deleted file mode 100644 index e8d503d0469..00000000000 --- a/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build !go1.2 - -package toml - -// These interfaces were introduced in Go 1.2, so we add them manually when -// compiling for Go 1.1. - -// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here -// so that Go 1.1 can be supported. -type TextMarshaler interface { - MarshalText() (text []byte, err error) -} - -// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined -// here so that Go 1.1 can be supported. -type TextUnmarshaler interface { - UnmarshalText(text []byte) error -} diff --git a/vendor/github.com/BurntSushi/toml/lex.go b/vendor/github.com/BurntSushi/toml/lex.go deleted file mode 100644 index e0a742a8870..00000000000 --- a/vendor/github.com/BurntSushi/toml/lex.go +++ /dev/null @@ -1,953 +0,0 @@ -package toml - -import ( - "fmt" - "strings" - "unicode" - "unicode/utf8" -) - -type itemType int - -const ( - itemError itemType = iota - itemNIL // used in the parser to indicate no type - itemEOF - itemText - itemString - itemRawString - itemMultilineString - itemRawMultilineString - itemBool - itemInteger - itemFloat - itemDatetime - itemArray // the start of an array - itemArrayEnd - itemTableStart - itemTableEnd - itemArrayTableStart - itemArrayTableEnd - itemKeyStart - itemCommentStart - itemInlineTableStart - itemInlineTableEnd -) - -const ( - eof = 0 - comma = ',' - tableStart = '[' - tableEnd = ']' - arrayTableStart = '[' - arrayTableEnd = ']' - tableSep = '.' - keySep = '=' - arrayStart = '[' - arrayEnd = ']' - commentStart = '#' - stringStart = '"' - stringEnd = '"' - rawStringStart = '\'' - rawStringEnd = '\'' - inlineTableStart = '{' - inlineTableEnd = '}' -) - -type stateFn func(lx *lexer) stateFn - -type lexer struct { - input string - start int - pos int - line int - state stateFn - items chan item - - // Allow for backing up up to three runes. - // This is necessary because TOML contains 3-rune tokens (""" and '''). - prevWidths [3]int - nprev int // how many of prevWidths are in use - // If we emit an eof, we can still back up, but it is not OK to call - // next again. - atEOF bool - - // A stack of state functions used to maintain context. - // The idea is to reuse parts of the state machine in various places. - // For example, values can appear at the top level or within arbitrarily - // nested arrays. The last state on the stack is used after a value has - // been lexed. Similarly for comments. - stack []stateFn -} - -type item struct { - typ itemType - val string - line int -} - -func (lx *lexer) nextItem() item { - for { - select { - case item := <-lx.items: - return item - default: - lx.state = lx.state(lx) - } - } -} - -func lex(input string) *lexer { - lx := &lexer{ - input: input, - state: lexTop, - line: 1, - items: make(chan item, 10), - stack: make([]stateFn, 0, 10), - } - return lx -} - -func (lx *lexer) push(state stateFn) { - lx.stack = append(lx.stack, state) -} - -func (lx *lexer) pop() stateFn { - if len(lx.stack) == 0 { - return lx.errorf("BUG in lexer: no states to pop") - } - last := lx.stack[len(lx.stack)-1] - lx.stack = lx.stack[0 : len(lx.stack)-1] - return last -} - -func (lx *lexer) current() string { - return lx.input[lx.start:lx.pos] -} - -func (lx *lexer) emit(typ itemType) { - lx.items <- item{typ, lx.current(), lx.line} - lx.start = lx.pos -} - -func (lx *lexer) emitTrim(typ itemType) { - lx.items <- item{typ, strings.TrimSpace(lx.current()), lx.line} - lx.start = lx.pos -} - -func (lx *lexer) next() (r rune) { - if lx.atEOF { - panic("next called after EOF") - } - if lx.pos >= len(lx.input) { - lx.atEOF = true - return eof - } - - if lx.input[lx.pos] == '\n' { - lx.line++ - } - lx.prevWidths[2] = lx.prevWidths[1] - lx.prevWidths[1] = lx.prevWidths[0] - if lx.nprev < 3 { - lx.nprev++ - } - r, w := utf8.DecodeRuneInString(lx.input[lx.pos:]) - lx.prevWidths[0] = w - lx.pos += w - return r -} - -// ignore skips over the pending input before this point. -func (lx *lexer) ignore() { - lx.start = lx.pos -} - -// backup steps back one rune. Can be called only twice between calls to next. -func (lx *lexer) backup() { - if lx.atEOF { - lx.atEOF = false - return - } - if lx.nprev < 1 { - panic("backed up too far") - } - w := lx.prevWidths[0] - lx.prevWidths[0] = lx.prevWidths[1] - lx.prevWidths[1] = lx.prevWidths[2] - lx.nprev-- - lx.pos -= w - if lx.pos < len(lx.input) && lx.input[lx.pos] == '\n' { - lx.line-- - } -} - -// accept consumes the next rune if it's equal to `valid`. -func (lx *lexer) accept(valid rune) bool { - if lx.next() == valid { - return true - } - lx.backup() - return false -} - -// peek returns but does not consume the next rune in the input. -func (lx *lexer) peek() rune { - r := lx.next() - lx.backup() - return r -} - -// skip ignores all input that matches the given predicate. -func (lx *lexer) skip(pred func(rune) bool) { - for { - r := lx.next() - if pred(r) { - continue - } - lx.backup() - lx.ignore() - return - } -} - -// errorf stops all lexing by emitting an error and returning `nil`. -// Note that any value that is a character is escaped if it's a special -// character (newlines, tabs, etc.). -func (lx *lexer) errorf(format string, values ...interface{}) stateFn { - lx.items <- item{ - itemError, - fmt.Sprintf(format, values...), - lx.line, - } - return nil -} - -// lexTop consumes elements at the top level of TOML data. -func lexTop(lx *lexer) stateFn { - r := lx.next() - if isWhitespace(r) || isNL(r) { - return lexSkip(lx, lexTop) - } - switch r { - case commentStart: - lx.push(lexTop) - return lexCommentStart - case tableStart: - return lexTableStart - case eof: - if lx.pos > lx.start { - return lx.errorf("unexpected EOF") - } - lx.emit(itemEOF) - return nil - } - - // At this point, the only valid item can be a key, so we back up - // and let the key lexer do the rest. - lx.backup() - lx.push(lexTopEnd) - return lexKeyStart -} - -// lexTopEnd is entered whenever a top-level item has been consumed. (A value -// or a table.) It must see only whitespace, and will turn back to lexTop -// upon a newline. If it sees EOF, it will quit the lexer successfully. -func lexTopEnd(lx *lexer) stateFn { - r := lx.next() - switch { - case r == commentStart: - // a comment will read to a newline for us. - lx.push(lexTop) - return lexCommentStart - case isWhitespace(r): - return lexTopEnd - case isNL(r): - lx.ignore() - return lexTop - case r == eof: - lx.emit(itemEOF) - return nil - } - return lx.errorf("expected a top-level item to end with a newline, "+ - "comment, or EOF, but got %q instead", r) -} - -// lexTable lexes the beginning of a table. Namely, it makes sure that -// it starts with a character other than '.' and ']'. -// It assumes that '[' has already been consumed. -// It also handles the case that this is an item in an array of tables. -// e.g., '[[name]]'. -func lexTableStart(lx *lexer) stateFn { - if lx.peek() == arrayTableStart { - lx.next() - lx.emit(itemArrayTableStart) - lx.push(lexArrayTableEnd) - } else { - lx.emit(itemTableStart) - lx.push(lexTableEnd) - } - return lexTableNameStart -} - -func lexTableEnd(lx *lexer) stateFn { - lx.emit(itemTableEnd) - return lexTopEnd -} - -func lexArrayTableEnd(lx *lexer) stateFn { - if r := lx.next(); r != arrayTableEnd { - return lx.errorf("expected end of table array name delimiter %q, "+ - "but got %q instead", arrayTableEnd, r) - } - lx.emit(itemArrayTableEnd) - return lexTopEnd -} - -func lexTableNameStart(lx *lexer) stateFn { - lx.skip(isWhitespace) - switch r := lx.peek(); { - case r == tableEnd || r == eof: - return lx.errorf("unexpected end of table name " + - "(table names cannot be empty)") - case r == tableSep: - return lx.errorf("unexpected table separator " + - "(table names cannot be empty)") - case r == stringStart || r == rawStringStart: - lx.ignore() - lx.push(lexTableNameEnd) - return lexValue // reuse string lexing - default: - return lexBareTableName - } -} - -// lexBareTableName lexes the name of a table. It assumes that at least one -// valid character for the table has already been read. -func lexBareTableName(lx *lexer) stateFn { - r := lx.next() - if isBareKeyChar(r) { - return lexBareTableName - } - lx.backup() - lx.emit(itemText) - return lexTableNameEnd -} - -// lexTableNameEnd reads the end of a piece of a table name, optionally -// consuming whitespace. -func lexTableNameEnd(lx *lexer) stateFn { - lx.skip(isWhitespace) - switch r := lx.next(); { - case isWhitespace(r): - return lexTableNameEnd - case r == tableSep: - lx.ignore() - return lexTableNameStart - case r == tableEnd: - return lx.pop() - default: - return lx.errorf("expected '.' or ']' to end table name, "+ - "but got %q instead", r) - } -} - -// lexKeyStart consumes a key name up until the first non-whitespace character. -// lexKeyStart will ignore whitespace. -func lexKeyStart(lx *lexer) stateFn { - r := lx.peek() - switch { - case r == keySep: - return lx.errorf("unexpected key separator %q", keySep) - case isWhitespace(r) || isNL(r): - lx.next() - return lexSkip(lx, lexKeyStart) - case r == stringStart || r == rawStringStart: - lx.ignore() - lx.emit(itemKeyStart) - lx.push(lexKeyEnd) - return lexValue // reuse string lexing - default: - lx.ignore() - lx.emit(itemKeyStart) - return lexBareKey - } -} - -// lexBareKey consumes the text of a bare key. Assumes that the first character -// (which is not whitespace) has not yet been consumed. -func lexBareKey(lx *lexer) stateFn { - switch r := lx.next(); { - case isBareKeyChar(r): - return lexBareKey - case isWhitespace(r): - lx.backup() - lx.emit(itemText) - return lexKeyEnd - case r == keySep: - lx.backup() - lx.emit(itemText) - return lexKeyEnd - default: - return lx.errorf("bare keys cannot contain %q", r) - } -} - -// lexKeyEnd consumes the end of a key and trims whitespace (up to the key -// separator). -func lexKeyEnd(lx *lexer) stateFn { - switch r := lx.next(); { - case r == keySep: - return lexSkip(lx, lexValue) - case isWhitespace(r): - return lexSkip(lx, lexKeyEnd) - default: - return lx.errorf("expected key separator %q, but got %q instead", - keySep, r) - } -} - -// lexValue starts the consumption of a value anywhere a value is expected. -// lexValue will ignore whitespace. -// After a value is lexed, the last state on the next is popped and returned. -func lexValue(lx *lexer) stateFn { - // We allow whitespace to precede a value, but NOT newlines. - // In array syntax, the array states are responsible for ignoring newlines. - r := lx.next() - switch { - case isWhitespace(r): - return lexSkip(lx, lexValue) - case isDigit(r): - lx.backup() // avoid an extra state and use the same as above - return lexNumberOrDateStart - } - switch r { - case arrayStart: - lx.ignore() - lx.emit(itemArray) - return lexArrayValue - case inlineTableStart: - lx.ignore() - lx.emit(itemInlineTableStart) - return lexInlineTableValue - case stringStart: - if lx.accept(stringStart) { - if lx.accept(stringStart) { - lx.ignore() // Ignore """ - return lexMultilineString - } - lx.backup() - } - lx.ignore() // ignore the '"' - return lexString - case rawStringStart: - if lx.accept(rawStringStart) { - if lx.accept(rawStringStart) { - lx.ignore() // Ignore """ - return lexMultilineRawString - } - lx.backup() - } - lx.ignore() // ignore the "'" - return lexRawString - case '+', '-': - return lexNumberStart - case '.': // special error case, be kind to users - return lx.errorf("floats must start with a digit, not '.'") - } - if unicode.IsLetter(r) { - // Be permissive here; lexBool will give a nice error if the - // user wrote something like - // x = foo - // (i.e. not 'true' or 'false' but is something else word-like.) - lx.backup() - return lexBool - } - return lx.errorf("expected value but found %q instead", r) -} - -// lexArrayValue consumes one value in an array. It assumes that '[' or ',' -// have already been consumed. All whitespace and newlines are ignored. -func lexArrayValue(lx *lexer) stateFn { - r := lx.next() - switch { - case isWhitespace(r) || isNL(r): - return lexSkip(lx, lexArrayValue) - case r == commentStart: - lx.push(lexArrayValue) - return lexCommentStart - case r == comma: - return lx.errorf("unexpected comma") - case r == arrayEnd: - // NOTE(caleb): The spec isn't clear about whether you can have - // a trailing comma or not, so we'll allow it. - return lexArrayEnd - } - - lx.backup() - lx.push(lexArrayValueEnd) - return lexValue -} - -// lexArrayValueEnd consumes everything between the end of an array value and -// the next value (or the end of the array): it ignores whitespace and newlines -// and expects either a ',' or a ']'. -func lexArrayValueEnd(lx *lexer) stateFn { - r := lx.next() - switch { - case isWhitespace(r) || isNL(r): - return lexSkip(lx, lexArrayValueEnd) - case r == commentStart: - lx.push(lexArrayValueEnd) - return lexCommentStart - case r == comma: - lx.ignore() - return lexArrayValue // move on to the next value - case r == arrayEnd: - return lexArrayEnd - } - return lx.errorf( - "expected a comma or array terminator %q, but got %q instead", - arrayEnd, r, - ) -} - -// lexArrayEnd finishes the lexing of an array. -// It assumes that a ']' has just been consumed. -func lexArrayEnd(lx *lexer) stateFn { - lx.ignore() - lx.emit(itemArrayEnd) - return lx.pop() -} - -// lexInlineTableValue consumes one key/value pair in an inline table. -// It assumes that '{' or ',' have already been consumed. Whitespace is ignored. -func lexInlineTableValue(lx *lexer) stateFn { - r := lx.next() - switch { - case isWhitespace(r): - return lexSkip(lx, lexInlineTableValue) - case isNL(r): - return lx.errorf("newlines not allowed within inline tables") - case r == commentStart: - lx.push(lexInlineTableValue) - return lexCommentStart - case r == comma: - return lx.errorf("unexpected comma") - case r == inlineTableEnd: - return lexInlineTableEnd - } - lx.backup() - lx.push(lexInlineTableValueEnd) - return lexKeyStart -} - -// lexInlineTableValueEnd consumes everything between the end of an inline table -// key/value pair and the next pair (or the end of the table): -// it ignores whitespace and expects either a ',' or a '}'. -func lexInlineTableValueEnd(lx *lexer) stateFn { - r := lx.next() - switch { - case isWhitespace(r): - return lexSkip(lx, lexInlineTableValueEnd) - case isNL(r): - return lx.errorf("newlines not allowed within inline tables") - case r == commentStart: - lx.push(lexInlineTableValueEnd) - return lexCommentStart - case r == comma: - lx.ignore() - return lexInlineTableValue - case r == inlineTableEnd: - return lexInlineTableEnd - } - return lx.errorf("expected a comma or an inline table terminator %q, "+ - "but got %q instead", inlineTableEnd, r) -} - -// lexInlineTableEnd finishes the lexing of an inline table. -// It assumes that a '}' has just been consumed. -func lexInlineTableEnd(lx *lexer) stateFn { - lx.ignore() - lx.emit(itemInlineTableEnd) - return lx.pop() -} - -// lexString consumes the inner contents of a string. It assumes that the -// beginning '"' has already been consumed and ignored. -func lexString(lx *lexer) stateFn { - r := lx.next() - switch { - case r == eof: - return lx.errorf("unexpected EOF") - case isNL(r): - return lx.errorf("strings cannot contain newlines") - case r == '\\': - lx.push(lexString) - return lexStringEscape - case r == stringEnd: - lx.backup() - lx.emit(itemString) - lx.next() - lx.ignore() - return lx.pop() - } - return lexString -} - -// lexMultilineString consumes the inner contents of a string. It assumes that -// the beginning '"""' has already been consumed and ignored. -func lexMultilineString(lx *lexer) stateFn { - switch lx.next() { - case eof: - return lx.errorf("unexpected EOF") - case '\\': - return lexMultilineStringEscape - case stringEnd: - if lx.accept(stringEnd) { - if lx.accept(stringEnd) { - lx.backup() - lx.backup() - lx.backup() - lx.emit(itemMultilineString) - lx.next() - lx.next() - lx.next() - lx.ignore() - return lx.pop() - } - lx.backup() - } - } - return lexMultilineString -} - -// lexRawString consumes a raw string. Nothing can be escaped in such a string. -// It assumes that the beginning "'" has already been consumed and ignored. -func lexRawString(lx *lexer) stateFn { - r := lx.next() - switch { - case r == eof: - return lx.errorf("unexpected EOF") - case isNL(r): - return lx.errorf("strings cannot contain newlines") - case r == rawStringEnd: - lx.backup() - lx.emit(itemRawString) - lx.next() - lx.ignore() - return lx.pop() - } - return lexRawString -} - -// lexMultilineRawString consumes a raw string. Nothing can be escaped in such -// a string. It assumes that the beginning "'''" has already been consumed and -// ignored. -func lexMultilineRawString(lx *lexer) stateFn { - switch lx.next() { - case eof: - return lx.errorf("unexpected EOF") - case rawStringEnd: - if lx.accept(rawStringEnd) { - if lx.accept(rawStringEnd) { - lx.backup() - lx.backup() - lx.backup() - lx.emit(itemRawMultilineString) - lx.next() - lx.next() - lx.next() - lx.ignore() - return lx.pop() - } - lx.backup() - } - } - return lexMultilineRawString -} - -// lexMultilineStringEscape consumes an escaped character. It assumes that the -// preceding '\\' has already been consumed. -func lexMultilineStringEscape(lx *lexer) stateFn { - // Handle the special case first: - if isNL(lx.next()) { - return lexMultilineString - } - lx.backup() - lx.push(lexMultilineString) - return lexStringEscape(lx) -} - -func lexStringEscape(lx *lexer) stateFn { - r := lx.next() - switch r { - case 'b': - fallthrough - case 't': - fallthrough - case 'n': - fallthrough - case 'f': - fallthrough - case 'r': - fallthrough - case '"': - fallthrough - case '\\': - return lx.pop() - case 'u': - return lexShortUnicodeEscape - case 'U': - return lexLongUnicodeEscape - } - return lx.errorf("invalid escape character %q; only the following "+ - "escape characters are allowed: "+ - `\b, \t, \n, \f, \r, \", \\, \uXXXX, and \UXXXXXXXX`, r) -} - -func lexShortUnicodeEscape(lx *lexer) stateFn { - var r rune - for i := 0; i < 4; i++ { - r = lx.next() - if !isHexadecimal(r) { - return lx.errorf(`expected four hexadecimal digits after '\u', `+ - "but got %q instead", lx.current()) - } - } - return lx.pop() -} - -func lexLongUnicodeEscape(lx *lexer) stateFn { - var r rune - for i := 0; i < 8; i++ { - r = lx.next() - if !isHexadecimal(r) { - return lx.errorf(`expected eight hexadecimal digits after '\U', `+ - "but got %q instead", lx.current()) - } - } - return lx.pop() -} - -// lexNumberOrDateStart consumes either an integer, a float, or datetime. -func lexNumberOrDateStart(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexNumberOrDate - } - switch r { - case '_': - return lexNumber - case 'e', 'E': - return lexFloat - case '.': - return lx.errorf("floats must start with a digit, not '.'") - } - return lx.errorf("expected a digit but got %q", r) -} - -// lexNumberOrDate consumes either an integer, float or datetime. -func lexNumberOrDate(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexNumberOrDate - } - switch r { - case '-': - return lexDatetime - case '_': - return lexNumber - case '.', 'e', 'E': - return lexFloat - } - - lx.backup() - lx.emit(itemInteger) - return lx.pop() -} - -// lexDatetime consumes a Datetime, to a first approximation. -// The parser validates that it matches one of the accepted formats. -func lexDatetime(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexDatetime - } - switch r { - case '-', 'T', ':', '.', 'Z', '+': - return lexDatetime - } - - lx.backup() - lx.emit(itemDatetime) - return lx.pop() -} - -// lexNumberStart consumes either an integer or a float. It assumes that a sign -// has already been read, but that *no* digits have been consumed. -// lexNumberStart will move to the appropriate integer or float states. -func lexNumberStart(lx *lexer) stateFn { - // We MUST see a digit. Even floats have to start with a digit. - r := lx.next() - if !isDigit(r) { - if r == '.' { - return lx.errorf("floats must start with a digit, not '.'") - } - return lx.errorf("expected a digit but got %q", r) - } - return lexNumber -} - -// lexNumber consumes an integer or a float after seeing the first digit. -func lexNumber(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexNumber - } - switch r { - case '_': - return lexNumber - case '.', 'e', 'E': - return lexFloat - } - - lx.backup() - lx.emit(itemInteger) - return lx.pop() -} - -// lexFloat consumes the elements of a float. It allows any sequence of -// float-like characters, so floats emitted by the lexer are only a first -// approximation and must be validated by the parser. -func lexFloat(lx *lexer) stateFn { - r := lx.next() - if isDigit(r) { - return lexFloat - } - switch r { - case '_', '.', '-', '+', 'e', 'E': - return lexFloat - } - - lx.backup() - lx.emit(itemFloat) - return lx.pop() -} - -// lexBool consumes a bool string: 'true' or 'false. -func lexBool(lx *lexer) stateFn { - var rs []rune - for { - r := lx.next() - if !unicode.IsLetter(r) { - lx.backup() - break - } - rs = append(rs, r) - } - s := string(rs) - switch s { - case "true", "false": - lx.emit(itemBool) - return lx.pop() - } - return lx.errorf("expected value but found %q instead", s) -} - -// lexCommentStart begins the lexing of a comment. It will emit -// itemCommentStart and consume no characters, passing control to lexComment. -func lexCommentStart(lx *lexer) stateFn { - lx.ignore() - lx.emit(itemCommentStart) - return lexComment -} - -// lexComment lexes an entire comment. It assumes that '#' has been consumed. -// It will consume *up to* the first newline character, and pass control -// back to the last state on the stack. -func lexComment(lx *lexer) stateFn { - r := lx.peek() - if isNL(r) || r == eof { - lx.emit(itemText) - return lx.pop() - } - lx.next() - return lexComment -} - -// lexSkip ignores all slurped input and moves on to the next state. -func lexSkip(lx *lexer, nextState stateFn) stateFn { - return func(lx *lexer) stateFn { - lx.ignore() - return nextState - } -} - -// isWhitespace returns true if `r` is a whitespace character according -// to the spec. -func isWhitespace(r rune) bool { - return r == '\t' || r == ' ' -} - -func isNL(r rune) bool { - return r == '\n' || r == '\r' -} - -func isDigit(r rune) bool { - return r >= '0' && r <= '9' -} - -func isHexadecimal(r rune) bool { - return (r >= '0' && r <= '9') || - (r >= 'a' && r <= 'f') || - (r >= 'A' && r <= 'F') -} - -func isBareKeyChar(r rune) bool { - return (r >= 'A' && r <= 'Z') || - (r >= 'a' && r <= 'z') || - (r >= '0' && r <= '9') || - r == '_' || - r == '-' -} - -func (itype itemType) String() string { - switch itype { - case itemError: - return "Error" - case itemNIL: - return "NIL" - case itemEOF: - return "EOF" - case itemText: - return "Text" - case itemString, itemRawString, itemMultilineString, itemRawMultilineString: - return "String" - case itemBool: - return "Bool" - case itemInteger: - return "Integer" - case itemFloat: - return "Float" - case itemDatetime: - return "DateTime" - case itemTableStart: - return "TableStart" - case itemTableEnd: - return "TableEnd" - case itemKeyStart: - return "KeyStart" - case itemArray: - return "Array" - case itemArrayEnd: - return "ArrayEnd" - case itemCommentStart: - return "CommentStart" - } - panic(fmt.Sprintf("BUG: Unknown type '%d'.", int(itype))) -} - -func (item item) String() string { - return fmt.Sprintf("(%s, %s)", item.typ.String(), item.val) -} diff --git a/vendor/github.com/BurntSushi/toml/parse.go b/vendor/github.com/BurntSushi/toml/parse.go deleted file mode 100644 index 50869ef9266..00000000000 --- a/vendor/github.com/BurntSushi/toml/parse.go +++ /dev/null @@ -1,592 +0,0 @@ -package toml - -import ( - "fmt" - "strconv" - "strings" - "time" - "unicode" - "unicode/utf8" -) - -type parser struct { - mapping map[string]interface{} - types map[string]tomlType - lx *lexer - - // A list of keys in the order that they appear in the TOML data. - ordered []Key - - // the full key for the current hash in scope - context Key - - // the base key name for everything except hashes - currentKey string - - // rough approximation of line number - approxLine int - - // A map of 'key.group.names' to whether they were created implicitly. - implicits map[string]bool -} - -type parseError string - -func (pe parseError) Error() string { - return string(pe) -} - -func parse(data string) (p *parser, err error) { - defer func() { - if r := recover(); r != nil { - var ok bool - if err, ok = r.(parseError); ok { - return - } - panic(r) - } - }() - - p = &parser{ - mapping: make(map[string]interface{}), - types: make(map[string]tomlType), - lx: lex(data), - ordered: make([]Key, 0), - implicits: make(map[string]bool), - } - for { - item := p.next() - if item.typ == itemEOF { - break - } - p.topLevel(item) - } - - return p, nil -} - -func (p *parser) panicf(format string, v ...interface{}) { - msg := fmt.Sprintf("Near line %d (last key parsed '%s'): %s", - p.approxLine, p.current(), fmt.Sprintf(format, v...)) - panic(parseError(msg)) -} - -func (p *parser) next() item { - it := p.lx.nextItem() - if it.typ == itemError { - p.panicf("%s", it.val) - } - return it -} - -func (p *parser) bug(format string, v ...interface{}) { - panic(fmt.Sprintf("BUG: "+format+"\n\n", v...)) -} - -func (p *parser) expect(typ itemType) item { - it := p.next() - p.assertEqual(typ, it.typ) - return it -} - -func (p *parser) assertEqual(expected, got itemType) { - if expected != got { - p.bug("Expected '%s' but got '%s'.", expected, got) - } -} - -func (p *parser) topLevel(item item) { - switch item.typ { - case itemCommentStart: - p.approxLine = item.line - p.expect(itemText) - case itemTableStart: - kg := p.next() - p.approxLine = kg.line - - var key Key - for ; kg.typ != itemTableEnd && kg.typ != itemEOF; kg = p.next() { - key = append(key, p.keyString(kg)) - } - p.assertEqual(itemTableEnd, kg.typ) - - p.establishContext(key, false) - p.setType("", tomlHash) - p.ordered = append(p.ordered, key) - case itemArrayTableStart: - kg := p.next() - p.approxLine = kg.line - - var key Key - for ; kg.typ != itemArrayTableEnd && kg.typ != itemEOF; kg = p.next() { - key = append(key, p.keyString(kg)) - } - p.assertEqual(itemArrayTableEnd, kg.typ) - - p.establishContext(key, true) - p.setType("", tomlArrayHash) - p.ordered = append(p.ordered, key) - case itemKeyStart: - kname := p.next() - p.approxLine = kname.line - p.currentKey = p.keyString(kname) - - val, typ := p.value(p.next()) - p.setValue(p.currentKey, val) - p.setType(p.currentKey, typ) - p.ordered = append(p.ordered, p.context.add(p.currentKey)) - p.currentKey = "" - default: - p.bug("Unexpected type at top level: %s", item.typ) - } -} - -// Gets a string for a key (or part of a key in a table name). -func (p *parser) keyString(it item) string { - switch it.typ { - case itemText: - return it.val - case itemString, itemMultilineString, - itemRawString, itemRawMultilineString: - s, _ := p.value(it) - return s.(string) - default: - p.bug("Unexpected key type: %s", it.typ) - panic("unreachable") - } -} - -// value translates an expected value from the lexer into a Go value wrapped -// as an empty interface. -func (p *parser) value(it item) (interface{}, tomlType) { - switch it.typ { - case itemString: - return p.replaceEscapes(it.val), p.typeOfPrimitive(it) - case itemMultilineString: - trimmed := stripFirstNewline(stripEscapedWhitespace(it.val)) - return p.replaceEscapes(trimmed), p.typeOfPrimitive(it) - case itemRawString: - return it.val, p.typeOfPrimitive(it) - case itemRawMultilineString: - return stripFirstNewline(it.val), p.typeOfPrimitive(it) - case itemBool: - switch it.val { - case "true": - return true, p.typeOfPrimitive(it) - case "false": - return false, p.typeOfPrimitive(it) - } - p.bug("Expected boolean value, but got '%s'.", it.val) - case itemInteger: - if !numUnderscoresOK(it.val) { - p.panicf("Invalid integer %q: underscores must be surrounded by digits", - it.val) - } - val := strings.Replace(it.val, "_", "", -1) - num, err := strconv.ParseInt(val, 10, 64) - if err != nil { - // Distinguish integer values. Normally, it'd be a bug if the lexer - // provides an invalid integer, but it's possible that the number is - // out of range of valid values (which the lexer cannot determine). - // So mark the former as a bug but the latter as a legitimate user - // error. - if e, ok := err.(*strconv.NumError); ok && - e.Err == strconv.ErrRange { - - p.panicf("Integer '%s' is out of the range of 64-bit "+ - "signed integers.", it.val) - } else { - p.bug("Expected integer value, but got '%s'.", it.val) - } - } - return num, p.typeOfPrimitive(it) - case itemFloat: - parts := strings.FieldsFunc(it.val, func(r rune) bool { - switch r { - case '.', 'e', 'E': - return true - } - return false - }) - for _, part := range parts { - if !numUnderscoresOK(part) { - p.panicf("Invalid float %q: underscores must be "+ - "surrounded by digits", it.val) - } - } - if !numPeriodsOK(it.val) { - // As a special case, numbers like '123.' or '1.e2', - // which are valid as far as Go/strconv are concerned, - // must be rejected because TOML says that a fractional - // part consists of '.' followed by 1+ digits. - p.panicf("Invalid float %q: '.' must be followed "+ - "by one or more digits", it.val) - } - val := strings.Replace(it.val, "_", "", -1) - num, err := strconv.ParseFloat(val, 64) - if err != nil { - if e, ok := err.(*strconv.NumError); ok && - e.Err == strconv.ErrRange { - - p.panicf("Float '%s' is out of the range of 64-bit "+ - "IEEE-754 floating-point numbers.", it.val) - } else { - p.panicf("Invalid float value: %q", it.val) - } - } - return num, p.typeOfPrimitive(it) - case itemDatetime: - var t time.Time - var ok bool - var err error - for _, format := range []string{ - "2006-01-02T15:04:05Z07:00", - "2006-01-02T15:04:05", - "2006-01-02", - } { - t, err = time.ParseInLocation(format, it.val, time.Local) - if err == nil { - ok = true - break - } - } - if !ok { - p.panicf("Invalid TOML Datetime: %q.", it.val) - } - return t, p.typeOfPrimitive(it) - case itemArray: - array := make([]interface{}, 0) - types := make([]tomlType, 0) - - for it = p.next(); it.typ != itemArrayEnd; it = p.next() { - if it.typ == itemCommentStart { - p.expect(itemText) - continue - } - - val, typ := p.value(it) - array = append(array, val) - types = append(types, typ) - } - return array, p.typeOfArray(types) - case itemInlineTableStart: - var ( - hash = make(map[string]interface{}) - outerContext = p.context - outerKey = p.currentKey - ) - - p.context = append(p.context, p.currentKey) - p.currentKey = "" - for it := p.next(); it.typ != itemInlineTableEnd; it = p.next() { - if it.typ != itemKeyStart { - p.bug("Expected key start but instead found %q, around line %d", - it.val, p.approxLine) - } - if it.typ == itemCommentStart { - p.expect(itemText) - continue - } - - // retrieve key - k := p.next() - p.approxLine = k.line - kname := p.keyString(k) - - // retrieve value - p.currentKey = kname - val, typ := p.value(p.next()) - // make sure we keep metadata up to date - p.setType(kname, typ) - p.ordered = append(p.ordered, p.context.add(p.currentKey)) - hash[kname] = val - } - p.context = outerContext - p.currentKey = outerKey - return hash, tomlHash - } - p.bug("Unexpected value type: %s", it.typ) - panic("unreachable") -} - -// numUnderscoresOK checks whether each underscore in s is surrounded by -// characters that are not underscores. -func numUnderscoresOK(s string) bool { - accept := false - for _, r := range s { - if r == '_' { - if !accept { - return false - } - accept = false - continue - } - accept = true - } - return accept -} - -// numPeriodsOK checks whether every period in s is followed by a digit. -func numPeriodsOK(s string) bool { - period := false - for _, r := range s { - if period && !isDigit(r) { - return false - } - period = r == '.' - } - return !period -} - -// establishContext sets the current context of the parser, -// where the context is either a hash or an array of hashes. Which one is -// set depends on the value of the `array` parameter. -// -// Establishing the context also makes sure that the key isn't a duplicate, and -// will create implicit hashes automatically. -func (p *parser) establishContext(key Key, array bool) { - var ok bool - - // Always start at the top level and drill down for our context. - hashContext := p.mapping - keyContext := make(Key, 0) - - // We only need implicit hashes for key[0:-1] - for _, k := range key[0 : len(key)-1] { - _, ok = hashContext[k] - keyContext = append(keyContext, k) - - // No key? Make an implicit hash and move on. - if !ok { - p.addImplicit(keyContext) - hashContext[k] = make(map[string]interface{}) - } - - // If the hash context is actually an array of tables, then set - // the hash context to the last element in that array. - // - // Otherwise, it better be a table, since this MUST be a key group (by - // virtue of it not being the last element in a key). - switch t := hashContext[k].(type) { - case []map[string]interface{}: - hashContext = t[len(t)-1] - case map[string]interface{}: - hashContext = t - default: - p.panicf("Key '%s' was already created as a hash.", keyContext) - } - } - - p.context = keyContext - if array { - // If this is the first element for this array, then allocate a new - // list of tables for it. - k := key[len(key)-1] - if _, ok := hashContext[k]; !ok { - hashContext[k] = make([]map[string]interface{}, 0, 5) - } - - // Add a new table. But make sure the key hasn't already been used - // for something else. - if hash, ok := hashContext[k].([]map[string]interface{}); ok { - hashContext[k] = append(hash, make(map[string]interface{})) - } else { - p.panicf("Key '%s' was already created and cannot be used as "+ - "an array.", keyContext) - } - } else { - p.setValue(key[len(key)-1], make(map[string]interface{})) - } - p.context = append(p.context, key[len(key)-1]) -} - -// setValue sets the given key to the given value in the current context. -// It will make sure that the key hasn't already been defined, account for -// implicit key groups. -func (p *parser) setValue(key string, value interface{}) { - var tmpHash interface{} - var ok bool - - hash := p.mapping - keyContext := make(Key, 0) - for _, k := range p.context { - keyContext = append(keyContext, k) - if tmpHash, ok = hash[k]; !ok { - p.bug("Context for key '%s' has not been established.", keyContext) - } - switch t := tmpHash.(type) { - case []map[string]interface{}: - // The context is a table of hashes. Pick the most recent table - // defined as the current hash. - hash = t[len(t)-1] - case map[string]interface{}: - hash = t - default: - p.bug("Expected hash to have type 'map[string]interface{}', but "+ - "it has '%T' instead.", tmpHash) - } - } - keyContext = append(keyContext, key) - - if _, ok := hash[key]; ok { - // Typically, if the given key has already been set, then we have - // to raise an error since duplicate keys are disallowed. However, - // it's possible that a key was previously defined implicitly. In this - // case, it is allowed to be redefined concretely. (See the - // `tests/valid/implicit-and-explicit-after.toml` test in `toml-test`.) - // - // But we have to make sure to stop marking it as an implicit. (So that - // another redefinition provokes an error.) - // - // Note that since it has already been defined (as a hash), we don't - // want to overwrite it. So our business is done. - if p.isImplicit(keyContext) { - p.removeImplicit(keyContext) - return - } - - // Otherwise, we have a concrete key trying to override a previous - // key, which is *always* wrong. - p.panicf("Key '%s' has already been defined.", keyContext) - } - hash[key] = value -} - -// setType sets the type of a particular value at a given key. -// It should be called immediately AFTER setValue. -// -// Note that if `key` is empty, then the type given will be applied to the -// current context (which is either a table or an array of tables). -func (p *parser) setType(key string, typ tomlType) { - keyContext := make(Key, 0, len(p.context)+1) - for _, k := range p.context { - keyContext = append(keyContext, k) - } - if len(key) > 0 { // allow type setting for hashes - keyContext = append(keyContext, key) - } - p.types[keyContext.String()] = typ -} - -// addImplicit sets the given Key as having been created implicitly. -func (p *parser) addImplicit(key Key) { - p.implicits[key.String()] = true -} - -// removeImplicit stops tagging the given key as having been implicitly -// created. -func (p *parser) removeImplicit(key Key) { - p.implicits[key.String()] = false -} - -// isImplicit returns true if the key group pointed to by the key was created -// implicitly. -func (p *parser) isImplicit(key Key) bool { - return p.implicits[key.String()] -} - -// current returns the full key name of the current context. -func (p *parser) current() string { - if len(p.currentKey) == 0 { - return p.context.String() - } - if len(p.context) == 0 { - return p.currentKey - } - return fmt.Sprintf("%s.%s", p.context, p.currentKey) -} - -func stripFirstNewline(s string) string { - if len(s) == 0 || s[0] != '\n' { - return s - } - return s[1:] -} - -func stripEscapedWhitespace(s string) string { - esc := strings.Split(s, "\\\n") - if len(esc) > 1 { - for i := 1; i < len(esc); i++ { - esc[i] = strings.TrimLeftFunc(esc[i], unicode.IsSpace) - } - } - return strings.Join(esc, "") -} - -func (p *parser) replaceEscapes(str string) string { - var replaced []rune - s := []byte(str) - r := 0 - for r < len(s) { - if s[r] != '\\' { - c, size := utf8.DecodeRune(s[r:]) - r += size - replaced = append(replaced, c) - continue - } - r += 1 - if r >= len(s) { - p.bug("Escape sequence at end of string.") - return "" - } - switch s[r] { - default: - p.bug("Expected valid escape code after \\, but got %q.", s[r]) - return "" - case 'b': - replaced = append(replaced, rune(0x0008)) - r += 1 - case 't': - replaced = append(replaced, rune(0x0009)) - r += 1 - case 'n': - replaced = append(replaced, rune(0x000A)) - r += 1 - case 'f': - replaced = append(replaced, rune(0x000C)) - r += 1 - case 'r': - replaced = append(replaced, rune(0x000D)) - r += 1 - case '"': - replaced = append(replaced, rune(0x0022)) - r += 1 - case '\\': - replaced = append(replaced, rune(0x005C)) - r += 1 - case 'u': - // At this point, we know we have a Unicode escape of the form - // `uXXXX` at [r, r+5). (Because the lexer guarantees this - // for us.) - escaped := p.asciiEscapeToUnicode(s[r+1 : r+5]) - replaced = append(replaced, escaped) - r += 5 - case 'U': - // At this point, we know we have a Unicode escape of the form - // `uXXXX` at [r, r+9). (Because the lexer guarantees this - // for us.) - escaped := p.asciiEscapeToUnicode(s[r+1 : r+9]) - replaced = append(replaced, escaped) - r += 9 - } - } - return string(replaced) -} - -func (p *parser) asciiEscapeToUnicode(bs []byte) rune { - s := string(bs) - hex, err := strconv.ParseUint(strings.ToLower(s), 16, 32) - if err != nil { - p.bug("Could not parse '%s' as a hexadecimal number, but the "+ - "lexer claims it's OK: %s", s, err) - } - if !utf8.ValidRune(rune(hex)) { - p.panicf("Escaped character '\\u%s' is not valid UTF-8.", s) - } - return rune(hex) -} - -func isStringType(ty itemType) bool { - return ty == itemString || ty == itemMultilineString || - ty == itemRawString || ty == itemRawMultilineString -} diff --git a/vendor/github.com/BurntSushi/toml/session.vim b/vendor/github.com/BurntSushi/toml/session.vim deleted file mode 100644 index 562164be060..00000000000 --- a/vendor/github.com/BurntSushi/toml/session.vim +++ /dev/null @@ -1 +0,0 @@ -au BufWritePost *.go silent!make tags > /dev/null 2>&1 diff --git a/vendor/github.com/BurntSushi/toml/type_check.go b/vendor/github.com/BurntSushi/toml/type_check.go deleted file mode 100644 index c73f8afc1a6..00000000000 --- a/vendor/github.com/BurntSushi/toml/type_check.go +++ /dev/null @@ -1,91 +0,0 @@ -package toml - -// tomlType represents any Go type that corresponds to a TOML type. -// While the first draft of the TOML spec has a simplistic type system that -// probably doesn't need this level of sophistication, we seem to be militating -// toward adding real composite types. -type tomlType interface { - typeString() string -} - -// typeEqual accepts any two types and returns true if they are equal. -func typeEqual(t1, t2 tomlType) bool { - if t1 == nil || t2 == nil { - return false - } - return t1.typeString() == t2.typeString() -} - -func typeIsHash(t tomlType) bool { - return typeEqual(t, tomlHash) || typeEqual(t, tomlArrayHash) -} - -type tomlBaseType string - -func (btype tomlBaseType) typeString() string { - return string(btype) -} - -func (btype tomlBaseType) String() string { - return btype.typeString() -} - -var ( - tomlInteger tomlBaseType = "Integer" - tomlFloat tomlBaseType = "Float" - tomlDatetime tomlBaseType = "Datetime" - tomlString tomlBaseType = "String" - tomlBool tomlBaseType = "Bool" - tomlArray tomlBaseType = "Array" - tomlHash tomlBaseType = "Hash" - tomlArrayHash tomlBaseType = "ArrayHash" -) - -// typeOfPrimitive returns a tomlType of any primitive value in TOML. -// Primitive values are: Integer, Float, Datetime, String and Bool. -// -// Passing a lexer item other than the following will cause a BUG message -// to occur: itemString, itemBool, itemInteger, itemFloat, itemDatetime. -func (p *parser) typeOfPrimitive(lexItem item) tomlType { - switch lexItem.typ { - case itemInteger: - return tomlInteger - case itemFloat: - return tomlFloat - case itemDatetime: - return tomlDatetime - case itemString: - return tomlString - case itemMultilineString: - return tomlString - case itemRawString: - return tomlString - case itemRawMultilineString: - return tomlString - case itemBool: - return tomlBool - } - p.bug("Cannot infer primitive type of lex item '%s'.", lexItem) - panic("unreachable") -} - -// typeOfArray returns a tomlType for an array given a list of types of its -// values. -// -// In the current spec, if an array is homogeneous, then its type is always -// "Array". If the array is not homogeneous, an error is generated. -func (p *parser) typeOfArray(types []tomlType) tomlType { - // Empty arrays are cool. - if len(types) == 0 { - return tomlArray - } - - theType := types[0] - for _, t := range types[1:] { - if !typeEqual(theType, t) { - p.panicf("Array contains values of type '%s' and '%s', but "+ - "arrays must be homogeneous.", theType, t) - } - } - return tomlArray -} diff --git a/vendor/github.com/BurntSushi/toml/type_fields.go b/vendor/github.com/BurntSushi/toml/type_fields.go deleted file mode 100644 index 608997c22f6..00000000000 --- a/vendor/github.com/BurntSushi/toml/type_fields.go +++ /dev/null @@ -1,242 +0,0 @@ -package toml - -// Struct field handling is adapted from code in encoding/json: -// -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the Go distribution. - -import ( - "reflect" - "sort" - "sync" -) - -// A field represents a single field found in a struct. -type field struct { - name string // the name of the field (`toml` tag included) - tag bool // whether field has a `toml` tag - index []int // represents the depth of an anonymous field - typ reflect.Type // the type of the field -} - -// byName sorts field by name, breaking ties with depth, -// then breaking ties with "name came from toml tag", then -// breaking ties with index sequence. -type byName []field - -func (x byName) Len() int { return len(x) } - -func (x byName) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -func (x byName) Less(i, j int) bool { - if x[i].name != x[j].name { - return x[i].name < x[j].name - } - if len(x[i].index) != len(x[j].index) { - return len(x[i].index) < len(x[j].index) - } - if x[i].tag != x[j].tag { - return x[i].tag - } - return byIndex(x).Less(i, j) -} - -// byIndex sorts field by index sequence. -type byIndex []field - -func (x byIndex) Len() int { return len(x) } - -func (x byIndex) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -func (x byIndex) Less(i, j int) bool { - for k, xik := range x[i].index { - if k >= len(x[j].index) { - return false - } - if xik != x[j].index[k] { - return xik < x[j].index[k] - } - } - return len(x[i].index) < len(x[j].index) -} - -// typeFields returns a list of fields that TOML should recognize for the given -// type. The algorithm is breadth-first search over the set of structs to -// include - the top struct and then any reachable anonymous structs. -func typeFields(t reflect.Type) []field { - // Anonymous fields to explore at the current level and the next. - current := []field{} - next := []field{{typ: t}} - - // Count of queued names for current level and the next. - count := map[reflect.Type]int{} - nextCount := map[reflect.Type]int{} - - // Types already visited at an earlier level. - visited := map[reflect.Type]bool{} - - // Fields found. - var fields []field - - for len(next) > 0 { - current, next = next, current[:0] - count, nextCount = nextCount, map[reflect.Type]int{} - - for _, f := range current { - if visited[f.typ] { - continue - } - visited[f.typ] = true - - // Scan f.typ for fields to include. - for i := 0; i < f.typ.NumField(); i++ { - sf := f.typ.Field(i) - if sf.PkgPath != "" && !sf.Anonymous { // unexported - continue - } - opts := getOptions(sf.Tag) - if opts.skip { - continue - } - index := make([]int, len(f.index)+1) - copy(index, f.index) - index[len(f.index)] = i - - ft := sf.Type - if ft.Name() == "" && ft.Kind() == reflect.Ptr { - // Follow pointer. - ft = ft.Elem() - } - - // Record found field and index sequence. - if opts.name != "" || !sf.Anonymous || ft.Kind() != reflect.Struct { - tagged := opts.name != "" - name := opts.name - if name == "" { - name = sf.Name - } - fields = append(fields, field{name, tagged, index, ft}) - if count[f.typ] > 1 { - // If there were multiple instances, add a second, - // so that the annihilation code will see a duplicate. - // It only cares about the distinction between 1 or 2, - // so don't bother generating any more copies. - fields = append(fields, fields[len(fields)-1]) - } - continue - } - - // Record new anonymous struct to explore in next round. - nextCount[ft]++ - if nextCount[ft] == 1 { - f := field{name: ft.Name(), index: index, typ: ft} - next = append(next, f) - } - } - } - } - - sort.Sort(byName(fields)) - - // Delete all fields that are hidden by the Go rules for embedded fields, - // except that fields with TOML tags are promoted. - - // The fields are sorted in primary order of name, secondary order - // of field index length. Loop over names; for each name, delete - // hidden fields by choosing the one dominant field that survives. - out := fields[:0] - for advance, i := 0, 0; i < len(fields); i += advance { - // One iteration per name. - // Find the sequence of fields with the name of this first field. - fi := fields[i] - name := fi.name - for advance = 1; i+advance < len(fields); advance++ { - fj := fields[i+advance] - if fj.name != name { - break - } - } - if advance == 1 { // Only one field with this name - out = append(out, fi) - continue - } - dominant, ok := dominantField(fields[i : i+advance]) - if ok { - out = append(out, dominant) - } - } - - fields = out - sort.Sort(byIndex(fields)) - - return fields -} - -// dominantField looks through the fields, all of which are known to -// have the same name, to find the single field that dominates the -// others using Go's embedding rules, modified by the presence of -// TOML tags. If there are multiple top-level fields, the boolean -// will be false: This condition is an error in Go and we skip all -// the fields. -func dominantField(fields []field) (field, bool) { - // The fields are sorted in increasing index-length order. The winner - // must therefore be one with the shortest index length. Drop all - // longer entries, which is easy: just truncate the slice. - length := len(fields[0].index) - tagged := -1 // Index of first tagged field. - for i, f := range fields { - if len(f.index) > length { - fields = fields[:i] - break - } - if f.tag { - if tagged >= 0 { - // Multiple tagged fields at the same level: conflict. - // Return no field. - return field{}, false - } - tagged = i - } - } - if tagged >= 0 { - return fields[tagged], true - } - // All remaining fields have the same length. If there's more than one, - // we have a conflict (two fields named "X" at the same level) and we - // return no field. - if len(fields) > 1 { - return field{}, false - } - return fields[0], true -} - -var fieldCache struct { - sync.RWMutex - m map[reflect.Type][]field -} - -// cachedTypeFields is like typeFields but uses a cache to avoid repeated work. -func cachedTypeFields(t reflect.Type) []field { - fieldCache.RLock() - f := fieldCache.m[t] - fieldCache.RUnlock() - if f != nil { - return f - } - - // Compute fields without lock. - // Might duplicate effort but won't hold other computations back. - f = typeFields(t) - if f == nil { - f = []field{} - } - - fieldCache.Lock() - if fieldCache.m == nil { - fieldCache.m = map[reflect.Type][]field{} - } - fieldCache.m[t] = f - fieldCache.Unlock() - return f -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/AUTHORS b/vendor/github.com/bazelbuild/bazel-gazelle/AUTHORS deleted file mode 100644 index 5abe237daec..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/AUTHORS +++ /dev/null @@ -1,18 +0,0 @@ -# This is the official list of authors for copyright purposes. -# Names should be added to this file as: -# Name or Organization -# The email address is not required for organizations. - -Andy Hochhaus -Antoine Pelisse -GinFungYJF <645116215@qq.com> -Google Inc. -Improbable Worlds Ltd -Jeff Hodges -John Millikin -Melinda Lu -Peter McAlpine -RS -Rodrigo Queiro -Tom Payne -Yuki Yugui Sonoda diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/CONTRIBUTORS b/vendor/github.com/bazelbuild/bazel-gazelle/CONTRIBUTORS deleted file mode 100644 index d4ff1901b8e..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/CONTRIBUTORS +++ /dev/null @@ -1,29 +0,0 @@ -# People who have agreed to one of the CLAs and can contribute patches. -# The AUTHORS file lists the copyright holders; this file -# lists people. For example, Google employees are listed here -# but not in AUTHORS, because Google holds the copyright. -# -# https://developers.google.com/open-source/cla/individual -# https://developers.google.com/open-source/cla/corporate -# -# Names should be added to this file as: -# Name - -Ainsley Escorce-Jones -Andy Hochhaus -Antoine Pelisse -GinFungYJF <645116215@qq.com> -Ian Cottrell -Jay Conrod -Jeff Grafton -Jeff Hodges -John Millikin -Kristina -Melinda Lu -Paul Bethe -Peter McAlpine -Rodrigo Queiro -RS -Stefan Sakalik -Tom Payne -Yuki Yugui Sonoda diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/LICENSE b/vendor/github.com/bazelbuild/bazel-gazelle/LICENSE deleted file mode 100644 index d6456956733..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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. diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/BUILD b/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/BUILD deleted file mode 100644 index f153e60e100..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/BUILD +++ /dev/null @@ -1,55 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "diff.go", - "fix.go", - "fix-update.go", - "gazelle.go", - "langs.go", - "metaresolver.go", - "print.go", - "update-repos.go", - "version.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle", - importpath = "github.com/bazelbuild/bazel-gazelle/cmd/gazelle", - visibility = ["//visibility:private"], - deps = [ - "//vendor/github.com/bazelbuild/bazel-gazelle/config:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/flag:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/internal/version:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/label:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/language:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/language/go:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/language/proto:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/merger:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/repo:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/resolve:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/rule:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/walk:go_default_library", - "//vendor/github.com/pmezard/go-difflib/difflib:go_default_library", - ], -) - -go_binary( - name = "gazelle", - embed = [":go_default_library"], - tags = ["manual"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/diff.go b/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/diff.go deleted file mode 100644 index 2d574090e86..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/diff.go +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright 2016 The Bazel Authors. 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 main - -import ( - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/rule" - "github.com/pmezard/go-difflib/difflib" -) - -var exitError = fmt.Errorf("encountered changes while running diff") - -func diffFile(c *config.Config, f *rule.File) error { - rel, err := filepath.Rel(c.RepoRoot, f.Path) - if err != nil { - return fmt.Errorf("error getting old path for file %q: %v", f.Path, err) - } - rel = filepath.ToSlash(rel) - - date := "1970-01-01 00:00:00.000000000 +0000" - diff := difflib.UnifiedDiff{ - Context: 3, - FromDate: date, - ToDate: date, - } - - if oldContent, err := ioutil.ReadFile(f.Path); err != nil && !os.IsNotExist(err) { - return fmt.Errorf("error reading original file: %v", err) - } else if err != nil { - diff.FromFile = "/dev/null" - } else if err == nil { - diff.A = difflib.SplitLines(string(oldContent)) - if c.ReadBuildFilesDir == "" { - path, err := filepath.Rel(c.RepoRoot, f.Path) - if err != nil { - return fmt.Errorf("error getting old path for file %q: %v", f.Path, err) - } - diff.FromFile = filepath.ToSlash(path) - } else { - diff.FromFile = f.Path - } - } - - newContent := f.Format() - diff.B = difflib.SplitLines(string(newContent)) - outPath := findOutputPath(c, f) - if c.WriteBuildFilesDir == "" { - path, err := filepath.Rel(c.RepoRoot, f.Path) - if err != nil { - return fmt.Errorf("error getting new path for file %q: %v", f.Path, err) - } - diff.ToFile = filepath.ToSlash(path) - } else { - diff.ToFile = outPath - } - - uc := getUpdateConfig(c) - var out io.Writer = os.Stdout - if uc.patchPath != "" { - out = &uc.patchBuffer - } - if err := difflib.WriteUnifiedDiff(out, diff); err != nil { - return fmt.Errorf("error diffing %s: %v", f.Path, err) - } - if ds, _ := difflib.GetUnifiedDiffString(diff); ds != "" { - return exitError - } - - return nil -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/fix-update.go b/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/fix-update.go deleted file mode 100644 index 4544e68c233..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/fix-update.go +++ /dev/null @@ -1,592 +0,0 @@ -/* Copyright 2017 The Bazel Authors. 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 main - -import ( - "bytes" - "flag" - "fmt" - "io/ioutil" - "log" - "os" - "path/filepath" - "sort" - "strings" - - "github.com/bazelbuild/bazel-gazelle/config" - gzflag "github.com/bazelbuild/bazel-gazelle/flag" - "github.com/bazelbuild/bazel-gazelle/label" - "github.com/bazelbuild/bazel-gazelle/language" - "github.com/bazelbuild/bazel-gazelle/merger" - "github.com/bazelbuild/bazel-gazelle/repo" - "github.com/bazelbuild/bazel-gazelle/resolve" - "github.com/bazelbuild/bazel-gazelle/rule" - "github.com/bazelbuild/bazel-gazelle/walk" -) - -// updateConfig holds configuration information needed to run the fix and -// update commands. This includes everything in config.Config, but it also -// includes some additional fields that aren't relevant to other packages. -type updateConfig struct { - dirs []string - emit emitFunc - repos []repo.Repo - workspaceFiles []*rule.File - walkMode walk.Mode - patchPath string - patchBuffer bytes.Buffer -} - -type emitFunc func(c *config.Config, f *rule.File) error - -var modeFromName = map[string]emitFunc{ - "print": printFile, - "fix": fixFile, - "diff": diffFile, -} - -const updateName = "_update" - -func getUpdateConfig(c *config.Config) *updateConfig { - return c.Exts[updateName].(*updateConfig) -} - -type updateConfigurer struct { - mode string - recursive bool - knownImports []string - repoConfigPath string -} - -func (ucr *updateConfigurer) RegisterFlags(fs *flag.FlagSet, cmd string, c *config.Config) { - uc := &updateConfig{} - c.Exts[updateName] = uc - - c.ShouldFix = cmd == "fix" - - fs.StringVar(&ucr.mode, "mode", "fix", "print: prints all of the updated BUILD files\n\tfix: rewrites all of the BUILD files in place\n\tdiff: computes the rewrite but then just does a diff") - fs.BoolVar(&ucr.recursive, "r", true, "when true, gazelle will update subdirectories recursively") - fs.StringVar(&uc.patchPath, "patch", "", "when set with -mode=diff, gazelle will write to a file instead of stdout") - fs.Var(&gzflag.MultiFlag{Values: &ucr.knownImports}, "known_import", "import path for which external resolution is skipped (can specify multiple times)") - fs.StringVar(&ucr.repoConfigPath, "repo_config", "", "file where Gazelle should load repository configuration. Defaults to WORKSPACE.") -} - -func (ucr *updateConfigurer) CheckFlags(fs *flag.FlagSet, c *config.Config) error { - uc := getUpdateConfig(c) - - var ok bool - uc.emit, ok = modeFromName[ucr.mode] - if !ok { - return fmt.Errorf("unrecognized emit mode: %q", ucr.mode) - } - if uc.patchPath != "" && ucr.mode != "diff" { - return fmt.Errorf("-patch set but -mode is %s, not diff", ucr.mode) - } - - dirs := fs.Args() - if len(dirs) == 0 { - dirs = []string{"."} - } - uc.dirs = make([]string, len(dirs)) - for i := range dirs { - dir, err := filepath.Abs(dirs[i]) - if err != nil { - return fmt.Errorf("%s: failed to find absolute path: %v", dirs[i], err) - } - dir, err = filepath.EvalSymlinks(dir) - if err != nil { - return fmt.Errorf("%s: failed to resolve symlinks: %v", dirs[i], err) - } - if !isDescendingDir(dir, c.RepoRoot) { - return fmt.Errorf("dir %q is not a subdirectory of repo root %q", dir, c.RepoRoot) - } - uc.dirs[i] = dir - } - - if ucr.recursive { - uc.walkMode = walk.VisitAllUpdateSubdirsMode - } else if c.IndexLibraries { - uc.walkMode = walk.VisitAllUpdateDirsMode - } else { - uc.walkMode = walk.UpdateDirsMode - } - - // Load the repo configuration file (WORKSPACE by default) to find out - // names and prefixes of other go_repositories. This affects external - // dependency resolution for Go. - // TODO(jayconrod): Go-specific code should be moved to language/go. - if ucr.repoConfigPath == "" { - ucr.repoConfigPath = filepath.Join(c.RepoRoot, "WORKSPACE") - } - repoConfigFile, err := rule.LoadWorkspaceFile(ucr.repoConfigPath, "") - if err != nil && !os.IsNotExist(err) { - return err - } else if err == nil { - c.Repos, _, err = repo.ListRepositories(repoConfigFile) - if err != nil { - return err - } - } - for _, imp := range ucr.knownImports { - uc.repos = append(uc.repos, repo.Repo{ - Name: label.ImportPathToBazelRepoName(imp), - GoPrefix: imp, - }) - } - for _, r := range c.Repos { - if r.Kind() == "go_repository" { - uc.repos = append(uc.repos, repo.Repo{ - Name: r.Name(), - GoPrefix: r.AttrString("importpath"), - }) - } - } - - // If the repo configuration file is not WORKSPACE, also load WORKSPACE - // and any declared macro files so we can apply fixes. - workspacePath := filepath.Join(c.RepoRoot, "WORKSPACE") - var workspace *rule.File - if ucr.repoConfigPath == workspacePath { - workspace = repoConfigFile - } else { - workspace, err = rule.LoadWorkspaceFile(workspacePath, "") - if err != nil && !os.IsNotExist(err) { - return err - } - } - if workspace != nil { - c.RepoName = findWorkspaceName(workspace) - _, repoFileMap, err := repo.ListRepositories(workspace) - if err != nil { - return err - } - seen := make(map[*rule.File]bool) - for _, f := range repoFileMap { - if !seen[f] { - uc.workspaceFiles = append(uc.workspaceFiles, f) - seen[f] = true - } - } - sort.Slice(uc.workspaceFiles, func(i, j int) bool { - return uc.workspaceFiles[i].Path < uc.workspaceFiles[j].Path - }) - } - - return nil -} - -func (ucr *updateConfigurer) KnownDirectives() []string { return nil } - -func (ucr *updateConfigurer) Configure(c *config.Config, rel string, f *rule.File) {} - -// visitRecord stores information about about a directory visited with -// packages.Walk. -type visitRecord struct { - // pkgRel is the slash-separated path to the visited directory, relative to - // the repository root. "" for the repository root itself. - pkgRel string - - // c is the configuration for the directory with directives applied. - c *config.Config - - // rules is a list of generated Go rules. - rules []*rule.Rule - - // imports contains opaque import information for each rule in rules. - imports []interface{} - - // empty is a list of empty Go rules that may be deleted. - empty []*rule.Rule - - // file is the build file being processed. - file *rule.File - - // mappedKinds are mapped kinds used during this visit. - mappedKinds []config.MappedKind - mappedKindInfo map[string]rule.KindInfo -} - -type byPkgRel []visitRecord - -func (vs byPkgRel) Len() int { return len(vs) } -func (vs byPkgRel) Less(i, j int) bool { return vs[i].pkgRel < vs[j].pkgRel } -func (vs byPkgRel) Swap(i, j int) { vs[i], vs[j] = vs[j], vs[i] } - -var genericLoads = []rule.LoadInfo{ - { - Name: "@bazel_gazelle//:def.bzl", - Symbols: []string{"gazelle"}, - }, -} - -func runFixUpdate(cmd command, args []string) (err error) { - cexts := make([]config.Configurer, 0, len(languages)+3) - cexts = append(cexts, - &config.CommonConfigurer{}, - &updateConfigurer{}, - &walk.Configurer{}, - &resolve.Configurer{}) - mrslv := newMetaResolver() - kinds := make(map[string]rule.KindInfo) - loads := genericLoads - for _, lang := range languages { - cexts = append(cexts, lang) - for kind, info := range lang.Kinds() { - mrslv.AddBuiltin(kind, lang) - kinds[kind] = info - } - loads = append(loads, lang.Loads()...) - } - ruleIndex := resolve.NewRuleIndex(mrslv.Resolver) - - c, err := newFixUpdateConfiguration(cmd, args, cexts) - if err != nil { - return err - } - - if err := fixRepoFiles(c, loads); err != nil { - return err - } - - if cmd == fixCmd { - // Only check the version when "fix" is run. Generated build files - // frequently work with older version of rules_go, and we don't want to - // nag too much since there's no way to disable this warning. - checkRulesGoVersion(c.RepoRoot) - } - - // Visit all directories in the repository. - var visits []visitRecord - uc := getUpdateConfig(c) - walk.Walk(c, cexts, uc.dirs, uc.walkMode, func(dir, rel string, c *config.Config, update bool, f *rule.File, subdirs, regularFiles, genFiles []string) { - // If this file is ignored or if Gazelle was not asked to update this - // directory, just index the build file and move on. - if !update { - if c.IndexLibraries && f != nil { - for _, r := range f.Rules { - ruleIndex.AddRule(c, r, f) - } - } - return - } - - // Fix any problems in the file. - if f != nil { - for _, l := range languages { - l.Fix(c, f) - } - } - - // Generate rules. - var empty, gen []*rule.Rule - var imports []interface{} - for _, l := range languages { - res := l.GenerateRules(language.GenerateArgs{ - Config: c, - Dir: dir, - Rel: rel, - File: f, - Subdirs: subdirs, - RegularFiles: regularFiles, - GenFiles: genFiles, - OtherEmpty: empty, - OtherGen: gen}) - if len(res.Gen) != len(res.Imports) { - log.Panicf("%s: language %s generated %d rules but returned %d imports", rel, l.Name(), len(res.Gen), len(res.Imports)) - } - empty = append(empty, res.Empty...) - gen = append(gen, res.Gen...) - imports = append(imports, res.Imports...) - } - if f == nil && len(gen) == 0 { - return - } - - // Apply and record relevant kind mappings. - var ( - mappedKinds []config.MappedKind - mappedKindInfo = make(map[string]rule.KindInfo) - ) - for _, r := range gen { - if repl, ok := c.KindMap[r.Kind()]; ok { - mappedKindInfo[repl.KindName] = kinds[r.Kind()] - mappedKinds = append(mappedKinds, repl) - mrslv.MappedKind(rel, repl) - r.SetKind(repl.KindName) - } - } - - // Insert or merge rules into the build file. - if f == nil { - f = rule.EmptyFile(filepath.Join(dir, c.DefaultBuildFileName()), rel) - for _, r := range gen { - r.Insert(f) - } - } else { - merger.MergeFile(f, empty, gen, merger.PreResolve, - unionKindInfoMaps(kinds, mappedKindInfo)) - } - visits = append(visits, visitRecord{ - pkgRel: rel, - c: c, - rules: gen, - imports: imports, - empty: empty, - file: f, - mappedKinds: mappedKinds, - mappedKindInfo: mappedKindInfo, - }) - - // Add library rules to the dependency resolution table. - if c.IndexLibraries { - for _, r := range f.Rules { - ruleIndex.AddRule(c, r, f) - } - } - }) - - // Finish building the index for dependency resolution. - ruleIndex.Finish() - - // Resolve dependencies. - rc, cleanupRc := repo.NewRemoteCache(uc.repos) - defer func() { - if cerr := cleanupRc(); err == nil && cerr != nil { - err = cerr - } - }() - for _, v := range visits { - for i, r := range v.rules { - from := label.New(c.RepoName, v.pkgRel, r.Name()) - mrslv.Resolver(r, v.pkgRel).Resolve(v.c, ruleIndex, rc, r, v.imports[i], from) - } - merger.MergeFile(v.file, v.empty, v.rules, merger.PostResolve, - unionKindInfoMaps(kinds, v.mappedKindInfo)) - } - - // Emit merged files. - var exit error - for _, v := range visits { - merger.FixLoads(v.file, applyKindMappings(v.mappedKinds, loads)) - if err := uc.emit(v.c, v.file); err != nil { - if err == exitError { - exit = err - } else { - log.Print(err) - } - } - } - if uc.patchPath != "" { - if err := ioutil.WriteFile(uc.patchPath, uc.patchBuffer.Bytes(), 0666); err != nil { - return err - } - } - - return exit -} - -func newFixUpdateConfiguration(cmd command, args []string, cexts []config.Configurer) (*config.Config, error) { - c := config.New() - - fs := flag.NewFlagSet("gazelle", flag.ContinueOnError) - // Flag will call this on any parse error. Don't print usage unless - // -h or -help were passed explicitly. - fs.Usage = func() {} - - for _, cext := range cexts { - cext.RegisterFlags(fs, cmd.String(), c) - } - - if err := fs.Parse(args); err != nil { - if err == flag.ErrHelp { - fixUpdateUsage(fs) - return nil, err - } - // flag already prints the error; don't print it again. - log.Fatal("Try -help for more information.") - } - - for _, cext := range cexts { - if err := cext.CheckFlags(fs, c); err != nil { - return nil, err - } - } - - return c, nil -} - -func fixUpdateUsage(fs *flag.FlagSet) { - fmt.Fprint(os.Stderr, `usage: gazelle [fix|update] [flags...] [package-dirs...] - -The update command creates new build files and update existing BUILD files -when needed. - -The fix command also creates and updates build files, and in addition, it may -make potentially breaking updates to usage of rules. For example, it may -delete obsolete rules or rename existing rules. - -There are several output modes which can be selected with the -mode flag. The -output mode determines what Gazelle does with updated BUILD files. - - fix (default) - write updated BUILD files back to disk. - print - print updated BUILD files to stdout. - diff - diff updated BUILD files against existing files in unified format. - -Gazelle accepts a list of paths to Go package directories to process (defaults -to the working directory if none are given). It recursively traverses -subdirectories. All directories must be under the directory specified by --repo_root; if -repo_root is not given, this is the directory containing the -WORKSPACE file. - -FLAGS: - -`) - fs.PrintDefaults() -} - -func fixRepoFiles(c *config.Config, loads []rule.LoadInfo) error { - uc := getUpdateConfig(c) - if !c.ShouldFix { - return nil - } - shouldFix := false - for _, d := range uc.dirs { - if d == c.RepoRoot { - shouldFix = true - } - } - if !shouldFix { - return nil - } - - for _, f := range uc.workspaceFiles { - merger.FixLoads(f, loads) - if f.Path == filepath.Join(c.RepoRoot, "WORKSPACE") { - removeLegacyGoRepository(f) - if err := merger.CheckGazelleLoaded(f); err != nil { - return err - } - } - if err := uc.emit(c, f); err != nil { - return err - } - } - return nil -} - -// removeLegacyGoRepository removes loads of go_repository from -// @io_bazel_rules_go. FixLoads should be called after this; it will load from -// @bazel_gazelle. -func removeLegacyGoRepository(f *rule.File) { - for _, l := range f.Loads { - if l.Name() == "@io_bazel_rules_go//go:def.bzl" { - l.Remove("go_repository") - if l.IsEmpty() { - l.Delete() - } - } - } -} - -func findWorkspaceName(f *rule.File) string { - for _, r := range f.Rules { - if r.Kind() == "workspace" { - return r.Name() - } - } - return "" -} - -func isDescendingDir(dir, root string) bool { - rel, err := filepath.Rel(root, dir) - if err != nil { - return false - } - if rel == "." { - return true - } - return !strings.HasPrefix(rel, "..") -} - -func findOutputPath(c *config.Config, f *rule.File) string { - if c.ReadBuildFilesDir == "" && c.WriteBuildFilesDir == "" { - return f.Path - } - baseDir := c.WriteBuildFilesDir - if c.WriteBuildFilesDir == "" { - baseDir = c.RepoRoot - } - outputDir := filepath.Join(baseDir, filepath.FromSlash(f.Pkg)) - defaultOutputPath := filepath.Join(outputDir, c.DefaultBuildFileName()) - files, err := ioutil.ReadDir(outputDir) - if err != nil { - // Ignore error. Directory probably doesn't exist. - return defaultOutputPath - } - outputPath := rule.MatchBuildFileName(outputDir, c.ValidBuildFileNames, files) - if outputPath == "" { - return defaultOutputPath - } - return outputPath -} - -func unionKindInfoMaps(a, b map[string]rule.KindInfo) map[string]rule.KindInfo { - if len(a) == 0 { - return b - } - if len(b) == 0 { - return a - } - result := make(map[string]rule.KindInfo, len(a)+len(b)) - for _, m := range []map[string]rule.KindInfo{a, b} { - for k, v := range m { - result[k] = v - } - } - return result -} - -// applyKindMappings returns a copy of LoadInfo that includes c.KindMap. -func applyKindMappings(mappedKinds []config.MappedKind, loads []rule.LoadInfo) []rule.LoadInfo { - if len(mappedKinds) == 0 { - return loads - } - - // Add new RuleInfos or replace existing ones with merged ones. - mappedLoads := make([]rule.LoadInfo, len(loads)) - copy(mappedLoads, loads) - for _, mappedKind := range mappedKinds { - mappedLoads = appendOrMergeKindMapping(mappedLoads, mappedKind) - } - return mappedLoads -} - -// appendOrMergeKindMapping adds LoadInfo for the given replacement. -func appendOrMergeKindMapping(mappedLoads []rule.LoadInfo, mappedKind config.MappedKind) []rule.LoadInfo { - // If mappedKind.KindLoad already exists in the list, create a merged copy. - for i, load := range mappedLoads { - if load.Name == mappedKind.KindLoad { - mappedLoads[i].Symbols = append(load.Symbols, mappedKind.KindName) - return mappedLoads - } - } - - // Add a new LoadInfo. - return append(mappedLoads, rule.LoadInfo{ - Name: mappedKind.KindLoad, - Symbols: []string{mappedKind.KindName}, - }) -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/fix.go b/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/fix.go deleted file mode 100644 index 2b67bdd56ec..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/fix.go +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright 2016 The Bazel Authors. 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 main - -import ( - "io/ioutil" - "os" - "path/filepath" - - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -func fixFile(c *config.Config, f *rule.File) error { - outPath := findOutputPath(c, f) - if err := os.MkdirAll(filepath.Dir(outPath), 0777); err != nil { - return err - } - return ioutil.WriteFile(outPath, f.Format(), 0666) -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/gazelle.go b/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/gazelle.go deleted file mode 100644 index 8ad9f9b3b17..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/gazelle.go +++ /dev/null @@ -1,124 +0,0 @@ -/* Copyright 2016 The Bazel Authors. 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. -*/ - -// Command gazelle is a BUILD file generator for Go projects. -// See "gazelle --help" for more details. -package main - -import ( - "flag" - "fmt" - "log" - "os" -) - -type command int - -const ( - updateCmd command = iota - fixCmd - updateReposCmd - helpCmd -) - -var commandFromName = map[string]command{ - "fix": fixCmd, - "help": helpCmd, - "update": updateCmd, - "update-repos": updateReposCmd, -} - -var nameFromCommand = []string{ - // keep in sync with definition above - "update", - "fix", - "update-repos", - "help", -} - -func (cmd command) String() string { - return nameFromCommand[cmd] -} - -func main() { - log.SetPrefix("gazelle: ") - log.SetFlags(0) // don't print timestamps - - if err := run(os.Args[1:]); err != nil && err != flag.ErrHelp { - if err == exitError { - os.Exit(1) - } else { - log.Fatal(err) - } - } -} - -func run(args []string) error { - cmd := updateCmd - if len(args) == 1 && (args[0] == "-h" || args[0] == "-help" || args[0] == "--help") { - cmd = helpCmd - } else if len(args) > 0 { - c, ok := commandFromName[args[0]] - if ok { - cmd = c - args = args[1:] - } - } - - switch cmd { - case fixCmd, updateCmd: - return runFixUpdate(cmd, args) - case helpCmd: - return help() - case updateReposCmd: - return updateRepos(args) - default: - log.Panicf("unknown command: %v", cmd) - } - return nil -} - -func help() error { - fmt.Fprint(os.Stderr, `usage: gazelle [args...] - -Gazelle is a BUILD file generator for Go projects. It can create new BUILD files -for a project that follows "go build" conventions, and it can update BUILD files -if they already exist. It can be invoked directly in a project workspace, or -it can be run on an external dependency during the build as part of the -go_repository rule. - -Gazelle may be run with one of the commands below. If no command is given, -Gazelle defaults to "update". - - update - Gazelle will create new BUILD files or update existing BUILD files - if needed. - fix - in addition to the changes made in update, Gazelle will make potentially - breaking changes. For example, it may delete obsolete rules or rename - existing rules. - update-repos - updates repository rules in the WORKSPACE file. Run with - -h for details. - help - show this message. - -For usage information for a specific command, run the command with the -h flag. -For example: - - gazelle update -h - -Gazelle is under active development, and its interface may change -without notice. - -`) - return flag.ErrHelp -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/langs.go b/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/langs.go deleted file mode 100644 index 0f8e1125578..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/langs.go +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 main - -import ( - "github.com/bazelbuild/bazel-gazelle/language" - "github.com/bazelbuild/bazel-gazelle/language/go" - "github.com/bazelbuild/bazel-gazelle/language/proto" -) - -var languages = []language.Language{ - proto.NewLanguage(), - golang.NewLanguage(), -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/metaresolver.go b/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/metaresolver.go deleted file mode 100644 index 028c4f206b5..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/metaresolver.go +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright 2019 The Bazel Authors. 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 main - -import ( - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/resolve" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -// metaResolver provides a rule.Resolver for any rule.Rule. -type metaResolver struct { - // builtins provides a map of the language kinds to their resolver. - builtins map[string]resolve.Resolver - - // mappedKinds provides a list of replacements used by File.Pkg. - mappedKinds map[string][]config.MappedKind -} - -func newMetaResolver() *metaResolver { - return &metaResolver{ - builtins: make(map[string]resolve.Resolver), - mappedKinds: make(map[string][]config.MappedKind), - } -} - -// AddBuiltin registers a builtin kind with its info. -func (mr *metaResolver) AddBuiltin(kindName string, resolver resolve.Resolver) { - mr.builtins[kindName] = resolver -} - -// MappedKind records the fact that the given mapping was applied while -// processing the given package. -func (mr *metaResolver) MappedKind(pkgRel string, kind config.MappedKind) { - mr.mappedKinds[pkgRel] = append(mr.mappedKinds[pkgRel], kind) -} - -// Resolver returns a resolver for the given rule and package, and a bool -// indicating whether one was found. Empty string may be passed for pkgRel, -// which results in consulting the builtin kinds only. -func (mr metaResolver) Resolver(r *rule.Rule, pkgRel string) resolve.Resolver { - for _, mappedKind := range mr.mappedKinds[pkgRel] { - if mappedKind.KindName == r.Kind() { - return mr.builtins[mappedKind.FromKind] - } - } - return mr.builtins[r.Kind()] -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/print.go b/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/print.go deleted file mode 100644 index bf99031124c..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/print.go +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright 2016 The Bazel Authors. 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 main - -import ( - "os" - - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -func printFile(c *config.Config, f *rule.File) error { - content := f.Format() - _, err := os.Stdout.Write(content) - return err -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/update-repos.go b/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/update-repos.go deleted file mode 100644 index 0de7d43d786..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/update-repos.go +++ /dev/null @@ -1,368 +0,0 @@ -/* Copyright 2017 The Bazel Authors. 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 main - -import ( - "errors" - "flag" - "fmt" - "os" - "path/filepath" - "sort" - "strings" - - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/language" - "github.com/bazelbuild/bazel-gazelle/merger" - "github.com/bazelbuild/bazel-gazelle/repo" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -type updateReposConfig struct { - repoFilePath string - importPaths []string - macroFileName string - macroDefName string - pruneRules bool - workspace *rule.File - repoFileMap map[string]*rule.File -} - -const updateReposName = "_update-repos" - -func getUpdateReposConfig(c *config.Config) *updateReposConfig { - return c.Exts[updateReposName].(*updateReposConfig) -} - -type updateReposConfigurer struct{} - -type macroFlag struct { - macroFileName *string - macroDefName *string -} - -func (f macroFlag) Set(value string) error { - args := strings.Split(value, "%") - if len(args) != 2 { - return fmt.Errorf("Failure parsing to_macro: %s, expected format is macroFile%%defName", value) - } - if strings.HasPrefix(args[0], "..") { - return fmt.Errorf("Failure parsing to_macro: %s, macro file path %s should not start with \"..\"", value, args[0]) - } - *f.macroFileName = args[0] - *f.macroDefName = args[1] - return nil -} - -func (f macroFlag) String() string { - return "" -} - -func (*updateReposConfigurer) RegisterFlags(fs *flag.FlagSet, cmd string, c *config.Config) { - uc := &updateReposConfig{} - c.Exts[updateReposName] = uc - fs.StringVar(&uc.repoFilePath, "from_file", "", "Gazelle will translate repositories listed in this file into repository rules in WORKSPACE or a .bzl macro function. Gopkg.lock and go.mod files are supported") - fs.Var(macroFlag{macroFileName: &uc.macroFileName, macroDefName: &uc.macroDefName}, "to_macro", "Tells Gazelle to write repository rules into a .bzl macro function rather than the WORKSPACE file. . The expected format is: macroFile%defName") - fs.BoolVar(&uc.pruneRules, "prune", false, "When enabled, Gazelle will remove rules that no longer have equivalent repos in the Gopkg.lock/go.mod file. Can only used with -from_file.") -} - -func (*updateReposConfigurer) CheckFlags(fs *flag.FlagSet, c *config.Config) error { - uc := getUpdateReposConfig(c) - switch { - case uc.repoFilePath != "": - if len(fs.Args()) != 0 { - return fmt.Errorf("got %d positional arguments with -from_file; wanted 0.\nTry -help for more information.", len(fs.Args())) - } - - default: - if len(fs.Args()) == 0 { - return fmt.Errorf("no repositories specified\nTry -help for more information.") - } - if uc.pruneRules { - return fmt.Errorf("the -prune option can only be used with -from_file") - } - uc.importPaths = fs.Args() - } - - var err error - workspacePath := filepath.Join(c.RepoRoot, "WORKSPACE") - uc.workspace, err = rule.LoadWorkspaceFile(workspacePath, "") - if err != nil { - return fmt.Errorf("loading WORKSPACE file: %v", err) - } - c.Repos, uc.repoFileMap, err = repo.ListRepositories(uc.workspace) - if err != nil { - return fmt.Errorf("loading WORKSPACE file: %v", err) - } - - return nil -} - -func (*updateReposConfigurer) KnownDirectives() []string { return nil } - -func (*updateReposConfigurer) Configure(c *config.Config, rel string, f *rule.File) {} - -func updateRepos(args []string) (err error) { - // Build configuration with all languages. - cexts := make([]config.Configurer, 0, len(languages)+2) - cexts = append(cexts, &config.CommonConfigurer{}, &updateReposConfigurer{}) - kinds := make(map[string]rule.KindInfo) - loads := []rule.LoadInfo{} - for _, lang := range languages { - cexts = append(cexts, lang) - loads = append(loads, lang.Loads()...) - for kind, info := range lang.Kinds() { - kinds[kind] = info - } - } - c, err := newUpdateReposConfiguration(args, cexts) - if err != nil { - return err - } - uc := getUpdateReposConfig(c) - - // TODO(jayconrod): move Go-specific RemoteCache logic to language/go. - var knownRepos []repo.Repo - for _, r := range c.Repos { - if r.Kind() == "go_repository" { - knownRepos = append(knownRepos, repo.Repo{ - Name: r.Name(), - GoPrefix: r.AttrString("importpath"), - Remote: r.AttrString("remote"), - VCS: r.AttrString("vcs"), - }) - } - } - rc, cleanup := repo.NewRemoteCache(knownRepos) - defer func() { - if cerr := cleanup(); err == nil && cerr != nil { - err = cerr - } - }() - - // Fix the workspace file with each language. - for _, lang := range languages { - lang.Fix(c, uc.workspace) - } - - // Generate rules from command language arguments or by importing a file. - var gen, empty []*rule.Rule - if uc.repoFilePath == "" { - gen, err = updateRepoImports(c, rc) - } else { - gen, empty, err = importRepos(c, rc) - } - if err != nil { - return err - } - - // Organize generated and empty rules by file. A rule should go into the file - // it came from (by name). New rules should go into WORKSPACE or the file - // specified with -to_macro. - var newGen []*rule.Rule - genForFiles := make(map[*rule.File][]*rule.Rule) - emptyForFiles := make(map[*rule.File][]*rule.Rule) - for _, r := range gen { - f := uc.repoFileMap[r.Name()] - if f != nil { - genForFiles[f] = append(genForFiles[f], r) - } else { - newGen = append(newGen, r) - } - } - for _, r := range empty { - f := uc.repoFileMap[r.Name()] - if f == nil { - panic(fmt.Sprintf("empty rule %q for deletion that was not found", r.Name())) - } - emptyForFiles[f] = append(emptyForFiles[f], r) - } - - var newGenFile *rule.File - var macroPath string - if uc.macroFileName != "" { - macroPath = filepath.Join(c.RepoRoot, filepath.Clean(uc.macroFileName)) - } - for f := range genForFiles { - if macroPath == "" && filepath.Base(f.Path) == "WORKSPACE" || - macroPath != "" && f.Path == macroPath && f.DefName == uc.macroDefName { - newGenFile = f - break - } - } - if newGenFile == nil { - if uc.macroFileName == "" { - newGenFile = uc.workspace - } else { - var err error - newGenFile, err = rule.LoadMacroFile(macroPath, "", uc.macroDefName) - if os.IsNotExist(err) { - newGenFile, err = rule.EmptyMacroFile(macroPath, "", uc.macroDefName) - if err != nil { - return fmt.Errorf("error creating %q: %v", macroPath, err) - } - } else if err != nil { - return fmt.Errorf("error loading %q: %v", macroPath, err) - } - } - } - genForFiles[newGenFile] = append(genForFiles[newGenFile], newGen...) - - // Merge rules and fix loads in each file. - seenFile := make(map[*rule.File]bool) - sortedFiles := make([]*rule.File, 0, len(genForFiles)) - for f := range genForFiles { - if !seenFile[f] { - seenFile[f] = true - sortedFiles = append(sortedFiles, f) - } - } - for f := range emptyForFiles { - if !seenFile[f] { - seenFile[f] = true - sortedFiles = append(sortedFiles, f) - } - } - sort.Slice(sortedFiles, func(i, j int) bool { - if cmp := strings.Compare(sortedFiles[i].Path, sortedFiles[j].Path); cmp != 0 { - return cmp < 0 - } - return sortedFiles[i].DefName < sortedFiles[j].DefName - }) - - updatedFiles := make(map[string]*rule.File) - for _, f := range sortedFiles { - merger.MergeFile(f, emptyForFiles[f], genForFiles[f], merger.PreResolve, kinds) - merger.FixLoads(f, loads) - if f == uc.workspace { - if err := merger.CheckGazelleLoaded(f); err != nil { - return err - } - } - f.Sync() - if uf, ok := updatedFiles[f.Path]; ok { - uf.SyncMacroFile(f) - } else { - updatedFiles[f.Path] = f - } - } - for _, f := range sortedFiles { - if uf := updatedFiles[f.Path]; uf != nil { - if err := uf.Save(uf.Path); err != nil { - return err - } - delete(updatedFiles, f.Path) - } - } - - return nil -} - -func newUpdateReposConfiguration(args []string, cexts []config.Configurer) (*config.Config, error) { - c := config.New() - fs := flag.NewFlagSet("gazelle", flag.ContinueOnError) - // Flag will call this on any parse error. Don't print usage unless - // -h or -help were passed explicitly. - fs.Usage = func() {} - for _, cext := range cexts { - cext.RegisterFlags(fs, "update-repos", c) - } - if err := fs.Parse(args); err != nil { - if err == flag.ErrHelp { - updateReposUsage(fs) - return nil, err - } - // flag already prints the error; don't print it again. - return nil, errors.New("Try -help for more information") - } - for _, cext := range cexts { - if err := cext.CheckFlags(fs, c); err != nil { - return nil, err - } - } - return c, nil -} - -func updateReposUsage(fs *flag.FlagSet) { - fmt.Fprint(os.Stderr, `usage: - -# Add/update repositories by import path -gazelle update-repos example.com/repo1 example.com/repo2 - -# Import repositories from lock file -gazelle update-repos -from_file=file - -The update-repos command updates repository rules in the WORKSPACE file. -update-repos can add or update repositories explicitly by import path. -update-repos can also import repository rules from a vendoring tool's lock -file (currently only deps' Gopkg.lock is supported). - -FLAGS: - -`) - fs.PrintDefaults() -} - -func updateRepoImports(c *config.Config, rc *repo.RemoteCache) (gen []*rule.Rule, err error) { - // TODO(jayconrod): let the user pick the language with a command line flag. - // For now, only use the first language that implements the interface. - uc := getUpdateReposConfig(c) - var updater language.RepoUpdater - for _, lang := range languages { - if u, ok := lang.(language.RepoUpdater); ok { - updater = u - break - } - } - if updater == nil { - return nil, fmt.Errorf("no languages can update repositories") - } - res := updater.UpdateRepos(language.UpdateReposArgs{ - Config: c, - Imports: uc.importPaths, - Cache: rc, - }) - return res.Gen, res.Error -} - -func importRepos(c *config.Config, rc *repo.RemoteCache) (gen, empty []*rule.Rule, err error) { - uc := getUpdateReposConfig(c) - importSupported := false - var importer language.RepoImporter - for _, lang := range languages { - if i, ok := lang.(language.RepoImporter); ok { - importSupported = true - if i.CanImport(uc.repoFilePath) { - importer = i - break - } - } - } - if importer == nil { - if importSupported { - return nil, nil, fmt.Errorf("unknown file format: %s", uc.repoFilePath) - } else { - return nil, nil, fmt.Errorf("no supported languages can import configuration files") - } - } - res := importer.ImportRepos(language.ImportReposArgs{ - Config: c, - Path: uc.repoFilePath, - Prune: uc.pruneRules, - Cache: rc, - }) - return res.Gen, res.Empty, res.Error -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/version.go b/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/version.go deleted file mode 100644 index a281dfb7790..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/cmd/gazelle/version.go +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 main - -import ( - "io/ioutil" - "log" - "path/filepath" - "regexp" - - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/internal/version" - "github.com/bazelbuild/bazel-gazelle/repo" -) - -var minimumRulesGoVersion = version.Version{0, 19, 0} - -// checkRulesGoVersion checks whether a compatible version of rules_go is -// being used in the workspace. A message will be logged if an incompatible -// version is found. -// -// Note that we can't always determine the version of rules_go in use. Also, -// if we find an incompatible version, we shouldn't bail out since the -// incompatibility may not matter in the current workspace. -func checkRulesGoVersion(repoRoot string) { - const message = `Gazelle may not be compatible with this version of rules_go. -Update io_bazel_rules_go to a newer version in your WORKSPACE file.` - - rulesGoPath, err := repo.FindExternalRepo(repoRoot, config.RulesGoRepoName) - if err != nil { - return - } - defBzlPath := filepath.Join(rulesGoPath, "go", "def.bzl") - defBzlContent, err := ioutil.ReadFile(defBzlPath) - if err != nil { - return - } - versionRe := regexp.MustCompile(`(?m)^RULES_GO_VERSION = ['"]([0-9.]*)['"]`) - match := versionRe.FindSubmatch(defBzlContent) - if match == nil { - log.Printf("RULES_GO_VERSION not found in @%s//go:def.bzl.\n%s", config.RulesGoRepoName, message) - return - } - vstr := string(match[1]) - v, err := version.ParseVersion(vstr) - if err != nil { - log.Printf("RULES_GO_VERSION %q could not be parsed in @%s//go:def.bzl.\n%s", vstr, config.RulesGoRepoName, message) - } - if v.Compare(minimumRulesGoVersion) < 0 { - log.Printf("Found RULES_GO_VERSION %s. Minimum compatible version is %s.\n%s", v, minimumRulesGoVersion, message) - } -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/config/BUILD b/vendor/github.com/bazelbuild/bazel-gazelle/config/BUILD deleted file mode 100644 index 1e189b2370c..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/config/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "config.go", - "constants.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/bazel-gazelle/config", - importpath = "github.com/bazelbuild/bazel-gazelle/config", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/bazelbuild/bazel-gazelle/internal/wspace:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/rule:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/config/config.go b/vendor/github.com/bazelbuild/bazel-gazelle/config/config.go deleted file mode 100644 index 27c407041db..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/config/config.go +++ /dev/null @@ -1,252 +0,0 @@ -/* Copyright 2017 The Bazel Authors. 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 config provides extensible configuration for Gazelle libraries. -// -// Packages may define Configurers which add support for new command-line -// options and directive comments in build files. Note that the -// language.Language interface embeds Configurer, so each language extension -// has the opportunity -// -// When Gazelle walks the directory trees in a repository, it calls the -// Configure method of each Configurer to produce a Config object. -// Config objects are passed as arguments to most functions in Gazelle, so -// this mechanism may be used to control many aspects of Gazelle's behavior. -package config - -import ( - "flag" - "fmt" - "log" - "path/filepath" - "strings" - - "github.com/bazelbuild/bazel-gazelle/internal/wspace" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -// Config holds information about how Gazelle should run. This is based on -// command line arguments, directives, other hints in build files. -// -// A Config applies to a single directory. A Config is created for the -// repository root directory, then copied and modified for each subdirectory. -// -// Config itself contains only general information. Most configuration -// information is language-specific and is stored in Exts. This information -// is modified by extensions that implement Configurer. -type Config struct { - // RepoRoot is the absolute, canonical path to the root directory of the - // repository with all symlinks resolved. - RepoRoot string - - // RepoName is the name of the repository. - RepoName string - - // ReadBuildFilesDir is the absolute path to a directory where - // build files should be read from instead of RepoRoot. - ReadBuildFilesDir string - - // WriteBuildFilesDir is the absolute path to a directory where - // build files should be written to instead of RepoRoot. - WriteBuildFilesDir string - - // ValidBuildFileNames is a list of base names that are considered valid - // build files. Some repositories may have files named "BUILD" that are not - // used by Bazel and should be ignored. Must contain at least one string. - ValidBuildFileNames []string - - // ShouldFix determines whether Gazelle attempts to remove and replace - // usage of deprecated rules. - ShouldFix bool - - // IndexLibraries determines whether Gazelle should build an index of - // libraries in the workspace for dependency resolution - IndexLibraries bool - - // KindMap maps from a kind name to its replacement. It provides a way for - // users to customize the kind of rules created by Gazelle, via - // # gazelle:map_kind. - KindMap map[string]MappedKind - - // Repos is a list of repository rules declared in the main WORKSPACE file - // or in macros called by the main WORKSPACE file. This may affect rule - // generation and dependency resolution. - Repos []*rule.Rule - - // Exts is a set of configurable extensions. Generally, each language - // has its own set of extensions, but other modules may provide their own - // extensions as well. Values in here may be populated by command line - // arguments, directives in build files, or other mechanisms. - Exts map[string]interface{} -} - -// MappedKind describes a replacement to use for a built-in kind. -type MappedKind struct { - FromKind, KindName, KindLoad string -} - -func New() *Config { - return &Config{ - ValidBuildFileNames: DefaultValidBuildFileNames, - Exts: make(map[string]interface{}), - } -} - -// Clone creates a copy of the configuration for use in a subdirectory. -// Note that the Exts map is copied, but its contents are not. -// Configurer.Configure should do this, if needed. -func (c *Config) Clone() *Config { - cc := *c - cc.Exts = make(map[string]interface{}) - for k, v := range c.Exts { - cc.Exts[k] = v - } - cc.KindMap = make(map[string]MappedKind) - for k, v := range c.KindMap { - cc.KindMap[k] = v - } - return &cc -} - -var DefaultValidBuildFileNames = []string{"BUILD.bazel", "BUILD"} - -// IsValidBuildFileName returns true if a file with the given base name -// should be treated as a build file. -func (c *Config) IsValidBuildFileName(name string) bool { - for _, n := range c.ValidBuildFileNames { - if name == n { - return true - } - } - return false -} - -// DefaultBuildFileName returns the base name used to create new build files. -func (c *Config) DefaultBuildFileName() string { - return c.ValidBuildFileNames[0] -} - -// Configurer is the interface for language or library-specific configuration -// extensions. Most (ideally all) modifications to Config should happen -// via this interface. -type Configurer interface { - // RegisterFlags registers command-line flags used by the extension. This - // method is called once with the root configuration when Gazelle - // starts. RegisterFlags may set an initial values in Config.Exts. When flags - // are set, they should modify these values. - RegisterFlags(fs *flag.FlagSet, cmd string, c *Config) - - // CheckFlags validates the configuration after command line flags are parsed. - // This is called once with the root configuration when Gazelle starts. - // CheckFlags may set default values in flags or make implied changes. - CheckFlags(fs *flag.FlagSet, c *Config) error - - // KnownDirectives returns a list of directive keys that this Configurer can - // interpret. Gazelle prints errors for directives that are not recoginized by - // any Configurer. - KnownDirectives() []string - - // Configure modifies the configuration using directives and other information - // extracted from a build file. Configure is called in each directory. - // - // c is the configuration for the current directory. It starts out as a copy - // of the configuration for the parent directory. - // - // rel is the slash-separated relative path from the repository root to - // the current directory. It is "" for the root directory itself. - // - // f is the build file for the current directory or nil if there is no - // existing build file. - Configure(c *Config, rel string, f *rule.File) -} - -// CommonConfigurer handles language-agnostic command-line flags and directives, -// i.e., those that apply to Config itself and not to Config.Exts. -type CommonConfigurer struct { - repoRoot, buildFileNames, readBuildFilesDir, writeBuildFilesDir string - indexLibraries bool -} - -func (cc *CommonConfigurer) RegisterFlags(fs *flag.FlagSet, cmd string, c *Config) { - fs.StringVar(&cc.repoRoot, "repo_root", "", "path to a directory which corresponds to go_prefix, otherwise gazelle searches for it.") - fs.StringVar(&cc.buildFileNames, "build_file_name", strings.Join(DefaultValidBuildFileNames, ","), "comma-separated list of valid build file names.\nThe first element of the list is the name of output build files to generate.") - fs.BoolVar(&cc.indexLibraries, "index", true, "when true, gazelle will build an index of libraries in the workspace for dependency resolution") - fs.StringVar(&cc.readBuildFilesDir, "experimental_read_build_files_dir", "", "path to a directory where build files should be read from (instead of -repo_root)") - fs.StringVar(&cc.writeBuildFilesDir, "experimental_write_build_files_dir", "", "path to a directory where build files should be written to (instead of -repo_root)") -} - -func (cc *CommonConfigurer) CheckFlags(fs *flag.FlagSet, c *Config) error { - var err error - if cc.repoRoot == "" { - cc.repoRoot, err = wspace.Find(".") - if err != nil { - return fmt.Errorf("-repo_root not specified, and WORKSPACE cannot be found: %v", err) - } - } - c.RepoRoot, err = filepath.Abs(cc.repoRoot) - if err != nil { - return fmt.Errorf("%s: failed to find absolute path of repo root: %v", cc.repoRoot, err) - } - c.RepoRoot, err = filepath.EvalSymlinks(c.RepoRoot) - if err != nil { - return fmt.Errorf("%s: failed to resolve symlinks: %v", cc.repoRoot, err) - } - c.ValidBuildFileNames = strings.Split(cc.buildFileNames, ",") - if cc.readBuildFilesDir != "" { - c.ReadBuildFilesDir, err = filepath.Abs(cc.readBuildFilesDir) - if err != nil { - return fmt.Errorf("%s: failed to find absolute path of -read_build_files_dir: %v", cc.readBuildFilesDir, err) - } - } - if cc.writeBuildFilesDir != "" { - c.WriteBuildFilesDir, err = filepath.Abs(cc.writeBuildFilesDir) - if err != nil { - return fmt.Errorf("%s: failed to find absolute path of -write_build_files_dir: %v", cc.writeBuildFilesDir, err) - } - } - c.IndexLibraries = cc.indexLibraries - return nil -} - -func (cc *CommonConfigurer) KnownDirectives() []string { - return []string{"build_file_name", "map_kind"} -} - -func (cc *CommonConfigurer) Configure(c *Config, rel string, f *rule.File) { - if f == nil { - return - } - for _, d := range f.Directives { - switch d.Key { - case "build_file_name": - c.ValidBuildFileNames = strings.Split(d.Value, ",") - - case "map_kind": - vals := strings.Fields(d.Value) - if len(vals) != 3 { - log.Printf("expected three arguments (gazelle:map_kind from_kind to_kind load_file), got %v", vals) - continue - } - if c.KindMap == nil { - c.KindMap = make(map[string]MappedKind) - } - c.KindMap[vals[0]] = MappedKind{ - FromKind: vals[0], - KindName: vals[1], - KindLoad: vals[2], - } - } - } -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/config/constants.go b/vendor/github.com/bazelbuild/bazel-gazelle/config/constants.go deleted file mode 100644 index 7bbddf82284..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/config/constants.go +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2017 The Bazel Authors. 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 config - -const ( - // RulesGoRepoName is the canonical name of the rules_go repository. It must - // match the workspace name in WORKSPACE. - // TODO(jayconrod): move to language/go. - RulesGoRepoName = "io_bazel_rules_go" - - // GazelleImportsKey is an internal attribute that lists imported packages - // on generated rules. It is replaced with "deps" during import resolution. - GazelleImportsKey = "_gazelle_imports" -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/flag/BUILD b/vendor/github.com/bazelbuild/bazel-gazelle/flag/BUILD deleted file mode 100644 index 21b2c7fb5f8..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/flag/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["flag.go"], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/bazel-gazelle/flag", - importpath = "github.com/bazelbuild/bazel-gazelle/flag", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/flag/flag.go b/vendor/github.com/bazelbuild/bazel-gazelle/flag/flag.go deleted file mode 100644 index be5be2451e0..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/flag/flag.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2017 The Bazel Authors. 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 flag provides some general-purpose types which satisfy the -// flag.Value interface. -package flag - -import ( - stdflag "flag" - "fmt" - "strings" -) - -// MultiFlag collects repeated string flags into a slice. -type MultiFlag struct { - IsSet *bool - Values *[]string -} - -var _ stdflag.Value = (*MultiFlag)(nil) - -func (m *MultiFlag) Set(v string) error { - if m.IsSet != nil && !*m.IsSet { - *m.IsSet = true - *m.Values = nil // clear any default values - } - *m.Values = append(*m.Values, v) - return nil -} - -func (m *MultiFlag) String() string { - if m == nil || m.Values == nil { - return "" - } - return strings.Join(*m.Values, ",") -} - -// ExplicitFlag is a string flag that tracks whether it was set. -type ExplicitFlag struct { - IsSet *bool - Value *string -} - -var _ stdflag.Value = (*ExplicitFlag)(nil) - -func (f *ExplicitFlag) Set(value string) error { - *f.IsSet = true - *f.Value = value - return nil -} - -func (f *ExplicitFlag) String() string { - if f == nil || f.Value == nil { - return "" - } - return *f.Value -} - -var _ stdflag.Value = (*AllowedStringFlag)(nil) - -type AllowedStringFlag struct { - Allowed []string - Value *string -} - -func (f *AllowedStringFlag) Set(v string) error { - for _, a := range f.Allowed { - if v == a { - *f.Value = v - return nil - } - } - return fmt.Errorf("Invalid argument %q. Possible values are: %s", v, strings.Join(f.Allowed, ", ")) -} - -func (f *AllowedStringFlag) String() string { - if f == nil || f.Value == nil { - return "" - } - return *f.Value -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/internal/version/BUILD b/vendor/github.com/bazelbuild/bazel-gazelle/internal/version/BUILD deleted file mode 100644 index 31f68ae0830..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/internal/version/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["version.go"], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/bazel-gazelle/internal/version", - importpath = "github.com/bazelbuild/bazel-gazelle/internal/version", - visibility = ["//vendor/github.com/bazelbuild/bazel-gazelle:__subpackages__"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/internal/version/version.go b/vendor/github.com/bazelbuild/bazel-gazelle/internal/version/version.go deleted file mode 100644 index 5c56fca72ee..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/internal/version/version.go +++ /dev/null @@ -1,72 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 version - -import ( - "fmt" - "strconv" - "strings" -) - -// Version is a tuple of non-negative integers that represents the version of -// a software package. -type Version []int - -func (v Version) String() string { - cstrs := make([]string, len(v)) - for i, cn := range v { - cstrs[i] = strconv.Itoa(cn) - } - return strings.Join(cstrs, ".") -} - -// Compare returns an integer comparing two versions lexicographically. -func (x Version) Compare(y Version) int { - n := len(x) - if len(y) < n { - n = len(y) - } - for i := 0; i < n; i++ { - cmp := x[i] - y[i] - if cmp != 0 { - return cmp - } - } - return len(x) - len(y) -} - -// ParseVersion parses a version of the form "12.34.56-abcd". Non-negative -// integer components are separated by dots. An arbitrary suffix may appear -// after '-', which is ignored. -func ParseVersion(vs string) (Version, error) { - i := strings.IndexByte(vs, '-') - if i >= 0 { - vs = vs[:i] - } - cstrs := strings.Split(vs, ".") - v := make(Version, len(cstrs)) - for i, cstr := range cstrs { - cn, err := strconv.Atoi(cstr) - if err != nil { - return nil, fmt.Errorf("could not parse version string: %q is not an integer", cstr) - } - if cn < 0 { - return nil, fmt.Errorf("could not parse version string: %q is negative", cstr) - } - v[i] = cn - } - return v, nil -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/internal/wspace/BUILD b/vendor/github.com/bazelbuild/bazel-gazelle/internal/wspace/BUILD deleted file mode 100644 index 2e0fc1c49c3..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/internal/wspace/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["finder.go"], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/bazel-gazelle/internal/wspace", - importpath = "github.com/bazelbuild/bazel-gazelle/internal/wspace", - visibility = ["//vendor/github.com/bazelbuild/bazel-gazelle:__subpackages__"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/internal/wspace/finder.go b/vendor/github.com/bazelbuild/bazel-gazelle/internal/wspace/finder.go deleted file mode 100644 index 78935eb5d50..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/internal/wspace/finder.go +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright 2016 The Bazel Authors. 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 wspace provides functions to locate and modify a bazel WORKSPACE file. -package wspace - -import ( - "os" - "path/filepath" - "strings" -) - -const workspaceFile = "WORKSPACE" - -// Find searches from the given dir and up for the WORKSPACE file -// returning the directory containing it, or an error if none found in the tree. -func Find(dir string) (string, error) { - dir, err := filepath.Abs(dir) - if err != nil { - return "", err - } - - for { - _, err = os.Stat(filepath.Join(dir, workspaceFile)) - if err == nil { - return dir, nil - } - if !os.IsNotExist(err) { - return "", err - } - if strings.HasSuffix(dir, string(os.PathSeparator)) { // stop at root dir - return "", os.ErrNotExist - } - dir = filepath.Dir(dir) - } -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/label/BUILD b/vendor/github.com/bazelbuild/bazel-gazelle/label/BUILD deleted file mode 100644 index e1e93a110de..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/label/BUILD +++ /dev/null @@ -1,24 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["label.go"], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/bazel-gazelle/label", - importpath = "github.com/bazelbuild/bazel-gazelle/label", - visibility = ["//visibility:public"], - deps = ["//vendor/github.com/bazelbuild/bazel-gazelle/pathtools:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/label/label.go b/vendor/github.com/bazelbuild/bazel-gazelle/label/label.go deleted file mode 100644 index 0d8e6c0cb5f..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/label/label.go +++ /dev/null @@ -1,201 +0,0 @@ -/* Copyright 2016 The Bazel Authors. 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 label provides utilities for parsing and manipulating -// Bazel labels. See -// https://docs.bazel.build/versions/master/build-ref.html#labels -// for more information. -package label - -import ( - "fmt" - "log" - "path" - "regexp" - "strings" - - "github.com/bazelbuild/bazel-gazelle/pathtools" -) - -// A Label represents a label of a build target in Bazel. Labels have three -// parts: a repository name, a package name, and a target name, formatted -// as @repo//pkg:target. -type Label struct { - // Repo is the repository name. If omitted, the label refers to a target - // in the current repository. - Repo string - - // Pkg is the package name, which is usually the directory that contains - // the target. If both Repo and Pkg are omitted, the label is relative. - Pkg string - - // Name is the name of the target the label refers to. If omitted, Name - // is assumed to be the same as Pkg. - Name string - - // Relative indicates whether the label refers to a target in the current - // package. Relative is true if and only if Repo and Pkg are both omitted. - Relative bool -} - -// New constructs a new label from components. -func New(repo, pkg, name string) Label { - return Label{Repo: repo, Pkg: pkg, Name: name} -} - -// NoLabel is the zero value of Label. It is not a valid label and may be -// returned when an error occurs. -var NoLabel = Label{} - -var ( - labelRepoRegexp = regexp.MustCompile(`^[A-Za-z][A-Za-z0-9_]*$`) - labelPkgRegexp = regexp.MustCompile(`^[A-Za-z0-9/._-]*$`) - labelNameRegexp = regexp.MustCompile(`^[A-Za-z0-9_/.+=,@~-]*$`) -) - -// Parse reads a label from a string. -// See https://docs.bazel.build/versions/master/build-ref.html#lexi. -func Parse(s string) (Label, error) { - origStr := s - - relative := true - var repo string - if strings.HasPrefix(s, "@") { - relative = false - endRepo := strings.Index(s, "//") - if endRepo < 0 { - return NoLabel, fmt.Errorf("label parse error: repository does not end with '//': %q", origStr) - } - repo = s[len("@"):endRepo] - if !labelRepoRegexp.MatchString(repo) { - return NoLabel, fmt.Errorf("label parse error: repository has invalid characters: %q", origStr) - } - s = s[endRepo:] - } - - var pkg string - if strings.HasPrefix(s, "//") { - relative = false - endPkg := strings.Index(s, ":") - if endPkg < 0 { - pkg = s[len("//"):] - s = "" - } else { - pkg = s[len("//"):endPkg] - s = s[endPkg:] - } - if !labelPkgRegexp.MatchString(pkg) { - return NoLabel, fmt.Errorf("label parse error: package has invalid characters: %q", origStr) - } - } - - if s == ":" { - return NoLabel, fmt.Errorf("label parse error: empty name: %q", origStr) - } - name := strings.TrimPrefix(s, ":") - if !labelNameRegexp.MatchString(name) { - return NoLabel, fmt.Errorf("label parse error: name has invalid characters: %q", origStr) - } - - if pkg == "" && name == "" { - return NoLabel, fmt.Errorf("label parse error: empty package and name: %q", origStr) - } - if name == "" { - name = path.Base(pkg) - } - - return Label{ - Repo: repo, - Pkg: pkg, - Name: name, - Relative: relative, - }, nil -} - -func (l Label) String() string { - if l.Relative { - return fmt.Sprintf(":%s", l.Name) - } - - var repo string - if l.Repo != "" { - repo = fmt.Sprintf("@%s", l.Repo) - } - - if path.Base(l.Pkg) == l.Name { - return fmt.Sprintf("%s//%s", repo, l.Pkg) - } - return fmt.Sprintf("%s//%s:%s", repo, l.Pkg, l.Name) -} - -// Abs computes an absolute label (one with a repository and package name) -// from this label. If this label is already absolute, it is returned -// unchanged. -func (l Label) Abs(repo, pkg string) Label { - if !l.Relative { - return l - } - return Label{Repo: repo, Pkg: pkg, Name: l.Name} -} - -// Rel attempts to compute a relative label from this label. If this label -// is already relative or is in a different package, this label may be -// returned unchanged. -func (l Label) Rel(repo, pkg string) Label { - if l.Relative || l.Repo != repo { - return l - } - if l.Pkg == pkg { - return Label{Name: l.Name, Relative: true} - } - return Label{Pkg: l.Pkg, Name: l.Name} -} - -// Equal returns whether two labels are exactly the same. It does not return -// true for different labels that refer to the same target. -func (l Label) Equal(other Label) bool { - return l.Repo == other.Repo && - l.Pkg == other.Pkg && - l.Name == other.Name && - l.Relative == other.Relative -} - -// Contains returns whether other is contained by the package of l or a -// sub-package. Neither label may be relative. -func (l Label) Contains(other Label) bool { - if l.Relative { - log.Panicf("l must not be relative: %s", l) - } - if other.Relative { - log.Panicf("other must not be relative: %s", other) - } - result := l.Repo == other.Repo && pathtools.HasPrefix(other.Pkg, l.Pkg) - return result -} - -// ImportPathToBazelRepoName converts a Go import path into a bazel repo name -// following the guidelines in http://bazel.io/docs/be/functions.html#workspace -func ImportPathToBazelRepoName(importpath string) string { - importpath = strings.ToLower(importpath) - components := strings.Split(importpath, "/") - labels := strings.Split(components[0], ".") - var reversed []string - for i := range labels { - l := labels[len(labels)-i-1] - reversed = append(reversed, l) - } - repo := strings.Join(append(reversed, components[1:]...), "_") - return strings.NewReplacer("-", "_", ".", "_").Replace(repo) -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/BUILD b/vendor/github.com/bazelbuild/bazel-gazelle/language/BUILD deleted file mode 100644 index eb6254f7a78..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "lang.go", - "update.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/bazel-gazelle/language", - importpath = "github.com/bazelbuild/bazel-gazelle/language", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/bazelbuild/bazel-gazelle/config:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/repo:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/resolve:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/rule:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//vendor/github.com/bazelbuild/bazel-gazelle/language/go:all-srcs", - "//vendor/github.com/bazelbuild/bazel-gazelle/language/proto:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/BUILD b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/BUILD deleted file mode 100644 index cd46d0a11c2..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "config.go", - "constants.go", - "dep.go", - "fileinfo.go", - "fix.go", - "generate.go", - "godep.go", - "kinds.go", - "known_go_imports.go", - "known_proto_imports.go", - "lang.go", - "modules.go", - "package.go", - "resolve.go", - "std_package_list.go", - "update.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/bazel-gazelle/language/go", - importpath = "github.com/bazelbuild/bazel-gazelle/language/go", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/bazelbuild/bazel-gazelle/config:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/flag:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/label:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/language:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/language/proto:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/pathtools:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/repo:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/resolve:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/rule:go_default_library", - "//vendor/github.com/bazelbuild/buildtools/build:go_default_library", - "//vendor/github.com/pelletier/go-toml:go_default_library", - "//vendor/golang.org/x/sync/errgroup:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/config.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/config.go deleted file mode 100644 index 349b6ba2ff1..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/config.go +++ /dev/null @@ -1,447 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 golang - -import ( - "flag" - "fmt" - "go/build" - "log" - "os" - "path" - "path/filepath" - "strings" - - "github.com/bazelbuild/bazel-gazelle/config" - gzflag "github.com/bazelbuild/bazel-gazelle/flag" - "github.com/bazelbuild/bazel-gazelle/language/proto" - "github.com/bazelbuild/bazel-gazelle/rule" - bzl "github.com/bazelbuild/buildtools/build" -) - -// goConfig contains configuration values related to Go rules. -type goConfig struct { - // genericTags is a set of tags that Gazelle considers to be true. Set with - // -build_tags or # gazelle:build_tags. Some tags, like gc, are always on. - genericTags map[string]bool - - // prefix is a prefix of an import path, used to generate importpath - // attributes. Set with -go_prefix or # gazelle:prefix. - prefix string - - // prefixRel is the package name of the directory where the prefix was set - // ("" for the root directory). - prefixRel string - - // prefixSet indicates whether the prefix was set explicitly. It is an error - // to infer an importpath for a rule without setting the prefix. - prefixSet bool - - // importMapPrefix is a prefix of a package path, used to generate importmap - // attributes. Set with # gazelle:importmap_prefix. - importMapPrefix string - - // importMapPrefixRel is the package name of the directory where importMapPrefix - // was set ("" for the root directory). - importMapPrefixRel string - - // depMode determines how imports that are not standard, indexed, or local - // (under the current prefix) should be resolved. - depMode dependencyMode - - // goProtoCompilers is the protocol buffers compiler(s) to use for go code. - goProtoCompilers []string - - // goProtoCompilersSet indicates whether goProtoCompiler was set explicitly. - goProtoCompilersSet bool - - // goGrpcCompilers is the gRPC compiler(s) to use for go code. - goGrpcCompilers []string - - // goGrpcCompilersSet indicates whether goGrpcCompiler was set explicitly. - goGrpcCompilersSet bool - - // goRepositoryMode is true if Gazelle was invoked by a go_repository rule. - // In this mode, we won't go out to the network to resolve external deps. - goRepositoryMode bool - - // By default, internal packages are only visible to its siblings. - // goVisibility adds a list of packages the internal packages should be - // visible to - goVisibility []string - - // moduleMode is true if the current directory is intended to be built - // as part of a module. Minimal module compatibility won't be supported - // if this is true in the root directory. External dependencies may be - // resolved differently (also depending on goRepositoryMode). - moduleMode bool - - // submodules is a list of modules which have the current module's path - // as a prefix of their own path. This affects visibility attributes - // in internal packages. - submodules []moduleRepo - - // buildExternalAttr, buildFileNamesAttr, buildFileGenerationAttr, - // buildTagsAttr, buildFileProtoModeAttr, and buildExtraArgsAttr are - // attributes for go_repository rules, set on the command line. - buildExternalAttr, buildFileNamesAttr, buildFileGenerationAttr, buildTagsAttr, buildFileProtoModeAttr, buildExtraArgsAttr string -} - -var ( - defaultGoProtoCompilers = []string{"@io_bazel_rules_go//proto:go_proto"} - defaultGoGrpcCompilers = []string{"@io_bazel_rules_go//proto:go_grpc"} -) - -func newGoConfig() *goConfig { - gc := &goConfig{ - goProtoCompilers: defaultGoProtoCompilers, - goGrpcCompilers: defaultGoGrpcCompilers, - } - gc.preprocessTags() - return gc -} - -func getGoConfig(c *config.Config) *goConfig { - return c.Exts[goName].(*goConfig) -} - -func (gc *goConfig) clone() *goConfig { - gcCopy := *gc - gcCopy.genericTags = make(map[string]bool) - for k, v := range gc.genericTags { - gcCopy.genericTags[k] = v - } - gcCopy.goProtoCompilers = gc.goProtoCompilers[:len(gc.goProtoCompilers):len(gc.goProtoCompilers)] - gcCopy.goGrpcCompilers = gc.goGrpcCompilers[:len(gc.goGrpcCompilers):len(gc.goGrpcCompilers)] - gcCopy.submodules = gc.submodules[:len(gc.submodules):len(gc.submodules)] - return &gcCopy -} - -// preprocessTags adds some tags which are on by default before they are -// used to match files. -func (gc *goConfig) preprocessTags() { - if gc.genericTags == nil { - gc.genericTags = make(map[string]bool) - } - gc.genericTags["gc"] = true -} - -// setBuildTags sets genericTags by parsing as a comma separated list. An -// error will be returned for tags that wouldn't be recognized by "go build". -// preprocessTags should be called before this. -func (gc *goConfig) setBuildTags(tags string) error { - if tags == "" { - return nil - } - for _, t := range strings.Split(tags, ",") { - if strings.HasPrefix(t, "!") { - return fmt.Errorf("build tags can't be negated: %s", t) - } - gc.genericTags[t] = true - } - return nil -} - -func getProtoMode(c *config.Config) proto.Mode { - if pc := proto.GetProtoConfig(c); pc != nil { - return pc.Mode - } else { - return proto.DisableGlobalMode - } -} - -// dependencyMode determines how imports of packages outside of the prefix -// are resolved. -type dependencyMode int - -const ( - // externalMode indicates imports should be resolved to external dependencies - // (declared in WORKSPACE). - externalMode dependencyMode = iota - - // vendorMode indicates imports should be resolved to libraries in the - // vendor directory. - vendorMode -) - -func (m dependencyMode) String() string { - if m == externalMode { - return "external" - } else { - return "vendored" - } -} - -type externalFlag struct { - depMode *dependencyMode -} - -func (f *externalFlag) Set(value string) error { - switch value { - case "external": - *f.depMode = externalMode - case "vendored": - *f.depMode = vendorMode - default: - return fmt.Errorf("unrecognized dependency mode: %q", value) - } - return nil -} - -func (f *externalFlag) String() string { - if f == nil || f.depMode == nil { - return "external" - } - return f.depMode.String() -} - -type tagsFlag func(string) error - -func (f tagsFlag) Set(value string) error { - return f(value) -} - -func (f tagsFlag) String() string { - return "" -} - -type moduleRepo struct { - repoName, modulePath string -} - -var validBuildExternalAttr = []string{"external", "vendored"} -var validBuildFileGenerationAttr = []string{"auto", "on", "off"} -var validBuildFileProtoModeAttr = []string{"default", "legacy", "disable", "disable_global", "package"} - -func (*goLang) KnownDirectives() []string { - return []string{ - "build_tags", - "go_grpc_compilers", - "go_proto_compilers", - "go_visibility", - "importmap_prefix", - "prefix", - } -} - -func (*goLang) RegisterFlags(fs *flag.FlagSet, cmd string, c *config.Config) { - gc := newGoConfig() - switch cmd { - case "fix", "update": - fs.Var( - tagsFlag(gc.setBuildTags), - "build_tags", - "comma-separated list of build tags. If not specified, Gazelle will not\n\tfilter sources with build constraints.") - fs.Var( - &gzflag.ExplicitFlag{Value: &gc.prefix, IsSet: &gc.prefixSet}, - "go_prefix", - "prefix of import paths in the current workspace") - fs.Var( - &externalFlag{&gc.depMode}, - "external", - "external: resolve external packages with go_repository\n\tvendored: resolve external packages as packages in vendor/") - fs.Var( - &gzflag.MultiFlag{Values: &gc.goProtoCompilers, IsSet: &gc.goProtoCompilersSet}, - "go_proto_compiler", - "go_proto_library compiler to use (may be repeated)") - fs.Var( - &gzflag.MultiFlag{Values: &gc.goGrpcCompilers, IsSet: &gc.goGrpcCompilersSet}, - "go_grpc_compiler", - "go_proto_library compiler to use for gRPC (may be repeated)") - fs.BoolVar( - &gc.goRepositoryMode, - "go_repository_mode", - false, - "set when gazelle is invoked by go_repository") - fs.BoolVar( - &gc.moduleMode, - "go_repository_module_mode", - false, - "set when gazelle is invoked by go_repository in module mode") - - case "update-repos": - fs.Var(&gzflag.AllowedStringFlag{Value: &gc.buildExternalAttr, Allowed: validBuildExternalAttr}, - "build_external", - "Sets the build_external attribute for the generated go_repository rule(s).") - fs.StringVar(&gc.buildExtraArgsAttr, - "build_extra_args", - "", - "Sets the build_extra_args attribute for the generated go_repository rule(s).") - fs.Var(&gzflag.AllowedStringFlag{Value: &gc.buildFileGenerationAttr, Allowed: validBuildFileGenerationAttr}, - "build_file_generation", - "Sets the build_file_generation attribute for the generated go_repository rule(s).") - fs.StringVar(&gc.buildFileNamesAttr, - "build_file_names", - "", - "Sets the build_file_name attribute for the generated go_repository rule(s).") - fs.Var(&gzflag.AllowedStringFlag{Value: &gc.buildFileProtoModeAttr, Allowed: validBuildFileProtoModeAttr}, - "build_file_proto_mode", - "Sets the build_file_proto_mode attribute for the generated go_repository rule(s).") - fs.StringVar(&gc.buildTagsAttr, - "build_tags", - "", - "Sets the build_tags attribute for the generated go_repository rule(s).") - } - c.Exts[goName] = gc -} - -func (*goLang) CheckFlags(fs *flag.FlagSet, c *config.Config) error { - // The base of the -go_prefix flag may be used to generate proto_library - // rule names when there are no .proto sources (empty rules to be deleted) - // or when the package name can't be determined. - // TODO(jayconrod): deprecate and remove this behavior. - gc := getGoConfig(c) - if pc := proto.GetProtoConfig(c); pc != nil { - pc.GoPrefix = gc.prefix - } - - // List modules that may refer to internal packages in this module. - for _, r := range c.Repos { - if r.Kind() != "go_repository" { - continue - } - modulePath := r.AttrString("importpath") - if !strings.HasPrefix(modulePath, gc.prefix+"/") { - continue - } - m := moduleRepo{ - repoName: r.Name(), - modulePath: modulePath, - } - gc.submodules = append(gc.submodules, m) - } - - return nil -} - -func (*goLang) Configure(c *config.Config, rel string, f *rule.File) { - var gc *goConfig - if raw, ok := c.Exts[goName]; !ok { - gc = newGoConfig() - } else { - gc = raw.(*goConfig).clone() - } - c.Exts[goName] = gc - - if !gc.moduleMode { - st, err := os.Stat(filepath.Join(c.RepoRoot, filepath.FromSlash(rel), "go.mod")) - if err == nil && !st.IsDir() { - gc.moduleMode = true - } - } - - if path.Base(rel) == "vendor" { - gc.importMapPrefix = inferImportPath(gc, rel) - gc.importMapPrefixRel = rel - gc.prefix = "" - gc.prefixRel = rel - } - - if f != nil { - setPrefix := func(prefix string) { - if err := checkPrefix(prefix); err != nil { - log.Print(err) - return - } - gc.prefix = prefix - gc.prefixSet = true - gc.prefixRel = rel - } - for _, d := range f.Directives { - switch d.Key { - case "build_tags": - if err := gc.setBuildTags(d.Value); err != nil { - log.Print(err) - continue - } - gc.preprocessTags() - gc.setBuildTags(d.Value) - - case "go_grpc_compilers": - // Special syntax (empty value) to reset directive. - if d.Value == "" { - gc.goGrpcCompilersSet = false - gc.goGrpcCompilers = defaultGoGrpcCompilers - } else { - gc.goGrpcCompilersSet = true - gc.goGrpcCompilers = splitValue(d.Value) - } - - case "go_proto_compilers": - // Special syntax (empty value) to reset directive. - if d.Value == "" { - gc.goProtoCompilersSet = false - gc.goProtoCompilers = defaultGoProtoCompilers - } else { - gc.goProtoCompilersSet = true - gc.goProtoCompilers = splitValue(d.Value) - } - - case "go_visibility": - gc.goVisibility = append(gc.goVisibility, strings.TrimSpace(d.Value)) - - case "importmap_prefix": - gc.importMapPrefix = d.Value - gc.importMapPrefixRel = rel - - case "prefix": - setPrefix(d.Value) - } - } - if !gc.prefixSet { - for _, r := range f.Rules { - switch r.Kind() { - case "go_prefix": - args := r.Args() - if len(args) != 1 { - continue - } - s, ok := args[0].(*bzl.StringExpr) - if !ok { - continue - } - setPrefix(s.Value) - - case "gazelle": - if prefix := r.AttrString("prefix"); prefix != "" { - setPrefix(prefix) - } - } - } - } - } -} - -// checkPrefix checks that a string may be used as a prefix. We forbid local -// (relative) imports and those beginning with "/". We allow the empty string, -// but generated rules must not have an empty importpath. -func checkPrefix(prefix string) error { - if strings.HasPrefix(prefix, "/") || build.IsLocalImport(prefix) { - return fmt.Errorf("invalid prefix: %q", prefix) - } - return nil -} - -// splitDirective splits a comma-separated directive value into its component -// parts, trimming each of any whitespace characters. -func splitValue(value string) []string { - parts := strings.Split(value, ",") - values := make([]string, 0, len(parts)) - for _, part := range parts { - values = append(values, strings.TrimSpace(part)) - } - return values -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/constants.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/constants.go deleted file mode 100644 index 14a343c2600..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/constants.go +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 golang - -const ( - // defaultLibName is the name of the default go_library rule in a Go - // package directory. This name was originally chosen so that rules_go - // could translate between Bazel labels and Go import paths using go_prefix. - // It is no longer needed since go_prefix was deleted. - defaultLibName = "go_default_library" - - // defaultTestName is a name of an internal test corresponding to - // defaultLibName. It does not need to be consistent to something but it - // just needs to be unique in the Bazel package - defaultTestName = "go_default_test" - - // legacyProtoFilegroupName is the anme of a filegroup created in legacy - // mode for libraries that contained .pb.go files and .proto files. - legacyProtoFilegroupName = "go_default_library_protos" - - // grpcCompilerLabel is the label for the gRPC compiler plugin, used in the - // "compilers" attribute of go_proto_library rules. - grpcCompilerLabel = "@io_bazel_rules_go//proto:go_grpc" - - // wellKnownTypesGoPrefix is the import path for the Go repository containing - // pre-generated code for the Well Known Types. - wellKnownTypesGoPrefix = "github.com/golang/protobuf" - - // wellKnownTypesPkg is the package name for the predefined WKTs in rules_go. - wellKnownTypesPkg = "proto/wkt" -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/def.bzl b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/def.bzl deleted file mode 100644 index 77922ca3655..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/def.bzl +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_context", "go_rule") - -def _std_package_list_impl(ctx): - go = go_context(ctx) - args = ctx.actions.args() - args.add_all([go.package_list, ctx.outputs.out]) - ctx.actions.run( - inputs = [go.package_list], - outputs = [ctx.outputs.out], - executable = ctx.executable._gen_std_package_list, - arguments = [args], - mnemonic = "GoStdPackageList", - ) - return [DefaultInfo(files = depset([ctx.outputs.out]))] - -std_package_list = go_rule( - _std_package_list_impl, - attrs = { - "out": attr.output(mandatory = True), - "_gen_std_package_list": attr.label( - default = "//language/go/gen_std_package_list", - cfg = "host", - executable = True, - ), - }, -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/dep.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/dep.go deleted file mode 100644 index 5e13fbc2e92..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/dep.go +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright 2017 The Bazel Authors. 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 golang - -import ( - "io/ioutil" - "sort" - - "github.com/bazelbuild/bazel-gazelle/label" - "github.com/bazelbuild/bazel-gazelle/language" - "github.com/bazelbuild/bazel-gazelle/rule" - toml "github.com/pelletier/go-toml" -) - -type depLockFile struct { - Projects []depProject `toml:"projects"` -} - -type depProject struct { - Name string `toml:"name"` - Revision string `toml:"revision"` - Source string `toml:"source"` -} - -func importReposFromDep(args language.ImportReposArgs) language.ImportReposResult { - data, err := ioutil.ReadFile(args.Path) - if err != nil { - return language.ImportReposResult{Error: err} - } - var file depLockFile - if err := toml.Unmarshal(data, &file); err != nil { - return language.ImportReposResult{Error: err} - } - - gen := make([]*rule.Rule, len(file.Projects)) - for i, p := range file.Projects { - gen[i] = rule.NewRule("go_repository", label.ImportPathToBazelRepoName(p.Name)) - gen[i].SetAttr("importpath", p.Name) - gen[i].SetAttr("commit", p.Revision) - if p.Source != "" { - // TODO(#411): Handle source directives correctly. It may be an import - // path, or a URL. In the case of an import path, we should resolve it - // to the correct remote and vcs. In the case of a URL, we should - // correctly determine what VCS to use (the URL will usually start - // with "https://", which is used by multiple VCSs). - gen[i].SetAttr("remote", p.Source) - gen[i].SetAttr("vcs", "git") - } - } - sort.SliceStable(gen, func(i, j int) bool { - return gen[i].Name() < gen[j].Name() - }) - - return language.ImportReposResult{Gen: gen} -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/fileinfo.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/fileinfo.go deleted file mode 100644 index a409ebe39f1..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/fileinfo.go +++ /dev/null @@ -1,695 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 golang - -import ( - "bufio" - "bytes" - "errors" - "fmt" - "go/ast" - "go/parser" - "go/token" - "log" - "os" - "path" - "path/filepath" - "strconv" - "strings" - "unicode" - "unicode/utf8" - - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/language/proto" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -// fileInfo holds information used to decide how to build a file. This -// information comes from the file's name, from package and import declarations -// (in .go files), and from +build and cgo comments. -type fileInfo struct { - path string - name string - - // ext is the type of file, based on extension. - ext ext - - // packageName is the Go package name of a .go file, without the - // "_test" suffix if it was present. It is empty for non-Go files. - packageName string - - // importPath is the canonical import path for this file's package. - // This may be read from a package comment (in Go) or a go_package - // option (in proto). This field is empty for files that don't specify - // an import path. - importPath string - - // isTest is true if the file stem (the part before the extension) - // ends with "_test.go". This is never true for non-Go files. - isTest bool - - // imports is a list of packages imported by a file. It does not include - // "C" or anything from the standard library. - imports []string - - // isCgo is true for .go files that import "C". - isCgo bool - - // goos and goarch contain the OS and architecture suffixes in the filename, - // if they were present. - goos, goarch string - - // tags is a list of build tag lines. Each entry is the trimmed text of - // a line after a "+build" prefix. - tags []tagLine - - // copts and clinkopts contain flags that are part of CFLAGS, CPPFLAGS, - // CXXFLAGS, and LDFLAGS directives in cgo comments. - copts, clinkopts []taggedOpts - - // hasServices indicates whether a .proto file has service definitions. - hasServices bool -} - -// tagLine represents the space-separated disjunction of build tag groups -// in a line comment. -type tagLine []tagGroup - -// check returns true if at least one of the tag groups is satisfied. -func (l tagLine) check(c *config.Config, os, arch string) bool { - if len(l) == 0 { - return false - } - for _, g := range l { - if g.check(c, os, arch) { - return true - } - } - return false -} - -// tagGroup represents a comma-separated conjuction of build tags. -type tagGroup []string - -// check returns true if all of the tags are true. Tags that start with -// "!" are negated (but "!!") is not allowed. Go release tags (e.g., "go1.8") -// are ignored. If the group contains an os or arch tag, but the os or arch -// parameters are empty, check returns false even if the tag is negated. -func (g tagGroup) check(c *config.Config, os, arch string) bool { - goConf := getGoConfig(c) - for _, t := range g { - if strings.HasPrefix(t, "!!") { // bad syntax, reject always - return false - } - not := strings.HasPrefix(t, "!") - if not { - t = t[1:] - } - if isIgnoredTag(t) { - // Release tags are treated as "unknown" and are considered true, - // whether or not they are negated. - continue - } - var match bool - if _, ok := rule.KnownOSSet[t]; ok { - if os == "" { - return false - } - match = matchesOS(os, t) - } else if _, ok := rule.KnownArchSet[t]; ok { - if arch == "" { - return false - } - match = arch == t - } else { - match = goConf.genericTags[t] - } - if not { - match = !match - } - if !match { - return false - } - } - return true -} - -// taggedOpts a list of compile or link options which should only be applied -// if the given set of build tags are satisfied. These options have already -// been tokenized using the same algorithm that "go build" uses, then joined -// with OptSeparator. -type taggedOpts struct { - tags tagLine - opts string -} - -// optSeparator is a special character inserted between options that appeared -// together in a #cgo directive. This allows options to be split, modified, -// and escaped by other packages. -// -// It's important to keep options grouped together in the same string. For -// example, if we have "-framework IOKit" together in a #cgo directive, -// "-framework" shouldn't be treated as a separate string for the purposes of -// sorting and de-duplicating. -const optSeparator = "\x1D" - -// ext indicates how a file should be treated, based on extension. -type ext int - -const ( - // unknownExt is applied files that aren't buildable with Go. - unknownExt ext = iota - - // goExt is applied to .go files. - goExt - - // cExt is applied to C and C++ files. - cExt - - // hExt is applied to header files. If cgo code is present, these may be - // C or C++ headers. If not, they are treated as Go assembly headers. - hExt - - // sExt is applied to Go assembly files, ending with .s. - sExt - - // csExt is applied to other assembly files, ending with .S. These are built - // with the C compiler if cgo code is present. - csExt - - // protoExt is applied to .proto files. - protoExt -) - -// fileNameInfo returns information that can be inferred from the name of -// a file. It does not read data from the file. -func fileNameInfo(path_ string) fileInfo { - name := filepath.Base(path_) - var ext ext - switch path.Ext(name) { - case ".go": - ext = goExt - case ".c", ".cc", ".cpp", ".cxx", ".m", ".mm": - ext = cExt - case ".h", ".hh", ".hpp", ".hxx": - ext = hExt - case ".s": - ext = sExt - case ".S": - ext = csExt - case ".proto": - ext = protoExt - default: - ext = unknownExt - } - if strings.HasPrefix(name, ".") || strings.HasPrefix(name, "_") { - ext = unknownExt - } - - // Determine test, goos, and goarch. This is intended to match the logic - // in goodOSArchFile in go/build. - var isTest bool - var goos, goarch string - l := strings.Split(name[:len(name)-len(path.Ext(name))], "_") - if len(l) >= 2 && l[len(l)-1] == "test" { - isTest = ext == goExt - l = l[:len(l)-1] - } - switch { - case len(l) >= 3 && rule.KnownOSSet[l[len(l)-2]] && rule.KnownArchSet[l[len(l)-1]]: - goos = l[len(l)-2] - goarch = l[len(l)-1] - case len(l) >= 2 && rule.KnownOSSet[l[len(l)-1]]: - goos = l[len(l)-1] - case len(l) >= 2 && rule.KnownArchSet[l[len(l)-1]]: - goarch = l[len(l)-1] - } - - return fileInfo{ - path: path_, - name: name, - ext: ext, - isTest: isTest, - goos: goos, - goarch: goarch, - } -} - -// otherFileInfo returns information about a non-.go file. It will parse -// part of the file to determine build tags. If the file can't be read, an -// error will be logged, and partial information will be returned. -func otherFileInfo(path string) fileInfo { - info := fileNameInfo(path) - if info.ext == unknownExt { - return info - } - - tags, err := readTags(info.path) - if err != nil { - log.Printf("%s: error reading file: %v", info.path, err) - return info - } - info.tags = tags - return info -} - -// goFileInfo returns information about a .go file. It will parse part of the -// file to determine the package name, imports, and build constraints. -// If the file can't be read, an error will be logged, and partial information -// will be returned. -// This function is intended to match go/build.Context.Import. -// TODD(#53): extract canonical import path -func goFileInfo(path, rel string) fileInfo { - info := fileNameInfo(path) - fset := token.NewFileSet() - pf, err := parser.ParseFile(fset, info.path, nil, parser.ImportsOnly|parser.ParseComments) - if err != nil { - log.Printf("%s: error reading go file: %v", info.path, err) - return info - } - - info.packageName = pf.Name.Name - if info.isTest && strings.HasSuffix(info.packageName, "_test") { - info.packageName = info.packageName[:len(info.packageName)-len("_test")] - } - - for _, decl := range pf.Decls { - d, ok := decl.(*ast.GenDecl) - if !ok { - continue - } - for _, dspec := range d.Specs { - spec, ok := dspec.(*ast.ImportSpec) - if !ok { - continue - } - quoted := spec.Path.Value - path, err := strconv.Unquote(quoted) - if err != nil { - log.Printf("%s: error reading go file: %v", info.path, err) - continue - } - - if path == "C" { - if info.isTest { - log.Printf("%s: warning: use of cgo in test not supported", info.path) - } - info.isCgo = true - cg := spec.Doc - if cg == nil && len(d.Specs) == 1 { - cg = d.Doc - } - if cg != nil { - if err := saveCgo(&info, rel, cg); err != nil { - log.Printf("%s: error reading go file: %v", info.path, err) - } - } - continue - } - info.imports = append(info.imports, path) - } - } - - tags, err := readTags(info.path) - if err != nil { - log.Printf("%s: error reading go file: %v", info.path, err) - return info - } - info.tags = tags - - return info -} - -// saveCgo extracts CFLAGS, CPPFLAGS, CXXFLAGS, and LDFLAGS directives -// from a comment above a "C" import. This is intended to match logic in -// go/build.Context.saveCgo. -func saveCgo(info *fileInfo, rel string, cg *ast.CommentGroup) error { - text := cg.Text() - for _, line := range strings.Split(text, "\n") { - orig := line - - // Line is - // #cgo [GOOS/GOARCH...] LDFLAGS: stuff - // - line = strings.TrimSpace(line) - if len(line) < 5 || line[:4] != "#cgo" || (line[4] != ' ' && line[4] != '\t') { - continue - } - - // Split at colon. - line = strings.TrimSpace(line[4:]) - i := strings.Index(line, ":") - if i < 0 { - return fmt.Errorf("%s: invalid #cgo line: %s", info.path, orig) - } - line, optstr := strings.TrimSpace(line[:i]), strings.TrimSpace(line[i+1:]) - - // Parse tags and verb. - f := strings.Fields(line) - if len(f) < 1 { - return fmt.Errorf("%s: invalid #cgo line: %s", info.path, orig) - } - verb := f[len(f)-1] - tags := parseTagsInGroups(f[:len(f)-1]) - - // Parse options. - opts, err := splitQuoted(optstr) - if err != nil { - return fmt.Errorf("%s: invalid #cgo line: %s", info.path, orig) - } - var ok bool - for i, opt := range opts { - if opt, ok = expandSrcDir(opt, rel); !ok { - return fmt.Errorf("%s: malformed #cgo argument: %s", info.path, orig) - } - opts[i] = opt - } - joinedStr := strings.Join(opts, optSeparator) - - // Add tags to appropriate list. - switch verb { - case "CFLAGS", "CPPFLAGS", "CXXFLAGS": - info.copts = append(info.copts, taggedOpts{tags, joinedStr}) - case "LDFLAGS": - info.clinkopts = append(info.clinkopts, taggedOpts{tags, joinedStr}) - case "pkg-config": - return fmt.Errorf("%s: pkg-config not supported: %s", info.path, orig) - default: - return fmt.Errorf("%s: invalid #cgo verb: %s", info.path, orig) - } - } - return nil -} - -// splitQuoted splits the string s around each instance of one or more consecutive -// white space characters while taking into account quotes and escaping, and -// returns an array of substrings of s or an empty list if s contains only white space. -// Single quotes and double quotes are recognized to prevent splitting within the -// quoted region, and are removed from the resulting substrings. If a quote in s -// isn't closed err will be set and r will have the unclosed argument as the -// last element. The backslash is used for escaping. -// -// For example, the following string: -// -// a b:"c d" 'e''f' "g\"" -// -// Would be parsed as: -// -// []string{"a", "b:c d", "ef", `g"`} -// -// Copied from go/build.splitQuoted -func splitQuoted(s string) (r []string, err error) { - var args []string - arg := make([]rune, len(s)) - escaped := false - quoted := false - quote := '\x00' - i := 0 - for _, rune := range s { - switch { - case escaped: - escaped = false - case rune == '\\': - escaped = true - continue - case quote != '\x00': - if rune == quote { - quote = '\x00' - continue - } - case rune == '"' || rune == '\'': - quoted = true - quote = rune - continue - case unicode.IsSpace(rune): - if quoted || i > 0 { - quoted = false - args = append(args, string(arg[:i])) - i = 0 - } - continue - } - arg[i] = rune - i++ - } - if quoted || i > 0 { - args = append(args, string(arg[:i])) - } - if quote != 0 { - err = errors.New("unclosed quote") - } else if escaped { - err = errors.New("unfinished escaping") - } - return args, err -} - -// expandSrcDir expands any occurrence of ${SRCDIR}, making sure -// the result is safe for the shell. -// -// Copied from go/build.expandSrcDir -func expandSrcDir(str string, srcdir string) (string, bool) { - // "\" delimited paths cause safeCgoName to fail - // so convert native paths with a different delimiter - // to "/" before starting (eg: on windows). - srcdir = filepath.ToSlash(srcdir) - if srcdir == "" { - srcdir = "." - } - - // Spaces are tolerated in ${SRCDIR}, but not anywhere else. - chunks := strings.Split(str, "${SRCDIR}") - if len(chunks) < 2 { - return str, safeCgoName(str, false) - } - ok := true - for _, chunk := range chunks { - ok = ok && (chunk == "" || safeCgoName(chunk, false)) - } - ok = ok && (srcdir == "" || safeCgoName(srcdir, true)) - res := strings.Join(chunks, srcdir) - return res, ok && res != "" -} - -// NOTE: $ is not safe for the shell, but it is allowed here because of linker options like -Wl,$ORIGIN. -// We never pass these arguments to a shell (just to programs we construct argv for), so this should be okay. -// See golang.org/issue/6038. -// The @ is for OS X. See golang.org/issue/13720. -// The % is for Jenkins. See golang.org/issue/16959. -const safeString = "+-.,/0123456789=ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz:$@%" -const safeSpaces = " " - -var safeBytes = []byte(safeSpaces + safeString) - -// Copied from go/build.safeCgoName -func safeCgoName(s string, spaces bool) bool { - if s == "" { - return false - } - safe := safeBytes - if !spaces { - safe = safe[len(safeSpaces):] - } - for i := 0; i < len(s); i++ { - if c := s[i]; c < utf8.RuneSelf && bytes.IndexByte(safe, c) < 0 { - return false - } - } - return true -} - -// readTags reads and extracts build tags from the block of comments -// and blank lines at the start of a file which is separated from the -// rest of the file by a blank line. Each string in the returned slice -// is the trimmed text of a line after a "+build" prefix. -// Based on go/build.Context.shouldBuild. -func readTags(path string) ([]tagLine, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - defer f.Close() - scanner := bufio.NewScanner(f) - - // Pass 1: Identify leading run of // comments and blank lines, - // which must be followed by a blank line. - var lines []string - end := 0 - for scanner.Scan() { - line := strings.TrimSpace(scanner.Text()) - if line == "" { - end = len(lines) - continue - } - if strings.HasPrefix(line, "//") { - lines = append(lines, line[len("//"):]) - continue - } - break - } - if err := scanner.Err(); err != nil { - return nil, err - } - lines = lines[:end] - - // Pass 2: Process each line in the run. - var tagLines []tagLine - for _, line := range lines { - fields := strings.Fields(line) - if len(fields) > 0 && fields[0] == "+build" { - tagLines = append(tagLines, parseTagsInGroups(fields[1:])) - } - } - return tagLines, nil -} - -func parseTagsInGroups(groups []string) tagLine { - var l tagLine - for _, g := range groups { - l = append(l, tagGroup(strings.Split(g, ","))) - } - return l -} - -func isOSArchSpecific(info fileInfo, cgoTags tagLine) (osSpecific, archSpecific bool) { - if info.goos != "" { - osSpecific = true - } - if info.goarch != "" { - archSpecific = true - } - lines := info.tags - if len(cgoTags) > 0 { - lines = append(lines, cgoTags) - } - for _, line := range lines { - for _, group := range line { - for _, tag := range group { - if strings.HasPrefix(tag, "!") { - tag = tag[1:] - } - _, osOk := rule.KnownOSSet[tag] - if osOk { - osSpecific = true - } - _, archOk := rule.KnownArchSet[tag] - if archOk { - archSpecific = true - } - } - } - } - return osSpecific, archSpecific -} - -// matchesOS checks if a value is equal to either an OS value or to any of its -// aliases. -func matchesOS(os, value string) bool { - if os == value { - return true - } - for _, alias := range rule.OSAliases[os] { - if alias == value { - return true - } - } - return false -} - -// checkConstraints determines whether build constraints are satisfied on -// a given platform. -// -// The first few arguments describe the platform. genericTags is the set -// of build tags that are true on all platforms. os and arch are the platform -// GOOS and GOARCH strings. If os or arch is empty, checkConstraints will -// return false in the presence of OS and architecture constraints, even -// if they are negated. -// -// The remaining arguments describe the file being tested. All of these may -// be empty or nil. osSuffix and archSuffix are filename suffixes. fileTags -// is a list tags from +build comments found near the top of the file. cgoTags -// is an extra set of tags in a #cgo directive. -func checkConstraints(c *config.Config, os, arch, osSuffix, archSuffix string, fileTags []tagLine, cgoTags tagLine) bool { - if osSuffix != "" && !matchesOS(os, osSuffix) || archSuffix != "" && archSuffix != arch { - return false - } - for _, l := range fileTags { - if !l.check(c, os, arch) { - return false - } - } - if len(cgoTags) > 0 && !cgoTags.check(c, os, arch) { - return false - } - return true -} - -// isIgnoredTag returns whether the tag is "cgo" or is a release tag. -// Release tags match the pattern "go[0-9]\.[0-9]+". -// Gazelle won't consider whether an ignored tag is satisfied when evaluating -// build constraints for a file. -func isIgnoredTag(tag string) bool { - if tag == "cgo" || tag == "race" || tag == "msan" { - return true - } - if len(tag) < 5 || !strings.HasPrefix(tag, "go") { - return false - } - if tag[2] < '0' || tag[2] > '9' || tag[3] != '.' { - return false - } - for _, c := range tag[4:] { - if c < '0' || c > '9' { - return false - } - } - return true -} - -// protoFileInfo extracts metadata from a proto file. The proto extension -// already "parses" these and stores metadata in proto.FileInfo, so this is -// just processing relevant options. -func protoFileInfo(path_ string, protoInfo proto.FileInfo) fileInfo { - info := fileNameInfo(path_) - - // Look for "option go_package". If there's no / in the package option, then - // it's just a simple package name, not a full import path. - for _, opt := range protoInfo.Options { - if opt.Key != "go_package" { - continue - } - if strings.LastIndexByte(opt.Value, '/') == -1 { - info.packageName = opt.Value - } else { - if i := strings.LastIndexByte(opt.Value, ';'); i != -1 { - info.importPath = opt.Value[:i] - info.packageName = opt.Value[i+1:] - } else { - info.importPath = opt.Value - info.packageName = path.Base(opt.Value) - } - } - } - - // Set the Go package name from the proto package name if there was no - // option go_package. - if info.packageName == "" && protoInfo.PackageName != "" { - info.packageName = strings.Replace(protoInfo.PackageName, ".", "_", -1) - } - - info.imports = protoInfo.Imports - info.hasServices = protoInfo.HasServices - return info -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/fix.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/fix.go deleted file mode 100644 index 88d99963e1f..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/fix.go +++ /dev/null @@ -1,253 +0,0 @@ -/* Copyright 2017 The Bazel Authors. 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 golang - -import ( - "log" - - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/language/proto" - "github.com/bazelbuild/bazel-gazelle/rule" - bzl "github.com/bazelbuild/buildtools/build" -) - -func (_ *goLang) Fix(c *config.Config, f *rule.File) { - migrateLibraryEmbed(c, f) - migrateGrpcCompilers(c, f) - flattenSrcs(c, f) - squashCgoLibrary(c, f) - squashXtest(c, f) - removeLegacyProto(c, f) - removeLegacyGazelle(c, f) -} - -// migrateLibraryEmbed converts "library" attributes to "embed" attributes, -// preserving comments. This only applies to Go rules, and only if there is -// no keep comment on "library" and no existing "embed" attribute. -func migrateLibraryEmbed(c *config.Config, f *rule.File) { - for _, r := range f.Rules { - if !isGoRule(r.Kind()) { - continue - } - libExpr := r.Attr("library") - if libExpr == nil || rule.ShouldKeep(libExpr) || r.Attr("embed") != nil { - continue - } - r.DelAttr("library") - r.SetAttr("embed", &bzl.ListExpr{List: []bzl.Expr{libExpr}}) - } -} - -// migrateGrpcCompilers converts "go_grpc_library" rules into "go_proto_library" -// rules with a "compilers" attribute. -func migrateGrpcCompilers(c *config.Config, f *rule.File) { - for _, r := range f.Rules { - if r.Kind() != "go_grpc_library" || r.ShouldKeep() || r.Attr("compilers") != nil { - continue - } - r.SetKind("go_proto_library") - r.SetAttr("compilers", []string{grpcCompilerLabel}) - } -} - -// squashCgoLibrary removes cgo_library rules with the default name and -// merges their attributes with go_library with the default name. If no -// go_library rule exists, a new one will be created. -// -// Note that the library attribute is disregarded, so cgo_library and -// go_library attributes will be squashed even if the cgo_library was unlinked. -// MergeFile will remove unused values and attributes later. -func squashCgoLibrary(c *config.Config, f *rule.File) { - // Find the default cgo_library and go_library rules. - var cgoLibrary, goLibrary *rule.Rule - for _, r := range f.Rules { - if r.Kind() == "cgo_library" && r.Name() == "cgo_default_library" && !r.ShouldKeep() { - if cgoLibrary != nil { - log.Printf("%s: when fixing existing file, multiple cgo_library rules with default name found", f.Path) - continue - } - cgoLibrary = r - continue - } - if r.Kind() == "go_library" && r.Name() == defaultLibName { - if goLibrary != nil { - log.Printf("%s: when fixing existing file, multiple go_library rules with default name referencing cgo_library found", f.Path) - } - goLibrary = r - continue - } - } - - if cgoLibrary == nil { - return - } - if !c.ShouldFix { - log.Printf("%s: cgo_library is deprecated. Run 'gazelle fix' to squash with go_library.", f.Path) - return - } - - if goLibrary == nil { - cgoLibrary.SetKind("go_library") - cgoLibrary.SetName(defaultLibName) - cgoLibrary.SetAttr("cgo", true) - return - } - - if err := rule.SquashRules(cgoLibrary, goLibrary, f.Path); err != nil { - log.Print(err) - return - } - goLibrary.DelAttr("embed") - goLibrary.SetAttr("cgo", true) - cgoLibrary.Delete() -} - -// squashXtest removes go_test rules with the default external name and merges -// their attributes with a go_test rule with the default internal name. If -// no internal go_test rule exists, a new one will be created (effectively -// renaming the old rule). -func squashXtest(c *config.Config, f *rule.File) { - // Search for internal and external tests. - var itest, xtest *rule.Rule - for _, r := range f.Rules { - if r.Kind() != "go_test" { - continue - } - if r.Name() == defaultTestName { - itest = r - } else if r.Name() == "go_default_xtest" { - xtest = r - } - } - - if xtest == nil || xtest.ShouldKeep() || (itest != nil && itest.ShouldKeep()) { - return - } - if !c.ShouldFix { - if itest == nil { - log.Printf("%s: go_default_xtest is no longer necessary. Run 'gazelle fix' to rename to go_default_test.", f.Path) - } else { - log.Printf("%s: go_default_xtest is no longer necessary. Run 'gazelle fix' to squash with go_default_test.", f.Path) - } - return - } - - // If there was no internal test, we can just rename the external test. - if itest == nil { - xtest.SetName(defaultTestName) - return - } - - // Attempt to squash. - if err := rule.SquashRules(xtest, itest, f.Path); err != nil { - log.Print(err) - return - } - xtest.Delete() -} - -// flattenSrcs transforms srcs attributes structured as concatenations of -// lists and selects (generated from PlatformStrings; see -// extractPlatformStringsExprs for matching details) into a sorted, -// de-duplicated list. Comments are accumulated and de-duplicated across -// duplicate expressions. -func flattenSrcs(c *config.Config, f *rule.File) { - for _, r := range f.Rules { - if !isGoRule(r.Kind()) { - continue - } - oldSrcs := r.Attr("srcs") - if oldSrcs == nil { - continue - } - flatSrcs := rule.FlattenExpr(oldSrcs) - if flatSrcs != oldSrcs { - r.SetAttr("srcs", flatSrcs) - } - } -} - -// removeLegacyProto removes uses of the old proto rules. It deletes loads -// from go_proto_library.bzl. It deletes proto filegroups. It removes -// go_proto_library attributes which are no longer recognized. New rules -// are generated in place of the deleted rules, but attributes and comments -// are not migrated. -func removeLegacyProto(c *config.Config, f *rule.File) { - // Don't fix if the proto mode was set to something other than the default. - if pcMode := getProtoMode(c); pcMode != proto.DefaultMode { - return - } - - // Scan for definitions to delete. - var protoLoads []*rule.Load - for _, l := range f.Loads { - if l.Name() == "@io_bazel_rules_go//proto:go_proto_library.bzl" { - protoLoads = append(protoLoads, l) - } - } - var protoFilegroups, protoRules []*rule.Rule - for _, r := range f.Rules { - if r.Kind() == "filegroup" && r.Name() == legacyProtoFilegroupName { - protoFilegroups = append(protoFilegroups, r) - } - if r.Kind() == "go_proto_library" { - protoRules = append(protoRules, r) - } - } - if len(protoLoads)+len(protoFilegroups) == 0 { - return - } - if !c.ShouldFix { - log.Printf("%s: go_proto_library.bzl is deprecated. Run 'gazelle fix' to replace old rules.", f.Path) - return - } - - // Delete legacy proto loads and filegroups. Only delete go_proto_library - // rules if we deleted a load. - for _, l := range protoLoads { - l.Delete() - } - for _, r := range protoFilegroups { - r.Delete() - } - if len(protoLoads) > 0 { - for _, r := range protoRules { - r.Delete() - } - } -} - -// removeLegacyGazelle removes loads of the "gazelle" macro from -// @io_bazel_rules_go//go:def.bzl. The definition has moved to -// @bazel_gazelle//:def.bzl, and the old one will be deleted soon. -func removeLegacyGazelle(c *config.Config, f *rule.File) { - for _, l := range f.Loads { - if l.Name() == "@io_bazel_rules_go//go:def.bzl" && l.Has("gazelle") { - l.Remove("gazelle") - if l.IsEmpty() { - l.Delete() - } - } - } -} - -func isGoRule(kind string) bool { - return kind == "go_library" || - kind == "go_binary" || - kind == "go_test" || - kind == "go_proto_library" || - kind == "go_grpc_library" -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/generate.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/generate.go deleted file mode 100644 index c9b398ebf50..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/generate.go +++ /dev/null @@ -1,638 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 golang - -import ( - "fmt" - "go/build" - "log" - "path" - "path/filepath" - "sort" - "strings" - "sync" - - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/language" - "github.com/bazelbuild/bazel-gazelle/language/proto" - "github.com/bazelbuild/bazel-gazelle/pathtools" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -func (gl *goLang) GenerateRules(args language.GenerateArgs) language.GenerateResult { - // Extract information about proto files. We need this to exclude .pb.go - // files and generate go_proto_library rules. - c := args.Config - gc := getGoConfig(c) - pcMode := getProtoMode(c) - - // This is a collection of proto_library rule names that have a corresponding - // go_proto_library rule already generated. - goProtoRules := make(map[string]struct{}) - - var protoRuleNames []string - protoPackages := make(map[string]proto.Package) - protoFileInfo := make(map[string]proto.FileInfo) - for _, r := range args.OtherGen { - if r.Kind() == "go_proto_library" { - if proto := r.AttrString("proto"); proto != "" { - goProtoRules[proto] = struct{}{} - } - if protos := r.AttrStrings("protos"); protos != nil { - for _, proto := range protos { - goProtoRules[proto] = struct{}{} - } - } - - } - if r.Kind() != "proto_library" { - continue - } - pkg := r.PrivateAttr(proto.PackageKey).(proto.Package) - protoPackages[r.Name()] = pkg - for name, info := range pkg.Files { - protoFileInfo[name] = info - } - protoRuleNames = append(protoRuleNames, r.Name()) - } - sort.Strings(protoRuleNames) - var emptyProtoRuleNames []string - for _, r := range args.OtherEmpty { - if r.Kind() == "proto_library" { - emptyProtoRuleNames = append(emptyProtoRuleNames, r.Name()) - } - } - - // If proto rule generation is enabled, exclude .pb.go files that correspond - // to any .proto files present. - regularFiles := append([]string{}, args.RegularFiles...) - genFiles := append([]string{}, args.GenFiles...) - if !pcMode.ShouldIncludePregeneratedFiles() { - keep := func(f string) bool { - if strings.HasSuffix(f, ".pb.go") { - _, ok := protoFileInfo[strings.TrimSuffix(f, ".pb.go")+".proto"] - return !ok - } - return true - } - filterFiles(®ularFiles, keep) - filterFiles(&genFiles, keep) - } - - // Split regular files into files which can determine the package name and - // import path and other files. - var goFiles, otherFiles []string - for _, f := range regularFiles { - if strings.HasSuffix(f, ".go") { - goFiles = append(goFiles, f) - } else { - otherFiles = append(otherFiles, f) - } - } - - // Look for a subdirectory named testdata. Only treat it as data if it does - // not contain a buildable package. - var hasTestdata bool - for _, sub := range args.Subdirs { - if sub == "testdata" { - hasTestdata = !gl.goPkgRels[path.Join(args.Rel, "testdata")] - break - } - } - - // Build a set of packages from files in this directory. - goPackageMap, goFilesWithUnknownPackage := buildPackages(c, args.Dir, args.Rel, goFiles, hasTestdata) - - // Select a package to generate rules for. If there is no package, create - // an empty package so we can generate empty rules. - var protoName string - pkg, err := selectPackage(c, args.Dir, goPackageMap) - if err != nil { - if _, ok := err.(*build.NoGoError); ok { - if len(protoPackages) == 1 { - for name, ppkg := range protoPackages { - if _, ok := goProtoRules[":"+name]; ok { - // if a go_proto_library rule already exists for this - // proto package, treat it as if the proto package - // doesn't exist. - pkg = emptyPackage(c, args.Dir, args.Rel) - break - } - pkg = &goPackage{ - name: goProtoPackageName(ppkg), - importPath: goProtoImportPath(gc, ppkg, args.Rel), - proto: protoTargetFromProtoPackage(name, ppkg), - } - protoName = name - break - } - } else { - pkg = emptyPackage(c, args.Dir, args.Rel) - } - } else { - log.Print(err) - } - } - - // Try to link the selected package with a proto package. - if pkg != nil { - if pkg.importPath == "" { - if err := pkg.inferImportPath(c); err != nil && pkg.firstGoFile() != "" { - inferImportPathErrorOnce.Do(func() { log.Print(err) }) - } - } - for _, name := range protoRuleNames { - ppkg := protoPackages[name] - if pkg.importPath == goProtoImportPath(gc, ppkg, args.Rel) { - protoName = name - pkg.proto = protoTargetFromProtoPackage(name, ppkg) - break - } - } - } - - // Generate rules for proto packages. These should come before the other - // Go rules. - g := &generator{ - c: c, - rel: args.Rel, - shouldSetVisibility: args.File == nil || !args.File.HasDefaultVisibility(), - } - var res language.GenerateResult - var rules []*rule.Rule - var protoEmbed string - for _, name := range protoRuleNames { - if _, ok := goProtoRules[":"+name]; ok { - // if a go_proto_library rule exists for this proto_library rule - // already, skip creating another go_proto_library for it, assuming - // that a different gazelle extension is responsible for - // go_proto_library rule generation. - continue - } - ppkg := protoPackages[name] - var rs []*rule.Rule - if name == protoName { - protoEmbed, rs = g.generateProto(pcMode, pkg.proto, pkg.importPath) - } else { - target := protoTargetFromProtoPackage(name, ppkg) - importPath := goProtoImportPath(gc, ppkg, args.Rel) - _, rs = g.generateProto(pcMode, target, importPath) - } - rules = append(rules, rs...) - } - for _, name := range emptyProtoRuleNames { - goProtoName := strings.TrimSuffix(name, "_proto") + "_go_proto" - res.Empty = append(res.Empty, rule.NewRule("go_proto_library", goProtoName)) - } - if pkg != nil && pcMode == proto.PackageMode && pkg.firstGoFile() == "" { - // In proto package mode, don't generate a go_library embedding a - // go_proto_library unless there are actually go files. - protoEmbed = "" - } - - // Complete the Go package and generate rules for that. - if pkg != nil { - // Add files with unknown packages. This happens when there are parse - // or I/O errors. We should keep the file in the srcs list and let the - // compiler deal with the error. - cgo := pkg.haveCgo() - for _, info := range goFilesWithUnknownPackage { - if err := pkg.addFile(c, info, cgo); err != nil { - log.Print(err) - } - } - - // Process the other static files. - for _, file := range otherFiles { - info := otherFileInfo(filepath.Join(args.Dir, file)) - if err := pkg.addFile(c, info, cgo); err != nil { - log.Print(err) - } - } - - // Process generated files. Note that generated files may have the same names - // as static files. Bazel will use the generated files, but we will look at - // the content of static files, assuming they will be the same. - regularFileSet := make(map[string]bool) - for _, f := range regularFiles { - regularFileSet[f] = true - } - // Some of the generated files may have been consumed by other rules - consumedFileSet := make(map[string]bool) - for _, r := range args.OtherGen { - for _, f := range r.AttrStrings("srcs") { - consumedFileSet[f] = true - } - if f := r.AttrString("src"); f != "" { - consumedFileSet[f] = true - } - } - for _, f := range genFiles { - if regularFileSet[f] || consumedFileSet[f] { - continue - } - info := fileNameInfo(filepath.Join(args.Dir, f)) - if err := pkg.addFile(c, info, cgo); err != nil { - log.Print(err) - } - } - - // Generate Go rules. - if protoName == "" { - // Empty proto rules for deletion. - _, rs := g.generateProto(pcMode, pkg.proto, pkg.importPath) - rules = append(rules, rs...) - } - lib := g.generateLib(pkg, protoEmbed) - var libName string - if !lib.IsEmpty(goKinds[lib.Kind()]) { - libName = lib.Name() - } - rules = append(rules, lib) - rules = append(rules, - g.generateBin(pkg, libName), - g.generateTest(pkg, libName)) - } - - for _, r := range rules { - if r.IsEmpty(goKinds[r.Kind()]) { - res.Empty = append(res.Empty, r) - } else { - res.Gen = append(res.Gen, r) - res.Imports = append(res.Imports, r.PrivateAttr(config.GazelleImportsKey)) - } - } - - if args.File != nil || len(res.Gen) > 0 { - gl.goPkgRels[args.Rel] = true - } else { - for _, sub := range args.Subdirs { - if gl.goPkgRels[path.Join(args.Rel, sub)] { - gl.goPkgRels[args.Rel] = true - break - } - } - } - - return res -} - -func filterFiles(files *[]string, pred func(string) bool) { - w := 0 - for r := 0; r < len(*files); r++ { - f := (*files)[r] - if pred(f) { - (*files)[w] = f - w++ - } - } - *files = (*files)[:w] -} - -func buildPackages(c *config.Config, dir, rel string, goFiles []string, hasTestdata bool) (packageMap map[string]*goPackage, goFilesWithUnknownPackage []fileInfo) { - // Process .go and .proto files first, since these determine the package name. - packageMap = make(map[string]*goPackage) - for _, f := range goFiles { - path := filepath.Join(dir, f) - info := goFileInfo(path, rel) - if info.packageName == "" { - goFilesWithUnknownPackage = append(goFilesWithUnknownPackage, info) - continue - } - if info.packageName == "documentation" { - // go/build ignores this package - continue - } - - if _, ok := packageMap[info.packageName]; !ok { - packageMap[info.packageName] = &goPackage{ - name: info.packageName, - dir: dir, - rel: rel, - hasTestdata: hasTestdata, - } - } - if err := packageMap[info.packageName].addFile(c, info, false); err != nil { - log.Print(err) - } - } - return packageMap, goFilesWithUnknownPackage -} - -var inferImportPathErrorOnce sync.Once - -// selectPackages selects one Go packages out of the buildable packages found -// in a directory. If multiple packages are found, it returns the package -// whose name matches the directory if such a package exists. -func selectPackage(c *config.Config, dir string, packageMap map[string]*goPackage) (*goPackage, error) { - buildablePackages := make(map[string]*goPackage) - for name, pkg := range packageMap { - if pkg.isBuildable(c) { - buildablePackages[name] = pkg - } - } - - if len(buildablePackages) == 0 { - return nil, &build.NoGoError{Dir: dir} - } - - if len(buildablePackages) == 1 { - for _, pkg := range buildablePackages { - return pkg, nil - } - } - - if pkg, ok := buildablePackages[defaultPackageName(c, dir)]; ok { - return pkg, nil - } - - err := &build.MultiplePackageError{Dir: dir} - for name, pkg := range buildablePackages { - // Add the first file for each package for the error message. - // Error() method expects these lists to be the same length. File - // lists must be non-empty. These lists are only created by - // buildPackage for packages with .go files present. - err.Packages = append(err.Packages, name) - err.Files = append(err.Files, pkg.firstGoFile()) - } - return nil, err -} - -func emptyPackage(c *config.Config, dir, rel string) *goPackage { - pkg := &goPackage{ - name: defaultPackageName(c, dir), - dir: dir, - rel: rel, - } - pkg.inferImportPath(c) - return pkg -} - -func defaultPackageName(c *config.Config, rel string) string { - gc := getGoConfig(c) - return pathtools.RelBaseName(rel, gc.prefix, "") -} - -type generator struct { - c *config.Config - rel string - shouldSetVisibility bool -} - -func (g *generator) generateProto(mode proto.Mode, target protoTarget, importPath string) (string, []*rule.Rule) { - if !mode.ShouldGenerateRules() && mode != proto.LegacyMode { - // Don't create or delete proto rules in this mode. Any existing rules - // are likely hand-written. - return "", nil - } - - gc := getGoConfig(g.c) - filegroupName := legacyProtoFilegroupName - protoName := target.name - if protoName == "" { - importPath := inferImportPath(gc, g.rel) - protoName = proto.RuleName(importPath) - } - goProtoName := strings.TrimSuffix(protoName, "_proto") + "_go_proto" - visibility := g.commonVisibility(importPath) - - if mode == proto.LegacyMode { - filegroup := rule.NewRule("filegroup", filegroupName) - if target.sources.isEmpty() { - return "", []*rule.Rule{filegroup} - } - filegroup.SetAttr("srcs", target.sources.build()) - if g.shouldSetVisibility { - filegroup.SetAttr("visibility", visibility) - } - return "", []*rule.Rule{filegroup} - } - - if target.sources.isEmpty() { - return "", []*rule.Rule{ - rule.NewRule("filegroup", filegroupName), - rule.NewRule("go_proto_library", goProtoName), - } - } - - goProtoLibrary := rule.NewRule("go_proto_library", goProtoName) - goProtoLibrary.SetAttr("proto", ":"+protoName) - g.setImportAttrs(goProtoLibrary, importPath) - if target.hasServices { - goProtoLibrary.SetAttr("compilers", gc.goGrpcCompilers) - } else if gc.goProtoCompilersSet { - goProtoLibrary.SetAttr("compilers", gc.goProtoCompilers) - } - if g.shouldSetVisibility { - goProtoLibrary.SetAttr("visibility", visibility) - } - goProtoLibrary.SetPrivateAttr(config.GazelleImportsKey, target.imports.build()) - return goProtoName, []*rule.Rule{goProtoLibrary} -} - -func (g *generator) generateLib(pkg *goPackage, embed string) *rule.Rule { - goLibrary := rule.NewRule("go_library", defaultLibName) - if !pkg.library.sources.hasGo() && embed == "" { - return goLibrary // empty - } - var visibility []string - if pkg.isCommand() { - // Libraries made for a go_binary should not be exposed to the public. - visibility = []string{"//visibility:private"} - } else { - visibility = g.commonVisibility(pkg.importPath) - } - g.setCommonAttrs(goLibrary, pkg.rel, visibility, pkg.library, embed) - g.setImportAttrs(goLibrary, pkg.importPath) - return goLibrary -} - -func (g *generator) generateBin(pkg *goPackage, library string) *rule.Rule { - name := pathtools.RelBaseName(pkg.rel, getGoConfig(g.c).prefix, g.c.RepoRoot) - goBinary := rule.NewRule("go_binary", name) - if !pkg.isCommand() || pkg.binary.sources.isEmpty() && library == "" { - return goBinary // empty - } - visibility := g.commonVisibility(pkg.importPath) - g.setCommonAttrs(goBinary, pkg.rel, visibility, pkg.binary, library) - return goBinary -} - -func (g *generator) generateTest(pkg *goPackage, library string) *rule.Rule { - goTest := rule.NewRule("go_test", defaultTestName) - if !pkg.test.sources.hasGo() { - return goTest // empty - } - g.setCommonAttrs(goTest, pkg.rel, nil, pkg.test, library) - if pkg.hasTestdata { - goTest.SetAttr("data", rule.GlobValue{Patterns: []string{"testdata/**"}}) - } - return goTest -} - -func (g *generator) setCommonAttrs(r *rule.Rule, pkgRel string, visibility []string, target goTarget, embed string) { - if !target.sources.isEmpty() { - r.SetAttr("srcs", target.sources.buildFlat()) - } - if target.cgo { - r.SetAttr("cgo", true) - } - if !target.clinkopts.isEmpty() { - r.SetAttr("clinkopts", g.options(target.clinkopts.build(), pkgRel)) - } - if !target.copts.isEmpty() { - r.SetAttr("copts", g.options(target.copts.build(), pkgRel)) - } - if g.shouldSetVisibility && len(visibility) > 0 { - r.SetAttr("visibility", visibility) - } - if embed != "" { - r.SetAttr("embed", []string{":" + embed}) - } - r.SetPrivateAttr(config.GazelleImportsKey, target.imports.build()) -} - -func (g *generator) setImportAttrs(r *rule.Rule, importPath string) { - gc := getGoConfig(g.c) - r.SetAttr("importpath", importPath) - - // Set importpath_aliases if we need minimal module compatibility. - // If a package is part of a module with a v2+ semantic import version - // suffix, packages that are not part of modules may import it without - // the suffix. - if gc.goRepositoryMode && gc.moduleMode && pathtools.HasPrefix(importPath, gc.prefix) && gc.prefixRel == "" { - if mmcImportPath := pathWithoutSemver(importPath); mmcImportPath != "" { - r.SetAttr("importpath_aliases", []string{mmcImportPath}) - } - } - - if gc.importMapPrefix != "" { - fromPrefixRel := pathtools.TrimPrefix(g.rel, gc.importMapPrefixRel) - importMap := path.Join(gc.importMapPrefix, fromPrefixRel) - if importMap != importPath { - r.SetAttr("importmap", importMap) - } - } -} - -func (g *generator) commonVisibility(importPath string) []string { - // If the Bazel package name (rel) contains "internal", add visibility for - // subpackages of the parent. - // If the import path contains "internal" but rel does not, this is - // probably an internal submodule. Add visibility for all subpackages. - relIndex := pathtools.Index(g.rel, "internal") - importIndex := pathtools.Index(importPath, "internal") - visibility := getGoConfig(g.c).goVisibility - if relIndex >= 0 { - parent := strings.TrimSuffix(g.rel[:relIndex], "/") - visibility = append(visibility, fmt.Sprintf("//%s:__subpackages__", parent)) - } else if importIndex >= 0 { - visibility = append(visibility, "//:__subpackages__") - } else { - return []string{"//visibility:public"} - } - - // Add visibility for any submodules that have the internal parent as - // a prefix of their module path. - if importIndex >= 0 { - gc := getGoConfig(g.c) - internalRoot := strings.TrimSuffix(importPath[:importIndex], "/") - for _, m := range gc.submodules { - if strings.HasPrefix(m.modulePath, internalRoot) { - visibility = append(visibility, fmt.Sprintf("@%s//:__subpackages__", m.repoName)) - } - } - } - - return visibility -} - -var ( - // shortOptPrefixes are strings that come at the beginning of an option - // argument that includes a path, e.g., -Ifoo/bar. - shortOptPrefixes = []string{"-I", "-L", "-F"} - - // longOptPrefixes are separate arguments that come before a path argument, - // e.g., -iquote foo/bar. - longOptPrefixes = []string{"-I", "-L", "-F", "-iquote", "-isystem"} -) - -// options transforms package-relative paths in cgo options into repository- -// root-relative paths that Bazel can understand. For example, if a cgo file -// in //foo declares an include flag in its copts: "-Ibar", this method -// will transform that flag into "-Ifoo/bar". -func (g *generator) options(opts rule.PlatformStrings, pkgRel string) rule.PlatformStrings { - fixPath := func(opt string) string { - if strings.HasPrefix(opt, "/") { - return opt - } - return path.Clean(path.Join(pkgRel, opt)) - } - - fixGroups := func(groups []string) ([]string, error) { - fixedGroups := make([]string, len(groups)) - for i, group := range groups { - opts := strings.Split(group, optSeparator) - fixedOpts := make([]string, len(opts)) - isPath := false - for j, opt := range opts { - if isPath { - opt = fixPath(opt) - isPath = false - goto next - } - - for _, short := range shortOptPrefixes { - if strings.HasPrefix(opt, short) && len(opt) > len(short) { - opt = short + fixPath(opt[len(short):]) - goto next - } - } - - for _, long := range longOptPrefixes { - if opt == long { - isPath = true - goto next - } - } - - next: - fixedOpts[j] = escapeOption(opt) - } - fixedGroups[i] = strings.Join(fixedOpts, " ") - } - - return fixedGroups, nil - } - - opts, errs := opts.MapSlice(fixGroups) - if errs != nil { - log.Panicf("unexpected error when transforming options with pkg %q: %v", pkgRel, errs) - } - return opts -} - -func escapeOption(opt string) string { - return strings.NewReplacer( - `\`, `\\`, - `'`, `\'`, - `"`, `\"`, - ` `, `\ `, - "\t", "\\\t", - "\n", "\\\n", - "\r", "\\\r", - ).Replace(opt) -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/godep.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/godep.go deleted file mode 100644 index 83337b7b3e6..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/godep.go +++ /dev/null @@ -1,88 +0,0 @@ -/* Copyright 2019 The Bazel Authors. 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 golang - -import ( - "encoding/json" - "fmt" - "io/ioutil" - - "github.com/bazelbuild/bazel-gazelle/label" - "github.com/bazelbuild/bazel-gazelle/language" - "github.com/bazelbuild/bazel-gazelle/rule" - "golang.org/x/sync/errgroup" -) - -type goDepLockFile struct { - ImportPath string - GoVersion string - GodepVersion string - Packages []string - Deps []goDepProject -} - -type goDepProject struct { - ImportPath string - Rev string -} - -func importReposFromGodep(args language.ImportReposArgs) language.ImportReposResult { - data, err := ioutil.ReadFile(args.Path) - if err != nil { - return language.ImportReposResult{Error: err} - } - - file := goDepLockFile{} - if err := json.Unmarshal(data, &file); err != nil { - return language.ImportReposResult{Error: err} - } - - var eg errgroup.Group - roots := make([]string, len(file.Deps)) - for i := range file.Deps { - i := i - eg.Go(func() error { - p := file.Deps[i] - repoRoot, _, err := args.Cache.Root(p.ImportPath) - if err != nil { - return err - } - roots[i] = repoRoot - return nil - }) - } - if err := eg.Wait(); err != nil { - return language.ImportReposResult{Error: err} - } - - gen := make([]*rule.Rule, 0, len(file.Deps)) - repoToRev := make(map[string]string) - for i, p := range file.Deps { - repoRoot := roots[i] - if rev, ok := repoToRev[repoRoot]; !ok { - r := rule.NewRule("go_repository", label.ImportPathToBazelRepoName(repoRoot)) - r.SetAttr("importpath", repoRoot) - r.SetAttr("commit", p.Rev) - repoToRev[repoRoot] = p.Rev - gen = append(gen, r) - } else { - if p.Rev != rev { - return language.ImportReposResult{Error: fmt.Errorf("repo %s imported at multiple revisions: %s, %s", repoRoot, p.Rev, rev)} - } - } - } - return language.ImportReposResult{Gen: gen} -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/kinds.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/kinds.go deleted file mode 100644 index fa89023727f..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/kinds.go +++ /dev/null @@ -1,153 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 golang - -import "github.com/bazelbuild/bazel-gazelle/rule" - -var goKinds = map[string]rule.KindInfo{ - "filegroup": { - NonEmptyAttrs: map[string]bool{"srcs": true}, - MergeableAttrs: map[string]bool{"srcs": true}, - }, - "go_binary": { - MatchAny: true, - NonEmptyAttrs: map[string]bool{ - "deps": true, - "embed": true, - "srcs": true, - }, - SubstituteAttrs: map[string]bool{"embed": true}, - MergeableAttrs: map[string]bool{ - "cgo": true, - "clinkopts": true, - "copts": true, - "embed": true, - "srcs": true, - }, - ResolveAttrs: map[string]bool{"deps": true}, - }, - "go_library": { - MatchAttrs: []string{"importpath"}, - NonEmptyAttrs: map[string]bool{ - "deps": true, - "embed": true, - "srcs": true, - }, - SubstituteAttrs: map[string]bool{ - "embed": true, - }, - MergeableAttrs: map[string]bool{ - "cgo": true, - "clinkopts": true, - "copts": true, - "embed": true, - "importmap": true, - "importpath": true, - "srcs": true, - }, - ResolveAttrs: map[string]bool{"deps": true}, - }, - "go_proto_library": { - MatchAttrs: []string{"importpath"}, - NonEmptyAttrs: map[string]bool{ - "deps": true, - "embed": true, - "proto": true, - "srcs": true, - }, - SubstituteAttrs: map[string]bool{"proto": true}, - MergeableAttrs: map[string]bool{ - "srcs": true, - "importpath": true, - "importmap": true, - "cgo": true, - "clinkopts": true, - "copts": true, - "embed": true, - "proto": true, - "compilers": true, - }, - ResolveAttrs: map[string]bool{"deps": true}, - }, - "go_repository": { - MatchAttrs: []string{"importpath"}, - NonEmptyAttrs: map[string]bool{ - "importpath": true, - }, - MergeableAttrs: map[string]bool{ - "commit": true, - "importpath": true, - "remote": true, - "replace": true, - "sha256": true, - "strip_prefix": true, - "sum": true, - "tag": true, - "type": true, - "urls": true, - "vcs": true, - "version": true, - }, - }, - "go_test": { - NonEmptyAttrs: map[string]bool{ - "deps": true, - "embed": true, - "srcs": true, - }, - MergeableAttrs: map[string]bool{ - "cgo": true, - "clinkopts": true, - "copts": true, - "embed": true, - "srcs": true, - }, - ResolveAttrs: map[string]bool{"deps": true}, - }, -} - -var goLoads = []rule.LoadInfo{ - { - Name: "@io_bazel_rules_go//go:def.bzl", - Symbols: []string{ - "cgo_library", - "go_binary", - "go_library", - "go_prefix", - "go_repository", - "go_test", - }, - }, { - Name: "@io_bazel_rules_go//proto:def.bzl", - Symbols: []string{ - "go_grpc_library", - "go_proto_library", - }, - }, { - Name: "@bazel_gazelle//:deps.bzl", - Symbols: []string{ - "go_repository", - }, - After: []string{ - "go_rules_dependencies", - "go_register_toolchains", - "gazelle_dependencies", - }, - }, -} - -func (_ *goLang) Kinds() map[string]rule.KindInfo { return goKinds } -func (_ *goLang) Loads() []rule.LoadInfo { return goLoads } diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/known_go_imports.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/known_go_imports.go deleted file mode 100644 index 5ee9815da12..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/known_go_imports.go +++ /dev/null @@ -1,201 +0,0 @@ -// Generated by language/proto/gen/gen_known_imports.go -// From language/proto/proto.csv - -package golang - -import "github.com/bazelbuild/bazel-gazelle/label" - -var knownGoProtoImports = map[string]label.Label{ - - "github.com/golang/protobuf/ptypes/any": label.New("io_bazel_rules_go", "proto/wkt", "any_go_proto"), - "google.golang.org/genproto/protobuf/api": label.New("io_bazel_rules_go", "proto/wkt", "api_go_proto"), - "github.com/golang/protobuf/protoc-gen-go/plugin": label.New("io_bazel_rules_go", "proto/wkt", "compiler_plugin_go_proto"), - "github.com/golang/protobuf/protoc-gen-go/descriptor": label.New("io_bazel_rules_go", "proto/wkt", "descriptor_go_proto"), - "github.com/golang/protobuf/ptypes/duration": label.New("io_bazel_rules_go", "proto/wkt", "duration_go_proto"), - "github.com/golang/protobuf/ptypes/empty": label.New("io_bazel_rules_go", "proto/wkt", "empty_go_proto"), - "google.golang.org/genproto/protobuf/field_mask": label.New("io_bazel_rules_go", "proto/wkt", "field_mask_go_proto"), - "google.golang.org/genproto/protobuf/source_context": label.New("io_bazel_rules_go", "proto/wkt", "source_context_go_proto"), - "github.com/golang/protobuf/ptypes/struct": label.New("io_bazel_rules_go", "proto/wkt", "struct_go_proto"), - "github.com/golang/protobuf/ptypes/timestamp": label.New("io_bazel_rules_go", "proto/wkt", "timestamp_go_proto"), - "google.golang.org/genproto/protobuf/ptype": label.New("io_bazel_rules_go", "proto/wkt", "type_go_proto"), - "github.com/golang/protobuf/ptypes/wrappers": label.New("io_bazel_rules_go", "proto/wkt", "wrappers_go_proto"), - "google.golang.org/genproto/googleapis/ads/googleads/v1/common": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google.golang.org/genproto/googleapis/ads/googleads/v1/enums": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google.golang.org/genproto/googleapis/ads/googleads/v1/errors": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google.golang.org/genproto/googleapis/ads/googleads/v1/resources": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google.golang.org/genproto/googleapis/ads/googleads/v1/services": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google.golang.org/genproto/googleapis/ads/googleads/v2/common": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google.golang.org/genproto/googleapis/ads/googleads/v2/enums": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google.golang.org/genproto/googleapis/ads/googleads/v2/errors": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google.golang.org/genproto/googleapis/ads/googleads/v2/resources": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google.golang.org/genproto/googleapis/ads/googleads/v2/services": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google.golang.org/genproto/googleapis/api/annotations": label.New("go_googleapis", "google/api", "annotations_go_proto"), - "google.golang.org/genproto/googleapis/api/serviceconfig": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google.golang.org/genproto/googleapis/api/configchange": label.New("go_googleapis", "google/api", "configchange_go_proto"), - "google.golang.org/genproto/googleapis/api/distribution": label.New("go_googleapis", "google/api", "distribution_go_proto"), - "google.golang.org/genproto/googleapis/api/expr/v1alpha1": label.New("go_googleapis", "google/api/expr/v1alpha1", "expr_go_proto"), - "google.golang.org/genproto/googleapis/api/expr/v1beta1": label.New("go_googleapis", "google/api/expr/v1beta1", "expr_go_proto"), - "google.golang.org/genproto/googleapis/api/httpbody": label.New("go_googleapis", "google/api", "httpbody_go_proto"), - "google.golang.org/genproto/googleapis/api/label": label.New("go_googleapis", "google/api", "label_go_proto"), - "google.golang.org/genproto/googleapis/api": label.New("go_googleapis", "google/api", "api_go_proto"), - "google.golang.org/genproto/googleapis/api/metric": label.New("go_googleapis", "google/api", "metric_go_proto"), - "google.golang.org/genproto/googleapis/api/monitoredres": label.New("go_googleapis", "google/api", "monitoredres_go_proto"), - "google.golang.org/genproto/googleapis/api/servicecontrol/v1": label.New("go_googleapis", "google/api/servicecontrol/v1", "servicecontrol_go_proto"), - "google.golang.org/genproto/googleapis/api/servicemanagement/v1": label.New("go_googleapis", "google/api/servicemanagement/v1", "servicemanagement_go_proto"), - "google.golang.org/genproto/googleapis/appengine/legacy": label.New("go_googleapis", "google/appengine/legacy", "legacy_go_proto"), - "google.golang.org/genproto/googleapis/appengine/logging/v1": label.New("go_googleapis", "google/appengine/logging/v1", "logging_go_proto"), - "google.golang.org/genproto/googleapis/appengine/v1": label.New("go_googleapis", "google/appengine/v1", "appengine_go_proto"), - "google.golang.org/genproto/googleapis/assistant/embedded/v1alpha1": label.New("go_googleapis", "google/assistant/embedded/v1alpha1", "embedded_go_proto"), - "google.golang.org/genproto/googleapis/assistant/embedded/v1alpha2": label.New("go_googleapis", "google/assistant/embedded/v1alpha2", "embedded_go_proto"), - "google.golang.org/genproto/googleapis/bigtable/admin/cluster/v1": label.New("go_googleapis", "google/bigtable/admin/cluster/v1", "cluster_go_proto"), - "google.golang.org/genproto/googleapis/bigtable/admin/table/v1": label.New("go_googleapis", "google/bigtable/admin/table/v1", "table_go_proto"), - "google.golang.org/genproto/googleapis/bigtable/admin/v2": label.New("go_googleapis", "google/bigtable/admin/v2", "admin_go_proto"), - "google.golang.org/genproto/googleapis/bigtable/v1": label.New("go_googleapis", "google/bigtable/v1", "bigtable_go_proto"), - "google.golang.org/genproto/googleapis/bigtable/v2": label.New("go_googleapis", "google/bigtable/v2", "bigtable_go_proto"), - "google.golang.org/genproto/googleapis/bytestream": label.New("go_googleapis", "google/bytestream", "bytestream_go_proto"), - "google.golang.org/genproto/googleapis/cloud/asset/v1": label.New("go_googleapis", "google/cloud/asset/v1", "asset_go_proto"), - "google.golang.org/genproto/googleapis/cloud/asset/v1beta1": label.New("go_googleapis", "google/cloud/asset/v1beta1", "asset_go_proto"), - "google.golang.org/genproto/googleapis/cloud/asset/v1p2beta1": label.New("go_googleapis", "google/cloud/asset/v1p2beta1", "asset_go_proto"), - "google.golang.org/genproto/googleapis/cloud/audit": label.New("go_googleapis", "google/cloud/audit", "audit_go_proto"), - "google.golang.org/genproto/googleapis/cloud/automl/v1": label.New("go_googleapis", "google/cloud/automl/v1", "automl_go_proto"), - "google.golang.org/genproto/googleapis/cloud/automl/v1beta1": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google.golang.org/genproto/googleapis/cloud/bigquery/datatransfer/v1": label.New("go_googleapis", "google/cloud/bigquery/datatransfer/v1", "datatransfer_go_proto"), - "google.golang.org/genproto/googleapis/cloud/bigquery/logging/v1": label.New("go_googleapis", "google/cloud/bigquery/logging/v1", "logging_go_proto"), - "google.golang.org/genproto/googleapis/cloud/bigquery/storage/v1beta1": label.New("go_googleapis", "google/cloud/bigquery/storage/v1beta1", "storage_go_proto"), - "google.golang.org/genproto/googleapis/cloud/bigquery/v2": label.New("go_googleapis", "google/cloud/bigquery/v2", "bigquery_go_proto"), - "google.golang.org/genproto/googleapis/cloud/billing/v1": label.New("go_googleapis", "google/cloud/billing/v1", "billing_go_proto"), - "google.golang.org/genproto/googleapis/cloud/binaryauthorization/v1beta1": label.New("go_googleapis", "google/cloud/binaryauthorization/v1beta1", "binaryauthorization_go_proto"), - "google.golang.org/genproto/googleapis/cloud/datacatalog/v1beta1": label.New("go_googleapis", "google/cloud/datacatalog/v1beta1", "datacatalog_go_proto"), - "google.golang.org/genproto/googleapis/cloud/datalabeling/v1beta1": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_go_proto"), - "google.golang.org/genproto/googleapis/cloud/dataproc/v1": label.New("go_googleapis", "google/cloud/dataproc/v1", "dataproc_go_proto"), - "google.golang.org/genproto/googleapis/cloud/dataproc/v1beta2": label.New("go_googleapis", "google/cloud/dataproc/v1beta2", "dataproc_go_proto"), - "google.golang.org/genproto/googleapis/cloud/dialogflow/v2": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_go_proto"), - "google.golang.org/genproto/googleapis/cloud/dialogflow/v2beta1": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_go_proto"), - "google.golang.org/genproto/googleapis/cloud/document/v1beta1": label.New("go_googleapis", "google/cloud/document/v1beta1", "document_go_proto"), - "google.golang.org/genproto/googleapis/cloud/functions/v1beta2": label.New("go_googleapis", "google/cloud/functions/v1beta2", "functions_go_proto"), - "google.golang.org/genproto/googleapis/cloud/iot/v1": label.New("go_googleapis", "google/cloud/iot/v1", "iot_go_proto"), - "google.golang.org/genproto/googleapis/cloud/irm/v1alpha2": label.New("go_googleapis", "google/cloud/irm/v1alpha2", "irm_go_proto"), - "google.golang.org/genproto/googleapis/cloud/kms/v1": label.New("go_googleapis", "google/cloud/kms/v1", "kms_go_proto"), - "google.golang.org/genproto/googleapis/cloud/language/v1": label.New("go_googleapis", "google/cloud/language/v1", "language_go_proto"), - "google.golang.org/genproto/googleapis/cloud/language/v1beta1": label.New("go_googleapis", "google/cloud/language/v1beta1", "language_go_proto"), - "google.golang.org/genproto/googleapis/cloud/language/v1beta2": label.New("go_googleapis", "google/cloud/language/v1beta2", "language_go_proto"), - "google.golang.org/genproto/googleapis/cloud/location": label.New("go_googleapis", "google/cloud/location", "location_go_proto"), - "google.golang.org/genproto/googleapis/cloud/ml/v1": label.New("go_googleapis", "google/cloud/ml/v1", "ml_go_proto"), - "google.golang.org/genproto/googleapis/cloud/oslogin/common": label.New("go_googleapis", "google/cloud/oslogin/common", "common_go_proto"), - "google.golang.org/genproto/googleapis/cloud/oslogin/v1": label.New("go_googleapis", "google/cloud/oslogin/v1", "oslogin_go_proto"), - "google.golang.org/genproto/googleapis/cloud/oslogin/v1alpha": label.New("go_googleapis", "google/cloud/oslogin/v1alpha", "oslogin_go_proto"), - "google.golang.org/genproto/googleapis/cloud/oslogin/v1beta": label.New("go_googleapis", "google/cloud/oslogin/v1beta", "oslogin_go_proto"), - "google.golang.org/genproto/googleapis/cloud/phishingprotection/v1beta1": label.New("go_googleapis", "google/cloud/phishingprotection/v1beta1", "phishingprotection_go_proto"), - "google.golang.org/genproto/googleapis/cloud/recaptchaenterprise/v1beta1": label.New("go_googleapis", "google/cloud/recaptchaenterprise/v1beta1", "recaptchaenterprise_go_proto"), - "google.golang.org/genproto/googleapis/cloud/recommender/v1beta1": label.New("go_googleapis", "google/cloud/recommender/v1beta1", "recommender_go_proto"), - "google.golang.org/genproto/googleapis/cloud/redis/v1": label.New("go_googleapis", "google/cloud/redis/v1", "redis_go_proto"), - "google.golang.org/genproto/googleapis/cloud/redis/v1beta1": label.New("go_googleapis", "google/cloud/redis/v1beta1", "redis_go_proto"), - "google.golang.org/genproto/googleapis/cloud/resourcemanager/v2": label.New("go_googleapis", "google/cloud/resourcemanager/v2", "resourcemanager_go_proto"), - "google.golang.org/genproto/googleapis/cloud/runtimeconfig/v1beta1": label.New("go_googleapis", "google/cloud/runtimeconfig/v1beta1", "runtimeconfig_go_proto"), - "google.golang.org/genproto/googleapis/cloud/scheduler/v1": label.New("go_googleapis", "google/cloud/scheduler/v1", "scheduler_go_proto"), - "google.golang.org/genproto/googleapis/cloud/scheduler/v1beta1": label.New("go_googleapis", "google/cloud/scheduler/v1beta1", "scheduler_go_proto"), - "google.golang.org/genproto/googleapis/cloud/securitycenter/v1": label.New("go_googleapis", "google/cloud/securitycenter/v1", "securitycenter_go_proto"), - "google.golang.org/genproto/googleapis/cloud/securitycenter/v1beta1": label.New("go_googleapis", "google/cloud/securitycenter/v1beta1", "securitycenter_go_proto"), - "google.golang.org/genproto/googleapis/cloud/speech/v1": label.New("go_googleapis", "google/cloud/speech/v1", "speech_go_proto"), - "google.golang.org/genproto/googleapis/cloud/speech/v1p1beta1": label.New("go_googleapis", "google/cloud/speech/v1p1beta1", "speech_go_proto"), - "google.golang.org/genproto/googleapis/cloud/support/common": label.New("go_googleapis", "google/cloud/support", "common_go_proto"), - "google.golang.org/genproto/googleapis/cloud/support/v1alpha1": label.New("go_googleapis", "google/cloud/support/v1alpha1", "support_go_proto"), - "google.golang.org/genproto/googleapis/cloud/talent/v4beta1": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google.golang.org/genproto/googleapis/cloud/tasks/v2": label.New("go_googleapis", "google/cloud/tasks/v2", "tasks_go_proto"), - "google.golang.org/genproto/googleapis/cloud/tasks/v2beta2": label.New("go_googleapis", "google/cloud/tasks/v2beta2", "tasks_go_proto"), - "google.golang.org/genproto/googleapis/cloud/tasks/v2beta3": label.New("go_googleapis", "google/cloud/tasks/v2beta3", "tasks_go_proto"), - "google.golang.org/genproto/googleapis/cloud/texttospeech/v1": label.New("go_googleapis", "google/cloud/texttospeech/v1", "texttospeech_go_proto"), - "google.golang.org/genproto/googleapis/cloud/texttospeech/v1beta1": label.New("go_googleapis", "google/cloud/texttospeech/v1beta1", "texttospeech_go_proto"), - "google.golang.org/genproto/googleapis/cloud/translate/v3": label.New("go_googleapis", "google/cloud/translate/v3", "translate_go_proto"), - "google.golang.org/genproto/googleapis/cloud/translate/v3beta1": label.New("go_googleapis", "google/cloud/translate/v3beta1", "translate_go_proto"), - "google.golang.org/genproto/googleapis/cloud/videointelligence/v1": label.New("go_googleapis", "google/cloud/videointelligence/v1", "videointelligence_go_proto"), - "google.golang.org/genproto/googleapis/cloud/videointelligence/v1beta1": label.New("go_googleapis", "google/cloud/videointelligence/v1beta1", "videointelligence_go_proto"), - "google.golang.org/genproto/googleapis/cloud/videointelligence/v1beta2": label.New("go_googleapis", "google/cloud/videointelligence/v1beta2", "videointelligence_go_proto"), - "google.golang.org/genproto/googleapis/cloud/videointelligence/v1p1beta1": label.New("go_googleapis", "google/cloud/videointelligence/v1p1beta1", "videointelligence_go_proto"), - "google.golang.org/genproto/googleapis/cloud/videointelligence/v1p2beta1": label.New("go_googleapis", "google/cloud/videointelligence/v1p2beta1", "videointelligence_go_proto"), - "google.golang.org/genproto/googleapis/cloud/videointelligence/v1p3beta1": label.New("go_googleapis", "google/cloud/videointelligence/v1p3beta1", "videointelligence_go_proto"), - "google.golang.org/genproto/googleapis/cloud/vision/v1": label.New("go_googleapis", "google/cloud/vision/v1", "vision_go_proto"), - "google.golang.org/genproto/googleapis/cloud/vision/v1p1beta1": label.New("go_googleapis", "google/cloud/vision/v1p1beta1", "vision_go_proto"), - "google.golang.org/genproto/googleapis/cloud/vision/v1p2beta1": label.New("go_googleapis", "google/cloud/vision/v1p2beta1", "vision_go_proto"), - "google.golang.org/genproto/googleapis/cloud/vision/v1p3beta1": label.New("go_googleapis", "google/cloud/vision/v1p3beta1", "vision_go_proto"), - "google.golang.org/genproto/googleapis/cloud/vision/v1p4beta1": label.New("go_googleapis", "google/cloud/vision/v1p4beta1", "vision_go_proto"), - "google.golang.org/genproto/googleapis/cloud/webrisk/v1beta1": label.New("go_googleapis", "google/cloud/webrisk/v1beta1", "webrisk_go_proto"), - "google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1alpha": label.New("go_googleapis", "google/cloud/websecurityscanner/v1alpha", "websecurityscanner_go_proto"), - "google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1beta": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_go_proto"), - "google.golang.org/genproto/googleapis/container/v1": label.New("go_googleapis", "google/container/v1", "container_go_proto"), - "google.golang.org/genproto/googleapis/container/v1alpha1": label.New("go_googleapis", "google/container/v1alpha1", "container_go_proto"), - "google.golang.org/genproto/googleapis/container/v1beta1": label.New("go_googleapis", "google/container/v1beta1", "container_go_proto"), - "google.golang.org/genproto/googleapis/datastore/admin/v1": label.New("go_googleapis", "google/datastore/admin/v1", "admin_go_proto"), - "google.golang.org/genproto/googleapis/datastore/admin/v1beta1": label.New("go_googleapis", "google/datastore/admin/v1beta1", "admin_go_proto"), - "google.golang.org/genproto/googleapis/datastore/v1": label.New("go_googleapis", "google/datastore/v1", "datastore_go_proto"), - "google.golang.org/genproto/googleapis/datastore/v1beta3": label.New("go_googleapis", "google/datastore/v1beta3", "datastore_go_proto"), - "google.golang.org/genproto/googleapis/devtools/build/v1": label.New("go_googleapis", "google/devtools/build/v1", "build_go_proto"), - "google.golang.org/genproto/googleapis/devtools/cloudbuild/v1": label.New("go_googleapis", "google/devtools/cloudbuild/v1", "cloudbuild_go_proto"), - "google.golang.org/genproto/googleapis/devtools/clouddebugger/v2": label.New("go_googleapis", "google/devtools/clouddebugger/v2", "clouddebugger_go_proto"), - "google.golang.org/genproto/googleapis/devtools/clouderrorreporting/v1beta1": label.New("go_googleapis", "google/devtools/clouderrorreporting/v1beta1", "clouderrorreporting_go_proto"), - "google.golang.org/genproto/googleapis/devtools/cloudprofiler/v2": label.New("go_googleapis", "google/devtools/cloudprofiler/v2", "cloudprofiler_go_proto"), - "google.golang.org/genproto/googleapis/devtools/cloudtrace/v1": label.New("go_googleapis", "google/devtools/cloudtrace/v1", "cloudtrace_go_proto"), - "google.golang.org/genproto/googleapis/devtools/cloudtrace/v2": label.New("go_googleapis", "google/devtools/cloudtrace/v2", "cloudtrace_go_proto"), - "google.golang.org/genproto/googleapis/devtools/containeranalysis/v1": label.New("go_googleapis", "google/devtools/containeranalysis/v1", "containeranalysis_go_proto"), - "google.golang.org/genproto/googleapis/devtools/containeranalysis/v1alpha1": label.New("go_googleapis", "google/devtools/containeranalysis/v1alpha1", "containeranalysis_go_proto"), - "google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/attestation": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/attestation", "attestation_go_proto"), - "google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/build": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/build", "build_go_proto"), - "google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/common": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/common", "common_go_proto"), - "google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1", "containeranalysis_go_proto"), - "google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/deployment": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/deployment", "deployment_go_proto"), - "google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/discovery": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/discovery", "discovery_go_proto"), - "google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/grafeas": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/grafeas", "grafeas_go_proto"), - "google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/image": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/image", "image_go_proto"), - "google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/package": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/package", "package_go_proto"), - "google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/provenance": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/provenance", "provenance_go_proto"), - "google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/source": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/source", "source_go_proto"), - "google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/vulnerability": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/vulnerability", "vulnerability_go_proto"), - "google.golang.org/genproto/googleapis/devtools/remoteexecution/v1test": label.New("go_googleapis", "google/devtools/remoteexecution/v1test", "remoteexecution_go_proto"), - "google.golang.org/genproto/googleapis/devtools/remoteworkers/v1test2": label.New("go_googleapis", "google/devtools/remoteworkers/v1test2", "remoteworkers_go_proto"), - "google.golang.org/genproto/googleapis/devtools/resultstore/v2": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google.golang.org/genproto/googleapis/devtools/source/v1": label.New("go_googleapis", "google/devtools/source/v1", "source_go_proto"), - "google.golang.org/genproto/googleapis/devtools/sourcerepo/v1": label.New("go_googleapis", "google/devtools/sourcerepo/v1", "sourcerepo_go_proto"), - "google.golang.org/genproto/googleapis/example/library/v1": label.New("go_googleapis", "google/example/library/v1", "library_go_proto"), - "google.golang.org/genproto/googleapis/firebase/fcm/connection/v1alpha1": label.New("go_googleapis", "google/firebase/fcm/connection/v1alpha1", "connection_go_proto"), - "google.golang.org/genproto/googleapis/firestore/admin/v1": label.New("go_googleapis", "google/firestore/admin/v1", "admin_go_proto"), - "google.golang.org/genproto/googleapis/firestore/admin/v1beta1": label.New("go_googleapis", "google/firestore/admin/v1beta1", "admin_go_proto"), - "google.golang.org/genproto/googleapis/firestore/admin/v1beta2": label.New("go_googleapis", "google/firestore/admin/v1beta2", "admin_go_proto"), - "google.golang.org/genproto/googleapis/firestore/v1": label.New("go_googleapis", "google/firestore/v1", "firestore_go_proto"), - "google.golang.org/genproto/googleapis/firestore/v1beta1": label.New("go_googleapis", "google/firestore/v1beta1", "firestore_go_proto"), - "google.golang.org/genproto/googleapis/genomics/v1": label.New("go_googleapis", "google/genomics/v1", "genomics_go_proto"), - "google.golang.org/genproto/googleapis/genomics/v1alpha2": label.New("go_googleapis", "google/genomics/v1alpha2", "genomics_go_proto"), - "google.golang.org/genproto/googleapis/geo/type/viewport": label.New("go_googleapis", "google/geo/type", "viewport_go_proto"), - "google.golang.org/genproto/googleapis/home/graph/v1": label.New("go_googleapis", "google/home/graph/v1", "graph_go_proto"), - "google.golang.org/genproto/googleapis/iam/admin/v1": label.New("go_googleapis", "google/iam/admin/v1", "admin_go_proto"), - "google.golang.org/genproto/googleapis/iam/credentials/v1": label.New("go_googleapis", "google/iam/credentials/v1", "credentials_go_proto"), - "google.golang.org/genproto/googleapis/iam/v1": label.New("go_googleapis", "google/iam/v1", "iam_go_proto"), - "google.golang.org/genproto/googleapis/iam/v1/logging": label.New("go_googleapis", "google/iam/v1/logging", "logging_go_proto"), - "google.golang.org/genproto/googleapis/logging/type": label.New("go_googleapis", "google/logging/type", "ltype_go_proto"), - "google.golang.org/genproto/googleapis/logging/v2": label.New("go_googleapis", "google/logging/v2", "logging_go_proto"), - "google.golang.org/genproto/googleapis/longrunning": label.New("go_googleapis", "google/longrunning", "longrunning_go_proto"), - "google.golang.org/genproto/googleapis/monitoring/v3": label.New("go_googleapis", "google/monitoring/v3", "monitoring_go_proto"), - "google.golang.org/genproto/googleapis/privacy/dlp/v2": label.New("go_googleapis", "google/privacy/dlp/v2", "dlp_go_proto"), - "google.golang.org/genproto/googleapis/pubsub/v1": label.New("go_googleapis", "google/pubsub/v1", "pubsub_go_proto"), - "google.golang.org/genproto/googleapis/pubsub/v1beta2": label.New("go_googleapis", "google/pubsub/v1beta2", "pubsub_go_proto"), - "google.golang.org/genproto/googleapis/rpc/code": label.New("go_googleapis", "google/rpc", "code_go_proto"), - "google.golang.org/genproto/googleapis/rpc/errdetails": label.New("go_googleapis", "google/rpc", "errdetails_go_proto"), - "google.golang.org/genproto/googleapis/rpc/status": label.New("go_googleapis", "google/rpc", "status_go_proto"), - "google.golang.org/genproto/googleapis/spanner/admin/database/v1": label.New("go_googleapis", "google/spanner/admin/database/v1", "database_go_proto"), - "google.golang.org/genproto/googleapis/spanner/admin/instance/v1": label.New("go_googleapis", "google/spanner/admin/instance/v1", "instance_go_proto"), - "google.golang.org/genproto/googleapis/spanner/v1": label.New("go_googleapis", "google/spanner/v1", "spanner_go_proto"), - "google.golang.org/genproto/googleapis/storagetransfer/v1": label.New("go_googleapis", "google/storagetransfer/v1", "storagetransfer_go_proto"), - "google.golang.org/genproto/googleapis/streetview/publish/v1": label.New("go_googleapis", "google/streetview/publish/v1", "publish_go_proto"), - "google.golang.org/genproto/googleapis/type/calendarperiod": label.New("go_googleapis", "google/type", "calendarperiod_go_proto"), - "google.golang.org/genproto/googleapis/type/color": label.New("go_googleapis", "google/type", "color_go_proto"), - "google.golang.org/genproto/googleapis/type/date": label.New("go_googleapis", "google/type", "date_go_proto"), - "google.golang.org/genproto/googleapis/type/dayofweek": label.New("go_googleapis", "google/type", "dayofweek_go_proto"), - "google.golang.org/genproto/googleapis/type/expr": label.New("go_googleapis", "google/type", "expr_go_proto"), - "google.golang.org/genproto/googleapis/type/fraction": label.New("go_googleapis", "google/type", "fraction_go_proto"), - "google.golang.org/genproto/googleapis/type/latlng": label.New("go_googleapis", "google/type", "latlng_go_proto"), - "google.golang.org/genproto/googleapis/type/money": label.New("go_googleapis", "google/type", "money_go_proto"), - "google.golang.org/genproto/googleapis/type/postaladdress": label.New("go_googleapis", "google/type", "postaladdress_go_proto"), - "google.golang.org/genproto/googleapis/type/quaternion": label.New("go_googleapis", "google/type", "quaternion_go_proto"), - "google.golang.org/genproto/googleapis/type/timeofday": label.New("go_googleapis", "google/type", "timeofday_go_proto"), - "google.golang.org/genproto/googleapis/watcher/v1": label.New("go_googleapis", "google/watcher/v1", "watcher_go_proto"), - "google.golang.org/genproto/googleapis/grafeas/v1": label.New("go_googleapis", "grafeas/v1", "grafeas_go_proto"), -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/known_proto_imports.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/known_proto_imports.go deleted file mode 100644 index ecb17802656..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/known_proto_imports.go +++ /dev/null @@ -1,1614 +0,0 @@ -// Generated by language/proto/gen/gen_known_imports.go -// From language/proto/proto.csv - -package golang - -import "github.com/bazelbuild/bazel-gazelle/label" - -var knownProtoImports = map[string]label.Label{ - - "google/protobuf/any.proto": label.New("io_bazel_rules_go", "proto/wkt", "any_go_proto"), - "google/protobuf/api.proto": label.New("io_bazel_rules_go", "proto/wkt", "api_go_proto"), - "google/protobuf/compiler/plugin.proto": label.New("io_bazel_rules_go", "proto/wkt", "compiler_plugin_go_proto"), - "google/protobuf/descriptor.proto": label.New("io_bazel_rules_go", "proto/wkt", "descriptor_go_proto"), - "google/protobuf/duration.proto": label.New("io_bazel_rules_go", "proto/wkt", "duration_go_proto"), - "google/protobuf/empty.proto": label.New("io_bazel_rules_go", "proto/wkt", "empty_go_proto"), - "google/protobuf/field_mask.proto": label.New("io_bazel_rules_go", "proto/wkt", "field_mask_go_proto"), - "google/protobuf/source_context.proto": label.New("io_bazel_rules_go", "proto/wkt", "source_context_go_proto"), - "google/protobuf/struct.proto": label.New("io_bazel_rules_go", "proto/wkt", "struct_go_proto"), - "google/protobuf/timestamp.proto": label.New("io_bazel_rules_go", "proto/wkt", "timestamp_go_proto"), - "google/protobuf/type.proto": label.New("io_bazel_rules_go", "proto/wkt", "type_go_proto"), - "google/protobuf/wrappers.proto": label.New("io_bazel_rules_go", "proto/wkt", "wrappers_go_proto"), - "google/ads/googleads/v1/common/ad_asset.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/ad_type_infos.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/asset_types.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/bidding.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/click_location.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/criteria.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/criterion_category_availability.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/custom_parameter.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/dates.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/explorer_auto_optimizer_setting.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/extensions.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/feed_common.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/final_app_url.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/frequency_cap.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/keyword_plan_common.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/matching_function.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/metrics.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/policy.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/real_time_bidding_setting.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/segments.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/simulation.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/tag_snippet.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/targeting_setting.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/text_label.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/url_collection.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/user_lists.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/common/value.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_go_proto"), - "google/ads/googleads/v1/enums/access_reason.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/account_budget_proposal_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/account_budget_proposal_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/account_budget_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/ad_customizer_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/ad_group_ad_rotation_mode.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/ad_group_ad_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/ad_group_criterion_approval_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/ad_group_criterion_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/ad_group_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/ad_group_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/ad_network_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/ad_serving_optimization_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/ad_strength.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/ad_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/advertising_channel_sub_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/advertising_channel_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/affiliate_location_feed_relationship_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/affiliate_location_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/age_range_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/app_campaign_app_store.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/app_campaign_bidding_strategy_goal_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/app_payment_model_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/app_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/app_store.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/app_url_operating_system_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/asset_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/attribution_model.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/bid_modifier_source.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/bidding_source.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/bidding_strategy_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/bidding_strategy_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/billing_setup_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/brand_safety_suitability.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/budget_delivery_method.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/budget_period.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/budget_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/budget_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/call_conversion_reporting_state.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/call_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/callout_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/campaign_criterion_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/campaign_draft_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/campaign_experiment_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/campaign_experiment_traffic_split_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/campaign_experiment_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/campaign_serving_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/campaign_shared_set_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/campaign_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/change_status_operation.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/change_status_resource_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/click_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/content_label_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/conversion_action_category.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/conversion_action_counting_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/conversion_action_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/conversion_action_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/conversion_adjustment_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/conversion_attribution_event_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/conversion_lag_bucket.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/conversion_or_adjustment_lag_bucket.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/criterion_category_channel_availability_mode.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/criterion_category_locale_availability_mode.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/criterion_system_serving_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/criterion_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/custom_interest_member_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/custom_interest_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/custom_interest_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/custom_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/customer_match_upload_key_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/customer_pay_per_conversion_eligibility_failure_reason.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/data_driven_model_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/day_of_week.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/device.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/display_ad_format_setting.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/display_upload_product_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/dsa_page_feed_criterion_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/education_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/extension_setting_device.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/extension_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/external_conversion_source.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/feed_attribute_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/feed_item_quality_approval_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/feed_item_quality_disapproval_reason.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/feed_item_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/feed_item_target_device.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/feed_item_target_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/feed_item_validation_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/feed_link_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/feed_mapping_criterion_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/feed_mapping_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/feed_origin.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/feed_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/flight_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/frequency_cap_event_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/frequency_cap_level.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/frequency_cap_time_unit.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/gender_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/geo_target_constant_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/geo_targeting_restriction.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/geo_targeting_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/google_ads_field_category.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/google_ads_field_data_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/hotel_date_selection_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/hotel_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/hotel_rate_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/income_range_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/interaction_event_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/interaction_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/job_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/keyword_match_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/keyword_plan_competition_level.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/keyword_plan_forecast_interval.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/keyword_plan_network.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/label_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/legacy_app_install_ad_app_store.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/listing_custom_attribute_index.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/listing_group_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/local_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/location_extension_targeting_criterion_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/location_group_radius_units.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/location_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/manager_link_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/matching_function_context_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/matching_function_operator.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/media_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/merchant_center_link_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/message_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/mime_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/minute_of_hour.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/mobile_device_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/month_of_year.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/mutate_job_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/negative_geo_target_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/operating_system_version_operator_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/page_one_promoted_strategy_goal.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/parental_status_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/payment_mode.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/placeholder_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/placement_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/policy_approval_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/policy_review_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/policy_topic_entry_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/policy_topic_evidence_destination_mismatch_url_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/policy_topic_evidence_destination_not_working_device.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/positive_geo_target_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/preferred_content_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/price_extension_price_qualifier.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/price_extension_price_unit.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/price_extension_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/price_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/product_bidding_category_level.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/product_bidding_category_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/product_channel.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/product_channel_exclusivity.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/product_condition.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/product_type_level.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/promotion_extension_discount_modifier.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/promotion_extension_occasion.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/promotion_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/proximity_radius_units.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/quality_score_bucket.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/real_estate_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/recommendation_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/search_engine_results_page_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/search_term_match_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/search_term_targeting_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/served_asset_field_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/shared_set_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/shared_set_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/simulation_modification_method.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/simulation_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/sitelink_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/slot.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/spending_limit_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/structured_snippet_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/system_managed_entity_source.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/target_cpa_opt_in_recommendation_goal.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/target_impression_share_location.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/targeting_dimension.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/time_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/tracking_code_page_format.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/tracking_code_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/travel_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/user_interest_taxonomy_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/user_list_access_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/user_list_closing_reason.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/user_list_combined_rule_operator.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/user_list_crm_data_source_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/user_list_date_rule_item_operator.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/user_list_logical_rule_operator.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/user_list_membership_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/user_list_number_rule_item_operator.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/user_list_prepopulation_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/user_list_rule_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/user_list_size_range.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/user_list_string_rule_item_operator.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/user_list_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/vanity_pharma_display_url_mode.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/vanity_pharma_text.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/webpage_condition_operand.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/enums/webpage_condition_operator.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_go_proto"), - "google/ads/googleads/v1/errors/account_budget_proposal_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/ad_customizer_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/ad_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/ad_group_ad_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/ad_group_bid_modifier_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/ad_group_criterion_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/ad_group_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/ad_group_feed_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/ad_parameter_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/ad_sharing_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/adx_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/asset_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/authentication_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/authorization_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/bidding_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/bidding_strategy_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/billing_setup_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/campaign_budget_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/campaign_criterion_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/campaign_draft_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/campaign_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/campaign_experiment_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/campaign_feed_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/campaign_shared_set_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/change_status_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/collection_size_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/context_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/conversion_action_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/conversion_adjustment_upload_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/conversion_upload_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/country_code_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/criterion_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/custom_interest_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/customer_client_link_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/customer_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/customer_feed_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/customer_manager_link_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/database_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/date_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/date_range_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/distinct_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/enum_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/errors.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/extension_feed_item_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/extension_setting_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/feed_attribute_reference_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/feed_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/feed_item_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/feed_item_target_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/feed_item_validation_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/feed_mapping_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/field_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/field_mask_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/function_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/function_parsing_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/geo_target_constant_suggestion_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/header_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/id_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/image_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/internal_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/keyword_plan_ad_group_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/keyword_plan_campaign_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/keyword_plan_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/keyword_plan_idea_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/keyword_plan_keyword_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/keyword_plan_negative_keyword_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/label_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/language_code_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/list_operation_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/manager_link_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/media_bundle_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/media_file_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/media_upload_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/multiplier_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/mutate_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/mutate_job_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/new_resource_creation_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/not_empty_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/not_whitelisted_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/null_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/operation_access_denied_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/operator_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/partial_failure_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/policy_finding_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/policy_validation_parameter_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/policy_violation_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/query_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/quota_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/range_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/recommendation_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/region_code_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/request_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/resource_access_denied_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/resource_count_limit_exceeded_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/setting_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/shared_criterion_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/shared_set_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/size_limit_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/string_format_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/string_length_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/url_field_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/user_list_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/errors/youtube_video_registration_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_go_proto"), - "google/ads/googleads/v1/resources/account_budget.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/account_budget_proposal.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/ad.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/ad_group.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/ad_group_ad.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/ad_group_ad_label.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/ad_group_audience_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/ad_group_bid_modifier.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/ad_group_criterion.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/ad_group_criterion_label.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/ad_group_criterion_simulation.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/ad_group_extension_setting.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/ad_group_feed.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/ad_group_label.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/ad_group_simulation.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/ad_parameter.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/ad_schedule_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/age_range_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/asset.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/bidding_strategy.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/billing_setup.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/campaign.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/campaign_audience_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/campaign_bid_modifier.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/campaign_budget.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/campaign_criterion.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/campaign_criterion_simulation.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/campaign_draft.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/campaign_experiment.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/campaign_extension_setting.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/campaign_feed.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/campaign_label.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/campaign_shared_set.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/carrier_constant.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/change_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/click_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/conversion_action.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/custom_interest.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/customer.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/customer_client.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/customer_client_link.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/customer_extension_setting.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/customer_feed.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/customer_label.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/customer_manager_link.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/customer_negative_criterion.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/detail_placement_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/display_keyword_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/domain_category.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/dynamic_search_ads_search_term_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/expanded_landing_page_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/extension_feed_item.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/feed.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/feed_item.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/feed_item_target.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/feed_mapping.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/feed_placeholder_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/gender_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/geo_target_constant.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/geographic_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/google_ads_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/group_placement_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/hotel_group_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/hotel_performance_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/keyword_plan.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/keyword_plan_ad_group.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/keyword_plan_campaign.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/keyword_plan_keyword.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/keyword_plan_negative_keyword.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/keyword_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/label.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/landing_page_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/language_constant.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/location_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/managed_placement_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/media_file.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/merchant_center_link.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/mobile_app_category_constant.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/mobile_device_constant.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/mutate_job.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/operating_system_version_constant.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/paid_organic_search_term_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/parental_status_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/payments_account.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/product_bidding_category_constant.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/product_group_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/recommendation.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/remarketing_action.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/search_term_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/shared_criterion.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/shared_set.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/shopping_performance_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/topic_constant.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/topic_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/user_interest.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/user_list.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/resources/video.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_go_proto"), - "google/ads/googleads/v1/services/account_budget_proposal_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/account_budget_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/ad_group_ad_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/ad_group_ad_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/ad_group_audience_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/ad_group_bid_modifier_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/ad_group_criterion_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/ad_group_criterion_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/ad_group_criterion_simulation_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/ad_group_extension_setting_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/ad_group_feed_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/ad_group_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/ad_group_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/ad_group_simulation_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/ad_parameter_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/ad_schedule_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/age_range_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/asset_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/bidding_strategy_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/billing_setup_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/campaign_audience_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/campaign_bid_modifier_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/campaign_budget_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/campaign_criterion_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/campaign_criterion_simulation_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/campaign_draft_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/campaign_experiment_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/campaign_extension_setting_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/campaign_feed_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/campaign_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/campaign_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/campaign_shared_set_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/carrier_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/change_status_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/click_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/conversion_action_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/conversion_adjustment_upload_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/conversion_upload_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/custom_interest_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/customer_client_link_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/customer_client_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/customer_extension_setting_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/customer_feed_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/customer_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/customer_manager_link_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/customer_negative_criterion_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/customer_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/detail_placement_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/display_keyword_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/domain_category_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/dynamic_search_ads_search_term_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/expanded_landing_page_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/extension_feed_item_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/feed_item_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/feed_item_target_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/feed_mapping_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/feed_placeholder_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/feed_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/gender_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/geo_target_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/geographic_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/google_ads_field_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/google_ads_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/group_placement_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/hotel_group_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/hotel_performance_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/keyword_plan_ad_group_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/keyword_plan_campaign_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/keyword_plan_idea_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/keyword_plan_keyword_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/keyword_plan_negative_keyword_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/keyword_plan_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/keyword_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/label_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/landing_page_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/language_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/location_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/managed_placement_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/media_file_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/merchant_center_link_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/mobile_app_category_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/mobile_device_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/mutate_job_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/operating_system_version_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/paid_organic_search_term_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/parental_status_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/payments_account_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/product_bidding_category_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/product_group_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/recommendation_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/remarketing_action_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/search_term_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/shared_criterion_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/shared_set_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/shopping_performance_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/topic_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/topic_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/user_interest_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/user_list_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v1/services/video_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_go_proto"), - "google/ads/googleads/v2/common/ad_asset.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/ad_type_infos.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/asset_types.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/bidding.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/click_location.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/criteria.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/criterion_category_availability.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/custom_parameter.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/dates.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/explorer_auto_optimizer_setting.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/extensions.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/feed_common.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/final_app_url.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/frequency_cap.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/keyword_plan_common.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/matching_function.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/metrics.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/policy.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/real_time_bidding_setting.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/segments.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/simulation.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/tag_snippet.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/targeting_setting.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/text_label.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/url_collection.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/user_lists.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/common/value.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_go_proto"), - "google/ads/googleads/v2/enums/access_reason.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/access_role.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/account_budget_proposal_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/account_budget_proposal_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/account_budget_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/ad_customizer_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/ad_group_ad_rotation_mode.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/ad_group_ad_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/ad_group_criterion_approval_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/ad_group_criterion_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/ad_group_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/ad_group_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/ad_network_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/ad_serving_optimization_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/ad_strength.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/ad_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/advertising_channel_sub_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/advertising_channel_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/affiliate_location_feed_relationship_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/affiliate_location_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/age_range_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/app_campaign_app_store.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/app_campaign_bidding_strategy_goal_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/app_payment_model_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/app_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/app_store.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/app_url_operating_system_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/asset_field_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/asset_performance_label.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/asset_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/attribution_model.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/bid_modifier_source.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/bidding_source.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/bidding_strategy_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/bidding_strategy_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/billing_setup_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/brand_safety_suitability.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/budget_delivery_method.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/budget_period.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/budget_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/budget_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/call_conversion_reporting_state.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/call_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/callout_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/campaign_criterion_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/campaign_draft_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/campaign_experiment_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/campaign_experiment_traffic_split_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/campaign_experiment_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/campaign_serving_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/campaign_shared_set_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/campaign_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/change_status_operation.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/change_status_resource_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/click_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/content_label_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/conversion_action_category.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/conversion_action_counting_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/conversion_action_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/conversion_action_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/conversion_adjustment_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/conversion_attribution_event_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/conversion_lag_bucket.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/conversion_or_adjustment_lag_bucket.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/criterion_category_channel_availability_mode.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/criterion_category_locale_availability_mode.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/criterion_system_serving_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/criterion_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/custom_interest_member_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/custom_interest_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/custom_interest_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/custom_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/customer_match_upload_key_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/customer_pay_per_conversion_eligibility_failure_reason.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/data_driven_model_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/day_of_week.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/device.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/display_ad_format_setting.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/display_upload_product_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/distance_bucket.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/dsa_page_feed_criterion_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/education_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/extension_setting_device.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/extension_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/external_conversion_source.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/feed_attribute_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/feed_item_quality_approval_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/feed_item_quality_disapproval_reason.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/feed_item_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/feed_item_target_device.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/feed_item_target_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/feed_item_validation_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/feed_link_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/feed_mapping_criterion_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/feed_mapping_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/feed_origin.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/feed_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/flight_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/frequency_cap_event_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/frequency_cap_level.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/frequency_cap_time_unit.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/gender_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/geo_target_constant_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/geo_targeting_restriction.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/geo_targeting_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/google_ads_field_category.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/google_ads_field_data_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/hotel_date_selection_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/hotel_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/hotel_price_bucket.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/hotel_rate_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/income_range_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/interaction_event_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/interaction_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/invoice_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/job_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/keyword_match_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/keyword_plan_competition_level.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/keyword_plan_forecast_interval.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/keyword_plan_network.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/label_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/legacy_app_install_ad_app_store.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/listing_custom_attribute_index.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/listing_group_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/local_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/location_extension_targeting_criterion_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/location_group_radius_units.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/location_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/manager_link_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/matching_function_context_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/matching_function_operator.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/media_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/merchant_center_link_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/message_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/mime_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/minute_of_hour.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/mobile_device_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/month_of_year.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/mutate_job_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/negative_geo_target_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/operating_system_version_operator_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/page_one_promoted_strategy_goal.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/parental_status_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/payment_mode.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/placeholder_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/placement_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/policy_approval_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/policy_review_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/policy_topic_entry_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/policy_topic_evidence_destination_mismatch_url_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/policy_topic_evidence_destination_not_working_device.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/policy_topic_evidence_destination_not_working_dns_error_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/positive_geo_target_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/preferred_content_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/price_extension_price_qualifier.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/price_extension_price_unit.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/price_extension_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/price_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/product_bidding_category_level.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/product_bidding_category_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/product_channel.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/product_channel_exclusivity.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/product_condition.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/product_type_level.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/promotion_extension_discount_modifier.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/promotion_extension_occasion.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/promotion_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/proximity_radius_units.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/quality_score_bucket.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/reach_plan_ad_length.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/reach_plan_age_range.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/real_estate_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/recommendation_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/search_engine_results_page_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/search_term_match_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/search_term_targeting_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/served_asset_field_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/shared_set_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/shared_set_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/simulation_modification_method.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/simulation_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/sitelink_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/slot.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/spending_limit_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/structured_snippet_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/system_managed_entity_source.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/target_cpa_opt_in_recommendation_goal.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/target_impression_share_location.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/targeting_dimension.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/time_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/tracking_code_page_format.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/tracking_code_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/travel_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/user_interest_taxonomy_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/user_list_access_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/user_list_closing_reason.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/user_list_combined_rule_operator.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/user_list_crm_data_source_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/user_list_date_rule_item_operator.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/user_list_logical_rule_operator.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/user_list_membership_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/user_list_number_rule_item_operator.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/user_list_prepopulation_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/user_list_rule_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/user_list_size_range.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/user_list_string_rule_item_operator.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/user_list_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/vanity_pharma_display_url_mode.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/vanity_pharma_text.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/webpage_condition_operand.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/enums/webpage_condition_operator.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_go_proto"), - "google/ads/googleads/v2/errors/access_invitation_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/account_budget_proposal_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/ad_customizer_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/ad_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/ad_group_ad_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/ad_group_bid_modifier_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/ad_group_criterion_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/ad_group_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/ad_group_feed_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/ad_parameter_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/ad_sharing_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/adx_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/asset_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/authentication_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/authorization_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/bidding_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/bidding_strategy_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/billing_setup_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/campaign_budget_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/campaign_criterion_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/campaign_draft_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/campaign_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/campaign_experiment_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/campaign_feed_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/campaign_shared_set_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/change_status_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/collection_size_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/context_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/conversion_action_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/conversion_adjustment_upload_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/conversion_upload_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/country_code_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/criterion_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/currency_code_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/custom_interest_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/customer_client_link_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/customer_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/customer_feed_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/customer_manager_link_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/database_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/date_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/date_range_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/distinct_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/enum_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/errors.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/extension_feed_item_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/extension_setting_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/feed_attribute_reference_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/feed_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/feed_item_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/feed_item_target_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/feed_item_validation_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/feed_mapping_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/field_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/field_mask_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/function_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/function_parsing_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/geo_target_constant_suggestion_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/header_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/id_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/image_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/internal_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/invoice_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/keyword_plan_ad_group_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/keyword_plan_campaign_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/keyword_plan_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/keyword_plan_idea_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/keyword_plan_keyword_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/keyword_plan_negative_keyword_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/label_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/language_code_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/list_operation_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/manager_link_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/media_bundle_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/media_file_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/media_upload_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/multiplier_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/mutate_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/mutate_job_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/new_resource_creation_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/not_empty_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/not_whitelisted_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/null_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/operation_access_denied_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/operator_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/partial_failure_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/policy_finding_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/policy_validation_parameter_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/policy_violation_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/query_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/quota_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/range_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/reach_plan_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/recommendation_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/region_code_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/request_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/resource_access_denied_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/resource_count_limit_exceeded_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/setting_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/shared_criterion_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/shared_set_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/size_limit_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/string_format_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/string_length_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/url_field_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/user_list_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/errors/youtube_video_registration_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_go_proto"), - "google/ads/googleads/v2/resources/account_budget.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/account_budget_proposal.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/ad.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/ad_group.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/ad_group_ad.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/ad_group_ad_asset_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/ad_group_ad_label.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/ad_group_audience_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/ad_group_bid_modifier.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/ad_group_criterion.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/ad_group_criterion_label.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/ad_group_criterion_simulation.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/ad_group_extension_setting.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/ad_group_feed.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/ad_group_label.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/ad_group_simulation.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/ad_parameter.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/ad_schedule_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/age_range_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/asset.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/bidding_strategy.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/billing_setup.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/campaign.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/campaign_audience_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/campaign_bid_modifier.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/campaign_budget.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/campaign_criterion.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/campaign_criterion_simulation.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/campaign_draft.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/campaign_experiment.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/campaign_extension_setting.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/campaign_feed.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/campaign_label.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/campaign_shared_set.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/carrier_constant.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/change_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/click_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/conversion_action.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/custom_interest.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/customer.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/customer_client.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/customer_client_link.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/customer_extension_setting.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/customer_feed.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/customer_label.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/customer_manager_link.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/customer_negative_criterion.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/detail_placement_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/display_keyword_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/distance_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/domain_category.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/dynamic_search_ads_search_term_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/expanded_landing_page_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/extension_feed_item.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/feed.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/feed_item.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/feed_item_target.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/feed_mapping.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/feed_placeholder_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/gender_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/geo_target_constant.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/geographic_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/google_ads_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/group_placement_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/hotel_group_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/hotel_performance_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/invoice.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/keyword_plan.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/keyword_plan_ad_group.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/keyword_plan_campaign.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/keyword_plan_keyword.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/keyword_plan_negative_keyword.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/keyword_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/label.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/landing_page_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/language_constant.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/location_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/managed_placement_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/media_file.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/merchant_center_link.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/mobile_app_category_constant.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/mobile_device_constant.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/mutate_job.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/operating_system_version_constant.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/paid_organic_search_term_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/parental_status_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/payments_account.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/product_bidding_category_constant.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/product_group_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/recommendation.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/remarketing_action.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/search_term_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/shared_criterion.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/shared_set.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/shopping_performance_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/topic_constant.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/topic_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/user_interest.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/user_list.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/user_location_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/resources/video.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_go_proto"), - "google/ads/googleads/v2/services/account_budget_proposal_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/account_budget_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/ad_group_ad_asset_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/ad_group_ad_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/ad_group_ad_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/ad_group_audience_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/ad_group_bid_modifier_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/ad_group_criterion_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/ad_group_criterion_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/ad_group_criterion_simulation_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/ad_group_extension_setting_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/ad_group_feed_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/ad_group_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/ad_group_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/ad_group_simulation_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/ad_parameter_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/ad_schedule_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/ad_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/age_range_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/asset_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/bidding_strategy_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/billing_setup_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/campaign_audience_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/campaign_bid_modifier_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/campaign_budget_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/campaign_criterion_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/campaign_criterion_simulation_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/campaign_draft_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/campaign_experiment_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/campaign_extension_setting_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/campaign_feed_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/campaign_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/campaign_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/campaign_shared_set_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/carrier_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/change_status_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/click_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/conversion_action_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/conversion_adjustment_upload_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/conversion_upload_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/custom_interest_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/customer_client_link_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/customer_client_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/customer_extension_setting_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/customer_feed_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/customer_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/customer_manager_link_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/customer_negative_criterion_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/customer_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/detail_placement_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/display_keyword_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/distance_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/domain_category_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/dynamic_search_ads_search_term_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/expanded_landing_page_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/extension_feed_item_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/feed_item_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/feed_item_target_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/feed_mapping_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/feed_placeholder_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/feed_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/gender_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/geo_target_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/geographic_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/google_ads_field_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/google_ads_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/group_placement_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/hotel_group_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/hotel_performance_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/invoice_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/keyword_plan_ad_group_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/keyword_plan_campaign_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/keyword_plan_idea_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/keyword_plan_keyword_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/keyword_plan_negative_keyword_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/keyword_plan_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/keyword_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/label_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/landing_page_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/language_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/location_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/managed_placement_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/media_file_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/merchant_center_link_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/mobile_app_category_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/mobile_device_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/mutate_job_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/operating_system_version_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/paid_organic_search_term_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/parental_status_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/payments_account_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/product_bidding_category_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/product_group_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/reach_plan_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/recommendation_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/remarketing_action_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/search_term_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/shared_criterion_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/shared_set_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/shopping_performance_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/topic_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/topic_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/user_interest_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/user_list_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/user_location_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/ads/googleads/v2/services/video_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_go_proto"), - "google/api/annotations.proto": label.New("go_googleapis", "google/api", "annotations_go_proto"), - "google/api/auth.proto": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google/api/backend.proto": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google/api/billing.proto": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google/api/client.proto": label.New("go_googleapis", "google/api", "annotations_go_proto"), - "google/api/config_change.proto": label.New("go_googleapis", "google/api", "configchange_go_proto"), - "google/api/consumer.proto": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google/api/context.proto": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google/api/control.proto": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google/api/distribution.proto": label.New("go_googleapis", "google/api", "distribution_go_proto"), - "google/api/documentation.proto": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google/api/endpoint.proto": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google/api/expr/v1alpha1/cel_service.proto": label.New("go_googleapis", "google/api/expr/v1alpha1", "expr_go_proto"), - "google/api/expr/v1alpha1/checked.proto": label.New("go_googleapis", "google/api/expr/v1alpha1", "expr_go_proto"), - "google/api/expr/v1alpha1/conformance_service.proto": label.New("go_googleapis", "google/api/expr/v1alpha1", "expr_go_proto"), - "google/api/expr/v1alpha1/eval.proto": label.New("go_googleapis", "google/api/expr/v1alpha1", "expr_go_proto"), - "google/api/expr/v1alpha1/explain.proto": label.New("go_googleapis", "google/api/expr/v1alpha1", "expr_go_proto"), - "google/api/expr/v1alpha1/syntax.proto": label.New("go_googleapis", "google/api/expr/v1alpha1", "expr_go_proto"), - "google/api/expr/v1alpha1/value.proto": label.New("go_googleapis", "google/api/expr/v1alpha1", "expr_go_proto"), - "google/api/expr/v1beta1/decl.proto": label.New("go_googleapis", "google/api/expr/v1beta1", "expr_go_proto"), - "google/api/expr/v1beta1/eval.proto": label.New("go_googleapis", "google/api/expr/v1beta1", "expr_go_proto"), - "google/api/expr/v1beta1/expr.proto": label.New("go_googleapis", "google/api/expr/v1beta1", "expr_go_proto"), - "google/api/expr/v1beta1/source.proto": label.New("go_googleapis", "google/api/expr/v1beta1", "expr_go_proto"), - "google/api/expr/v1beta1/value.proto": label.New("go_googleapis", "google/api/expr/v1beta1", "expr_go_proto"), - "google/api/field_behavior.proto": label.New("go_googleapis", "google/api", "annotations_go_proto"), - "google/api/http.proto": label.New("go_googleapis", "google/api", "annotations_go_proto"), - "google/api/httpbody.proto": label.New("go_googleapis", "google/api", "httpbody_go_proto"), - "google/api/label.proto": label.New("go_googleapis", "google/api", "label_go_proto"), - "google/api/launch_stage.proto": label.New("go_googleapis", "google/api", "api_go_proto"), - "google/api/log.proto": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google/api/logging.proto": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google/api/metric.proto": label.New("go_googleapis", "google/api", "metric_go_proto"), - "google/api/monitored_resource.proto": label.New("go_googleapis", "google/api", "monitoredres_go_proto"), - "google/api/monitoring.proto": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google/api/quota.proto": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google/api/resource.proto": label.New("go_googleapis", "google/api", "annotations_go_proto"), - "google/api/service.proto": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google/api/servicecontrol/v1/check_error.proto": label.New("go_googleapis", "google/api/servicecontrol/v1", "servicecontrol_go_proto"), - "google/api/servicecontrol/v1/distribution.proto": label.New("go_googleapis", "google/api/servicecontrol/v1", "servicecontrol_go_proto"), - "google/api/servicecontrol/v1/log_entry.proto": label.New("go_googleapis", "google/api/servicecontrol/v1", "servicecontrol_go_proto"), - "google/api/servicecontrol/v1/metric_value.proto": label.New("go_googleapis", "google/api/servicecontrol/v1", "servicecontrol_go_proto"), - "google/api/servicecontrol/v1/operation.proto": label.New("go_googleapis", "google/api/servicecontrol/v1", "servicecontrol_go_proto"), - "google/api/servicecontrol/v1/quota_controller.proto": label.New("go_googleapis", "google/api/servicecontrol/v1", "servicecontrol_go_proto"), - "google/api/servicecontrol/v1/service_controller.proto": label.New("go_googleapis", "google/api/servicecontrol/v1", "servicecontrol_go_proto"), - "google/api/servicemanagement/v1/resources.proto": label.New("go_googleapis", "google/api/servicemanagement/v1", "servicemanagement_go_proto"), - "google/api/servicemanagement/v1/servicemanager.proto": label.New("go_googleapis", "google/api/servicemanagement/v1", "servicemanagement_go_proto"), - "google/api/source_info.proto": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google/api/system_parameter.proto": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google/api/usage.proto": label.New("go_googleapis", "google/api", "serviceconfig_go_proto"), - "google/appengine/legacy/audit_data.proto": label.New("go_googleapis", "google/appengine/legacy", "legacy_go_proto"), - "google/appengine/logging/v1/request_log.proto": label.New("go_googleapis", "google/appengine/logging/v1", "logging_go_proto"), - "google/appengine/v1/app_yaml.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_go_proto"), - "google/appengine/v1/appengine.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_go_proto"), - "google/appengine/v1/application.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_go_proto"), - "google/appengine/v1/audit_data.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_go_proto"), - "google/appengine/v1/deploy.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_go_proto"), - "google/appengine/v1/instance.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_go_proto"), - "google/appengine/v1/location.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_go_proto"), - "google/appengine/v1/operation.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_go_proto"), - "google/appengine/v1/service.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_go_proto"), - "google/appengine/v1/version.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_go_proto"), - "google/assistant/embedded/v1alpha1/embedded_assistant.proto": label.New("go_googleapis", "google/assistant/embedded/v1alpha1", "embedded_go_proto"), - "google/assistant/embedded/v1alpha2/embedded_assistant.proto": label.New("go_googleapis", "google/assistant/embedded/v1alpha2", "embedded_go_proto"), - "google/bigtable/admin/cluster/v1/bigtable_cluster_data.proto": label.New("go_googleapis", "google/bigtable/admin/cluster/v1", "cluster_go_proto"), - "google/bigtable/admin/cluster/v1/bigtable_cluster_service.proto": label.New("go_googleapis", "google/bigtable/admin/cluster/v1", "cluster_go_proto"), - "google/bigtable/admin/cluster/v1/bigtable_cluster_service_messages.proto": label.New("go_googleapis", "google/bigtable/admin/cluster/v1", "cluster_go_proto"), - "google/bigtable/admin/table/v1/bigtable_table_data.proto": label.New("go_googleapis", "google/bigtable/admin/table/v1", "table_go_proto"), - "google/bigtable/admin/table/v1/bigtable_table_service.proto": label.New("go_googleapis", "google/bigtable/admin/table/v1", "table_go_proto"), - "google/bigtable/admin/table/v1/bigtable_table_service_messages.proto": label.New("go_googleapis", "google/bigtable/admin/table/v1", "table_go_proto"), - "google/bigtable/admin/v2/bigtable_instance_admin.proto": label.New("go_googleapis", "google/bigtable/admin/v2", "admin_go_proto"), - "google/bigtable/admin/v2/bigtable_table_admin.proto": label.New("go_googleapis", "google/bigtable/admin/v2", "admin_go_proto"), - "google/bigtable/admin/v2/common.proto": label.New("go_googleapis", "google/bigtable/admin/v2", "admin_go_proto"), - "google/bigtable/admin/v2/instance.proto": label.New("go_googleapis", "google/bigtable/admin/v2", "admin_go_proto"), - "google/bigtable/admin/v2/table.proto": label.New("go_googleapis", "google/bigtable/admin/v2", "admin_go_proto"), - "google/bigtable/v1/bigtable_data.proto": label.New("go_googleapis", "google/bigtable/v1", "bigtable_go_proto"), - "google/bigtable/v1/bigtable_service.proto": label.New("go_googleapis", "google/bigtable/v1", "bigtable_go_proto"), - "google/bigtable/v1/bigtable_service_messages.proto": label.New("go_googleapis", "google/bigtable/v1", "bigtable_go_proto"), - "google/bigtable/v2/bigtable.proto": label.New("go_googleapis", "google/bigtable/v2", "bigtable_go_proto"), - "google/bigtable/v2/data.proto": label.New("go_googleapis", "google/bigtable/v2", "bigtable_go_proto"), - "google/bytestream/bytestream.proto": label.New("go_googleapis", "google/bytestream", "bytestream_go_proto"), - "google/cloud/asset/v1/asset_service.proto": label.New("go_googleapis", "google/cloud/asset/v1", "asset_go_proto"), - "google/cloud/asset/v1/assets.proto": label.New("go_googleapis", "google/cloud/asset/v1", "asset_go_proto"), - "google/cloud/asset/v1beta1/asset_service.proto": label.New("go_googleapis", "google/cloud/asset/v1beta1", "asset_go_proto"), - "google/cloud/asset/v1beta1/assets.proto": label.New("go_googleapis", "google/cloud/asset/v1beta1", "asset_go_proto"), - "google/cloud/asset/v1p2beta1/asset_service.proto": label.New("go_googleapis", "google/cloud/asset/v1p2beta1", "asset_go_proto"), - "google/cloud/asset/v1p2beta1/assets.proto": label.New("go_googleapis", "google/cloud/asset/v1p2beta1", "asset_go_proto"), - "google/cloud/audit/audit_log.proto": label.New("go_googleapis", "google/cloud/audit", "audit_go_proto"), - "google/cloud/automl/v1/annotation_payload.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_go_proto"), - "google/cloud/automl/v1/data_items.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_go_proto"), - "google/cloud/automl/v1/dataset.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_go_proto"), - "google/cloud/automl/v1/io.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_go_proto"), - "google/cloud/automl/v1/model.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_go_proto"), - "google/cloud/automl/v1/model_evaluation.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_go_proto"), - "google/cloud/automl/v1/operations.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_go_proto"), - "google/cloud/automl/v1/prediction_service.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_go_proto"), - "google/cloud/automl/v1/service.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_go_proto"), - "google/cloud/automl/v1/translation.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_go_proto"), - "google/cloud/automl/v1beta1/annotation_payload.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/annotation_spec.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/classification.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/column_spec.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/data_items.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/data_stats.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/data_types.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/dataset.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/detection.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/geometry.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/image.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/io.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/model.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/model_evaluation.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/operations.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/prediction_service.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/ranges.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/regression.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/service.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/table_spec.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/tables.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/temporal.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/text.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/text_extraction.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/text_segment.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/text_sentiment.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/translation.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/automl/v1beta1/video.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_go_proto"), - "google/cloud/bigquery/datatransfer/v1/datasource.proto": label.New("go_googleapis", "google/cloud/bigquery/datatransfer/v1", "datatransfer_go_proto"), - "google/cloud/bigquery/datatransfer/v1/datatransfer.proto": label.New("go_googleapis", "google/cloud/bigquery/datatransfer/v1", "datatransfer_go_proto"), - "google/cloud/bigquery/datatransfer/v1/transfer.proto": label.New("go_googleapis", "google/cloud/bigquery/datatransfer/v1", "datatransfer_go_proto"), - "google/cloud/bigquery/logging/v1/audit_data.proto": label.New("go_googleapis", "google/cloud/bigquery/logging/v1", "logging_go_proto"), - "google/cloud/bigquery/storage/v1beta1/arrow.proto": label.New("go_googleapis", "google/cloud/bigquery/storage/v1beta1", "storage_go_proto"), - "google/cloud/bigquery/storage/v1beta1/avro.proto": label.New("go_googleapis", "google/cloud/bigquery/storage/v1beta1", "storage_go_proto"), - "google/cloud/bigquery/storage/v1beta1/read_options.proto": label.New("go_googleapis", "google/cloud/bigquery/storage/v1beta1", "storage_go_proto"), - "google/cloud/bigquery/storage/v1beta1/storage.proto": label.New("go_googleapis", "google/cloud/bigquery/storage/v1beta1", "storage_go_proto"), - "google/cloud/bigquery/storage/v1beta1/table_reference.proto": label.New("go_googleapis", "google/cloud/bigquery/storage/v1beta1", "storage_go_proto"), - "google/cloud/bigquery/v2/encryption_config.proto": label.New("go_googleapis", "google/cloud/bigquery/v2", "bigquery_go_proto"), - "google/cloud/bigquery/v2/model.proto": label.New("go_googleapis", "google/cloud/bigquery/v2", "bigquery_go_proto"), - "google/cloud/bigquery/v2/model_reference.proto": label.New("go_googleapis", "google/cloud/bigquery/v2", "bigquery_go_proto"), - "google/cloud/bigquery/v2/standard_sql.proto": label.New("go_googleapis", "google/cloud/bigquery/v2", "bigquery_go_proto"), - "google/cloud/billing/v1/cloud_billing.proto": label.New("go_googleapis", "google/cloud/billing/v1", "billing_go_proto"), - "google/cloud/binaryauthorization/v1beta1/resources.proto": label.New("go_googleapis", "google/cloud/binaryauthorization/v1beta1", "binaryauthorization_go_proto"), - "google/cloud/binaryauthorization/v1beta1/service.proto": label.New("go_googleapis", "google/cloud/binaryauthorization/v1beta1", "binaryauthorization_go_proto"), - "google/cloud/datacatalog/v1beta1/datacatalog.proto": label.New("go_googleapis", "google/cloud/datacatalog/v1beta1", "datacatalog_go_proto"), - "google/cloud/datacatalog/v1beta1/gcs_fileset_spec.proto": label.New("go_googleapis", "google/cloud/datacatalog/v1beta1", "datacatalog_go_proto"), - "google/cloud/datacatalog/v1beta1/schema.proto": label.New("go_googleapis", "google/cloud/datacatalog/v1beta1", "datacatalog_go_proto"), - "google/cloud/datacatalog/v1beta1/search.proto": label.New("go_googleapis", "google/cloud/datacatalog/v1beta1", "datacatalog_go_proto"), - "google/cloud/datacatalog/v1beta1/table_spec.proto": label.New("go_googleapis", "google/cloud/datacatalog/v1beta1", "datacatalog_go_proto"), - "google/cloud/datacatalog/v1beta1/tags.proto": label.New("go_googleapis", "google/cloud/datacatalog/v1beta1", "datacatalog_go_proto"), - "google/cloud/datacatalog/v1beta1/timestamps.proto": label.New("go_googleapis", "google/cloud/datacatalog/v1beta1", "datacatalog_go_proto"), - "google/cloud/datalabeling/v1beta1/annotation.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_go_proto"), - "google/cloud/datalabeling/v1beta1/annotation_spec_set.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_go_proto"), - "google/cloud/datalabeling/v1beta1/data_labeling_service.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_go_proto"), - "google/cloud/datalabeling/v1beta1/data_payloads.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_go_proto"), - "google/cloud/datalabeling/v1beta1/dataset.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_go_proto"), - "google/cloud/datalabeling/v1beta1/evaluation.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_go_proto"), - "google/cloud/datalabeling/v1beta1/evaluation_job.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_go_proto"), - "google/cloud/datalabeling/v1beta1/human_annotation_config.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_go_proto"), - "google/cloud/datalabeling/v1beta1/instruction.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_go_proto"), - "google/cloud/datalabeling/v1beta1/operations.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_go_proto"), - "google/cloud/dataproc/v1/autoscaling_policies.proto": label.New("go_googleapis", "google/cloud/dataproc/v1", "dataproc_go_proto"), - "google/cloud/dataproc/v1/clusters.proto": label.New("go_googleapis", "google/cloud/dataproc/v1", "dataproc_go_proto"), - "google/cloud/dataproc/v1/jobs.proto": label.New("go_googleapis", "google/cloud/dataproc/v1", "dataproc_go_proto"), - "google/cloud/dataproc/v1/operations.proto": label.New("go_googleapis", "google/cloud/dataproc/v1", "dataproc_go_proto"), - "google/cloud/dataproc/v1/shared.proto": label.New("go_googleapis", "google/cloud/dataproc/v1", "dataproc_go_proto"), - "google/cloud/dataproc/v1/workflow_templates.proto": label.New("go_googleapis", "google/cloud/dataproc/v1", "dataproc_go_proto"), - "google/cloud/dataproc/v1beta2/autoscaling_policies.proto": label.New("go_googleapis", "google/cloud/dataproc/v1beta2", "dataproc_go_proto"), - "google/cloud/dataproc/v1beta2/clusters.proto": label.New("go_googleapis", "google/cloud/dataproc/v1beta2", "dataproc_go_proto"), - "google/cloud/dataproc/v1beta2/jobs.proto": label.New("go_googleapis", "google/cloud/dataproc/v1beta2", "dataproc_go_proto"), - "google/cloud/dataproc/v1beta2/operations.proto": label.New("go_googleapis", "google/cloud/dataproc/v1beta2", "dataproc_go_proto"), - "google/cloud/dataproc/v1beta2/shared.proto": label.New("go_googleapis", "google/cloud/dataproc/v1beta2", "dataproc_go_proto"), - "google/cloud/dataproc/v1beta2/workflow_templates.proto": label.New("go_googleapis", "google/cloud/dataproc/v1beta2", "dataproc_go_proto"), - "google/cloud/dialogflow/v2/agent.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2/audio_config.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2/context.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2/entity_type.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2/intent.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2/session.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2/session_entity_type.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2/webhook.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2beta1/agent.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2beta1/audio_config.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2beta1/context.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2beta1/document.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2beta1/entity_type.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2beta1/gcs.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2beta1/intent.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2beta1/knowledge_base.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2beta1/session.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2beta1/session_entity_type.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2beta1/validation_result.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_go_proto"), - "google/cloud/dialogflow/v2beta1/webhook.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_go_proto"), - "google/cloud/document/v1beta1/document.proto": label.New("go_googleapis", "google/cloud/document/v1beta1", "document_go_proto"), - "google/cloud/document/v1beta1/document_understanding.proto": label.New("go_googleapis", "google/cloud/document/v1beta1", "document_go_proto"), - "google/cloud/document/v1beta1/geometry.proto": label.New("go_googleapis", "google/cloud/document/v1beta1", "document_go_proto"), - "google/cloud/functions/v1beta2/functions.proto": label.New("go_googleapis", "google/cloud/functions/v1beta2", "functions_go_proto"), - "google/cloud/functions/v1beta2/operations.proto": label.New("go_googleapis", "google/cloud/functions/v1beta2", "functions_go_proto"), - "google/cloud/iot/v1/device_manager.proto": label.New("go_googleapis", "google/cloud/iot/v1", "iot_go_proto"), - "google/cloud/iot/v1/resources.proto": label.New("go_googleapis", "google/cloud/iot/v1", "iot_go_proto"), - "google/cloud/irm/v1alpha2/incidents.proto": label.New("go_googleapis", "google/cloud/irm/v1alpha2", "irm_go_proto"), - "google/cloud/irm/v1alpha2/incidents_service.proto": label.New("go_googleapis", "google/cloud/irm/v1alpha2", "irm_go_proto"), - "google/cloud/kms/v1/resources.proto": label.New("go_googleapis", "google/cloud/kms/v1", "kms_go_proto"), - "google/cloud/kms/v1/service.proto": label.New("go_googleapis", "google/cloud/kms/v1", "kms_go_proto"), - "google/cloud/language/v1/language_service.proto": label.New("go_googleapis", "google/cloud/language/v1", "language_go_proto"), - "google/cloud/language/v1beta1/language_service.proto": label.New("go_googleapis", "google/cloud/language/v1beta1", "language_go_proto"), - "google/cloud/language/v1beta2/language_service.proto": label.New("go_googleapis", "google/cloud/language/v1beta2", "language_go_proto"), - "google/cloud/location/locations.proto": label.New("go_googleapis", "google/cloud/location", "location_go_proto"), - "google/cloud/ml/v1/job_service.proto": label.New("go_googleapis", "google/cloud/ml/v1", "ml_go_proto"), - "google/cloud/ml/v1/model_service.proto": label.New("go_googleapis", "google/cloud/ml/v1", "ml_go_proto"), - "google/cloud/ml/v1/operation_metadata.proto": label.New("go_googleapis", "google/cloud/ml/v1", "ml_go_proto"), - "google/cloud/ml/v1/prediction_service.proto": label.New("go_googleapis", "google/cloud/ml/v1", "ml_go_proto"), - "google/cloud/ml/v1/project_service.proto": label.New("go_googleapis", "google/cloud/ml/v1", "ml_go_proto"), - "google/cloud/oslogin/common/common.proto": label.New("go_googleapis", "google/cloud/oslogin/common", "common_go_proto"), - "google/cloud/oslogin/v1/oslogin.proto": label.New("go_googleapis", "google/cloud/oslogin/v1", "oslogin_go_proto"), - "google/cloud/oslogin/v1alpha/oslogin.proto": label.New("go_googleapis", "google/cloud/oslogin/v1alpha", "oslogin_go_proto"), - "google/cloud/oslogin/v1beta/oslogin.proto": label.New("go_googleapis", "google/cloud/oslogin/v1beta", "oslogin_go_proto"), - "google/cloud/phishingprotection/v1beta1/phishingprotection.proto": label.New("go_googleapis", "google/cloud/phishingprotection/v1beta1", "phishingprotection_go_proto"), - "google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto": label.New("go_googleapis", "google/cloud/recaptchaenterprise/v1beta1", "recaptchaenterprise_go_proto"), - "google/cloud/recommender/v1beta1/recommendation.proto": label.New("go_googleapis", "google/cloud/recommender/v1beta1", "recommender_go_proto"), - "google/cloud/recommender/v1beta1/recommender_service.proto": label.New("go_googleapis", "google/cloud/recommender/v1beta1", "recommender_go_proto"), - "google/cloud/redis/v1/cloud_redis.proto": label.New("go_googleapis", "google/cloud/redis/v1", "redis_go_proto"), - "google/cloud/redis/v1beta1/cloud_redis.proto": label.New("go_googleapis", "google/cloud/redis/v1beta1", "redis_go_proto"), - "google/cloud/resourcemanager/v2/folders.proto": label.New("go_googleapis", "google/cloud/resourcemanager/v2", "resourcemanager_go_proto"), - "google/cloud/runtimeconfig/v1beta1/resources.proto": label.New("go_googleapis", "google/cloud/runtimeconfig/v1beta1", "runtimeconfig_go_proto"), - "google/cloud/runtimeconfig/v1beta1/runtimeconfig.proto": label.New("go_googleapis", "google/cloud/runtimeconfig/v1beta1", "runtimeconfig_go_proto"), - "google/cloud/scheduler/v1/cloudscheduler.proto": label.New("go_googleapis", "google/cloud/scheduler/v1", "scheduler_go_proto"), - "google/cloud/scheduler/v1/job.proto": label.New("go_googleapis", "google/cloud/scheduler/v1", "scheduler_go_proto"), - "google/cloud/scheduler/v1/target.proto": label.New("go_googleapis", "google/cloud/scheduler/v1", "scheduler_go_proto"), - "google/cloud/scheduler/v1beta1/cloudscheduler.proto": label.New("go_googleapis", "google/cloud/scheduler/v1beta1", "scheduler_go_proto"), - "google/cloud/scheduler/v1beta1/job.proto": label.New("go_googleapis", "google/cloud/scheduler/v1beta1", "scheduler_go_proto"), - "google/cloud/scheduler/v1beta1/target.proto": label.New("go_googleapis", "google/cloud/scheduler/v1beta1", "scheduler_go_proto"), - "google/cloud/securitycenter/v1/asset.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1", "securitycenter_go_proto"), - "google/cloud/securitycenter/v1/finding.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1", "securitycenter_go_proto"), - "google/cloud/securitycenter/v1/organization_settings.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1", "securitycenter_go_proto"), - "google/cloud/securitycenter/v1/run_asset_discovery_response.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1", "securitycenter_go_proto"), - "google/cloud/securitycenter/v1/security_marks.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1", "securitycenter_go_proto"), - "google/cloud/securitycenter/v1/securitycenter_service.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1", "securitycenter_go_proto"), - "google/cloud/securitycenter/v1/source.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1", "securitycenter_go_proto"), - "google/cloud/securitycenter/v1beta1/asset.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1beta1", "securitycenter_go_proto"), - "google/cloud/securitycenter/v1beta1/finding.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1beta1", "securitycenter_go_proto"), - "google/cloud/securitycenter/v1beta1/organization_settings.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1beta1", "securitycenter_go_proto"), - "google/cloud/securitycenter/v1beta1/security_marks.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1beta1", "securitycenter_go_proto"), - "google/cloud/securitycenter/v1beta1/securitycenter_service.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1beta1", "securitycenter_go_proto"), - "google/cloud/securitycenter/v1beta1/source.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1beta1", "securitycenter_go_proto"), - "google/cloud/speech/v1/cloud_speech.proto": label.New("go_googleapis", "google/cloud/speech/v1", "speech_go_proto"), - "google/cloud/speech/v1p1beta1/cloud_speech.proto": label.New("go_googleapis", "google/cloud/speech/v1p1beta1", "speech_go_proto"), - "google/cloud/support/common.proto": label.New("go_googleapis", "google/cloud/support", "common_go_proto"), - "google/cloud/support/v1alpha1/cloud_support.proto": label.New("go_googleapis", "google/cloud/support/v1alpha1", "support_go_proto"), - "google/cloud/talent/v4beta1/application.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/talent/v4beta1/application_service.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/talent/v4beta1/batch.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/talent/v4beta1/common.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/talent/v4beta1/company.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/talent/v4beta1/company_service.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/talent/v4beta1/completion_service.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/talent/v4beta1/event.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/talent/v4beta1/event_service.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/talent/v4beta1/filters.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/talent/v4beta1/histogram.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/talent/v4beta1/job.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/talent/v4beta1/job_service.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/talent/v4beta1/profile.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/talent/v4beta1/profile_service.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/talent/v4beta1/tenant.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/talent/v4beta1/tenant_service.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_go_proto"), - "google/cloud/tasks/v2/cloudtasks.proto": label.New("go_googleapis", "google/cloud/tasks/v2", "tasks_go_proto"), - "google/cloud/tasks/v2/queue.proto": label.New("go_googleapis", "google/cloud/tasks/v2", "tasks_go_proto"), - "google/cloud/tasks/v2/target.proto": label.New("go_googleapis", "google/cloud/tasks/v2", "tasks_go_proto"), - "google/cloud/tasks/v2/task.proto": label.New("go_googleapis", "google/cloud/tasks/v2", "tasks_go_proto"), - "google/cloud/tasks/v2beta2/cloudtasks.proto": label.New("go_googleapis", "google/cloud/tasks/v2beta2", "tasks_go_proto"), - "google/cloud/tasks/v2beta2/queue.proto": label.New("go_googleapis", "google/cloud/tasks/v2beta2", "tasks_go_proto"), - "google/cloud/tasks/v2beta2/target.proto": label.New("go_googleapis", "google/cloud/tasks/v2beta2", "tasks_go_proto"), - "google/cloud/tasks/v2beta2/task.proto": label.New("go_googleapis", "google/cloud/tasks/v2beta2", "tasks_go_proto"), - "google/cloud/tasks/v2beta3/cloudtasks.proto": label.New("go_googleapis", "google/cloud/tasks/v2beta3", "tasks_go_proto"), - "google/cloud/tasks/v2beta3/queue.proto": label.New("go_googleapis", "google/cloud/tasks/v2beta3", "tasks_go_proto"), - "google/cloud/tasks/v2beta3/target.proto": label.New("go_googleapis", "google/cloud/tasks/v2beta3", "tasks_go_proto"), - "google/cloud/tasks/v2beta3/task.proto": label.New("go_googleapis", "google/cloud/tasks/v2beta3", "tasks_go_proto"), - "google/cloud/texttospeech/v1/cloud_tts.proto": label.New("go_googleapis", "google/cloud/texttospeech/v1", "texttospeech_go_proto"), - "google/cloud/texttospeech/v1beta1/cloud_tts.proto": label.New("go_googleapis", "google/cloud/texttospeech/v1beta1", "texttospeech_go_proto"), - "google/cloud/translate/v3/translation_service.proto": label.New("go_googleapis", "google/cloud/translate/v3", "translate_go_proto"), - "google/cloud/translate/v3beta1/translation_service.proto": label.New("go_googleapis", "google/cloud/translate/v3beta1", "translate_go_proto"), - "google/cloud/videointelligence/v1/video_intelligence.proto": label.New("go_googleapis", "google/cloud/videointelligence/v1", "videointelligence_go_proto"), - "google/cloud/videointelligence/v1beta1/video_intelligence.proto": label.New("go_googleapis", "google/cloud/videointelligence/v1beta1", "videointelligence_go_proto"), - "google/cloud/videointelligence/v1beta2/video_intelligence.proto": label.New("go_googleapis", "google/cloud/videointelligence/v1beta2", "videointelligence_go_proto"), - "google/cloud/videointelligence/v1p1beta1/video_intelligence.proto": label.New("go_googleapis", "google/cloud/videointelligence/v1p1beta1", "videointelligence_go_proto"), - "google/cloud/videointelligence/v1p2beta1/video_intelligence.proto": label.New("go_googleapis", "google/cloud/videointelligence/v1p2beta1", "videointelligence_go_proto"), - "google/cloud/videointelligence/v1p3beta1/video_intelligence.proto": label.New("go_googleapis", "google/cloud/videointelligence/v1p3beta1", "videointelligence_go_proto"), - "google/cloud/vision/v1/geometry.proto": label.New("go_googleapis", "google/cloud/vision/v1", "vision_go_proto"), - "google/cloud/vision/v1/image_annotator.proto": label.New("go_googleapis", "google/cloud/vision/v1", "vision_go_proto"), - "google/cloud/vision/v1/product_search.proto": label.New("go_googleapis", "google/cloud/vision/v1", "vision_go_proto"), - "google/cloud/vision/v1/product_search_service.proto": label.New("go_googleapis", "google/cloud/vision/v1", "vision_go_proto"), - "google/cloud/vision/v1/text_annotation.proto": label.New("go_googleapis", "google/cloud/vision/v1", "vision_go_proto"), - "google/cloud/vision/v1/web_detection.proto": label.New("go_googleapis", "google/cloud/vision/v1", "vision_go_proto"), - "google/cloud/vision/v1p1beta1/geometry.proto": label.New("go_googleapis", "google/cloud/vision/v1p1beta1", "vision_go_proto"), - "google/cloud/vision/v1p1beta1/image_annotator.proto": label.New("go_googleapis", "google/cloud/vision/v1p1beta1", "vision_go_proto"), - "google/cloud/vision/v1p1beta1/text_annotation.proto": label.New("go_googleapis", "google/cloud/vision/v1p1beta1", "vision_go_proto"), - "google/cloud/vision/v1p1beta1/web_detection.proto": label.New("go_googleapis", "google/cloud/vision/v1p1beta1", "vision_go_proto"), - "google/cloud/vision/v1p2beta1/geometry.proto": label.New("go_googleapis", "google/cloud/vision/v1p2beta1", "vision_go_proto"), - "google/cloud/vision/v1p2beta1/image_annotator.proto": label.New("go_googleapis", "google/cloud/vision/v1p2beta1", "vision_go_proto"), - "google/cloud/vision/v1p2beta1/text_annotation.proto": label.New("go_googleapis", "google/cloud/vision/v1p2beta1", "vision_go_proto"), - "google/cloud/vision/v1p2beta1/web_detection.proto": label.New("go_googleapis", "google/cloud/vision/v1p2beta1", "vision_go_proto"), - "google/cloud/vision/v1p3beta1/geometry.proto": label.New("go_googleapis", "google/cloud/vision/v1p3beta1", "vision_go_proto"), - "google/cloud/vision/v1p3beta1/image_annotator.proto": label.New("go_googleapis", "google/cloud/vision/v1p3beta1", "vision_go_proto"), - "google/cloud/vision/v1p3beta1/product_search.proto": label.New("go_googleapis", "google/cloud/vision/v1p3beta1", "vision_go_proto"), - "google/cloud/vision/v1p3beta1/product_search_service.proto": label.New("go_googleapis", "google/cloud/vision/v1p3beta1", "vision_go_proto"), - "google/cloud/vision/v1p3beta1/text_annotation.proto": label.New("go_googleapis", "google/cloud/vision/v1p3beta1", "vision_go_proto"), - "google/cloud/vision/v1p3beta1/web_detection.proto": label.New("go_googleapis", "google/cloud/vision/v1p3beta1", "vision_go_proto"), - "google/cloud/vision/v1p4beta1/geometry.proto": label.New("go_googleapis", "google/cloud/vision/v1p4beta1", "vision_go_proto"), - "google/cloud/vision/v1p4beta1/image_annotator.proto": label.New("go_googleapis", "google/cloud/vision/v1p4beta1", "vision_go_proto"), - "google/cloud/vision/v1p4beta1/product_search.proto": label.New("go_googleapis", "google/cloud/vision/v1p4beta1", "vision_go_proto"), - "google/cloud/vision/v1p4beta1/product_search_service.proto": label.New("go_googleapis", "google/cloud/vision/v1p4beta1", "vision_go_proto"), - "google/cloud/vision/v1p4beta1/text_annotation.proto": label.New("go_googleapis", "google/cloud/vision/v1p4beta1", "vision_go_proto"), - "google/cloud/vision/v1p4beta1/web_detection.proto": label.New("go_googleapis", "google/cloud/vision/v1p4beta1", "vision_go_proto"), - "google/cloud/webrisk/v1beta1/webrisk.proto": label.New("go_googleapis", "google/cloud/webrisk/v1beta1", "webrisk_go_proto"), - "google/cloud/websecurityscanner/v1alpha/crawled_url.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1alpha", "websecurityscanner_go_proto"), - "google/cloud/websecurityscanner/v1alpha/finding.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1alpha", "websecurityscanner_go_proto"), - "google/cloud/websecurityscanner/v1alpha/finding_addon.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1alpha", "websecurityscanner_go_proto"), - "google/cloud/websecurityscanner/v1alpha/finding_type_stats.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1alpha", "websecurityscanner_go_proto"), - "google/cloud/websecurityscanner/v1alpha/scan_config.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1alpha", "websecurityscanner_go_proto"), - "google/cloud/websecurityscanner/v1alpha/scan_run.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1alpha", "websecurityscanner_go_proto"), - "google/cloud/websecurityscanner/v1alpha/web_security_scanner.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1alpha", "websecurityscanner_go_proto"), - "google/cloud/websecurityscanner/v1beta/crawled_url.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_go_proto"), - "google/cloud/websecurityscanner/v1beta/finding.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_go_proto"), - "google/cloud/websecurityscanner/v1beta/finding_addon.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_go_proto"), - "google/cloud/websecurityscanner/v1beta/finding_type_stats.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_go_proto"), - "google/cloud/websecurityscanner/v1beta/scan_config.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_go_proto"), - "google/cloud/websecurityscanner/v1beta/scan_config_error.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_go_proto"), - "google/cloud/websecurityscanner/v1beta/scan_run.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_go_proto"), - "google/cloud/websecurityscanner/v1beta/scan_run_error_trace.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_go_proto"), - "google/cloud/websecurityscanner/v1beta/scan_run_warning_trace.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_go_proto"), - "google/cloud/websecurityscanner/v1beta/web_security_scanner.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_go_proto"), - "google/container/v1/cluster_service.proto": label.New("go_googleapis", "google/container/v1", "container_go_proto"), - "google/container/v1alpha1/cluster_service.proto": label.New("go_googleapis", "google/container/v1alpha1", "container_go_proto"), - "google/container/v1beta1/cluster_service.proto": label.New("go_googleapis", "google/container/v1beta1", "container_go_proto"), - "google/datastore/admin/v1/datastore_admin.proto": label.New("go_googleapis", "google/datastore/admin/v1", "admin_go_proto"), - "google/datastore/admin/v1/index.proto": label.New("go_googleapis", "google/datastore/admin/v1", "admin_go_proto"), - "google/datastore/admin/v1beta1/datastore_admin.proto": label.New("go_googleapis", "google/datastore/admin/v1beta1", "admin_go_proto"), - "google/datastore/v1/datastore.proto": label.New("go_googleapis", "google/datastore/v1", "datastore_go_proto"), - "google/datastore/v1/entity.proto": label.New("go_googleapis", "google/datastore/v1", "datastore_go_proto"), - "google/datastore/v1/query.proto": label.New("go_googleapis", "google/datastore/v1", "datastore_go_proto"), - "google/datastore/v1beta3/datastore.proto": label.New("go_googleapis", "google/datastore/v1beta3", "datastore_go_proto"), - "google/datastore/v1beta3/entity.proto": label.New("go_googleapis", "google/datastore/v1beta3", "datastore_go_proto"), - "google/datastore/v1beta3/query.proto": label.New("go_googleapis", "google/datastore/v1beta3", "datastore_go_proto"), - "google/devtools/build/v1/build_events.proto": label.New("go_googleapis", "google/devtools/build/v1", "build_go_proto"), - "google/devtools/build/v1/build_status.proto": label.New("go_googleapis", "google/devtools/build/v1", "build_go_proto"), - "google/devtools/build/v1/publish_build_event.proto": label.New("go_googleapis", "google/devtools/build/v1", "build_go_proto"), - "google/devtools/cloudbuild/v1/cloudbuild.proto": label.New("go_googleapis", "google/devtools/cloudbuild/v1", "cloudbuild_go_proto"), - "google/devtools/clouddebugger/v2/controller.proto": label.New("go_googleapis", "google/devtools/clouddebugger/v2", "clouddebugger_go_proto"), - "google/devtools/clouddebugger/v2/data.proto": label.New("go_googleapis", "google/devtools/clouddebugger/v2", "clouddebugger_go_proto"), - "google/devtools/clouddebugger/v2/debugger.proto": label.New("go_googleapis", "google/devtools/clouddebugger/v2", "clouddebugger_go_proto"), - "google/devtools/clouderrorreporting/v1beta1/common.proto": label.New("go_googleapis", "google/devtools/clouderrorreporting/v1beta1", "clouderrorreporting_go_proto"), - "google/devtools/clouderrorreporting/v1beta1/error_group_service.proto": label.New("go_googleapis", "google/devtools/clouderrorreporting/v1beta1", "clouderrorreporting_go_proto"), - "google/devtools/clouderrorreporting/v1beta1/error_stats_service.proto": label.New("go_googleapis", "google/devtools/clouderrorreporting/v1beta1", "clouderrorreporting_go_proto"), - "google/devtools/clouderrorreporting/v1beta1/report_errors_service.proto": label.New("go_googleapis", "google/devtools/clouderrorreporting/v1beta1", "clouderrorreporting_go_proto"), - "google/devtools/cloudprofiler/v2/profiler.proto": label.New("go_googleapis", "google/devtools/cloudprofiler/v2", "cloudprofiler_go_proto"), - "google/devtools/cloudtrace/v1/trace.proto": label.New("go_googleapis", "google/devtools/cloudtrace/v1", "cloudtrace_go_proto"), - "google/devtools/cloudtrace/v2/trace.proto": label.New("go_googleapis", "google/devtools/cloudtrace/v2", "cloudtrace_go_proto"), - "google/devtools/cloudtrace/v2/tracing.proto": label.New("go_googleapis", "google/devtools/cloudtrace/v2", "cloudtrace_go_proto"), - "google/devtools/containeranalysis/v1/containeranalysis.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1", "containeranalysis_go_proto"), - "google/devtools/containeranalysis/v1alpha1/bill_of_materials.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1alpha1", "containeranalysis_go_proto"), - "google/devtools/containeranalysis/v1alpha1/containeranalysis.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1alpha1", "containeranalysis_go_proto"), - "google/devtools/containeranalysis/v1alpha1/image_basis.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1alpha1", "containeranalysis_go_proto"), - "google/devtools/containeranalysis/v1alpha1/package_vulnerability.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1alpha1", "containeranalysis_go_proto"), - "google/devtools/containeranalysis/v1alpha1/provenance.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1alpha1", "containeranalysis_go_proto"), - "google/devtools/containeranalysis/v1alpha1/source_context.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1alpha1", "containeranalysis_go_proto"), - "google/devtools/containeranalysis/v1beta1/attestation/attestation.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/attestation", "attestation_go_proto"), - "google/devtools/containeranalysis/v1beta1/build/build.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/build", "build_go_proto"), - "google/devtools/containeranalysis/v1beta1/common/common.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/common", "common_go_proto"), - "google/devtools/containeranalysis/v1beta1/containeranalysis.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1", "containeranalysis_go_proto"), - "google/devtools/containeranalysis/v1beta1/deployment/deployment.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/deployment", "deployment_go_proto"), - "google/devtools/containeranalysis/v1beta1/discovery/discovery.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/discovery", "discovery_go_proto"), - "google/devtools/containeranalysis/v1beta1/grafeas/grafeas.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/grafeas", "grafeas_go_proto"), - "google/devtools/containeranalysis/v1beta1/image/image.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/image", "image_go_proto"), - "google/devtools/containeranalysis/v1beta1/package/package.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/package", "package_go_proto"), - "google/devtools/containeranalysis/v1beta1/provenance/provenance.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/provenance", "provenance_go_proto"), - "google/devtools/containeranalysis/v1beta1/source/source.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/source", "source_go_proto"), - "google/devtools/containeranalysis/v1beta1/vulnerability/vulnerability.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/vulnerability", "vulnerability_go_proto"), - "google/devtools/remoteexecution/v1test/remote_execution.proto": label.New("go_googleapis", "google/devtools/remoteexecution/v1test", "remoteexecution_go_proto"), - "google/devtools/remoteworkers/v1test2/bots.proto": label.New("go_googleapis", "google/devtools/remoteworkers/v1test2", "remoteworkers_go_proto"), - "google/devtools/remoteworkers/v1test2/command.proto": label.New("go_googleapis", "google/devtools/remoteworkers/v1test2", "remoteworkers_go_proto"), - "google/devtools/remoteworkers/v1test2/tasks.proto": label.New("go_googleapis", "google/devtools/remoteworkers/v1test2", "remoteworkers_go_proto"), - "google/devtools/remoteworkers/v1test2/worker.proto": label.New("go_googleapis", "google/devtools/remoteworkers/v1test2", "remoteworkers_go_proto"), - "google/devtools/resultstore/v2/action.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/resultstore/v2/common.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/resultstore/v2/configuration.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/resultstore/v2/configured_target.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/resultstore/v2/coverage.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/resultstore/v2/coverage_summary.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/resultstore/v2/download_metadata.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/resultstore/v2/file.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/resultstore/v2/file_processing_error.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/resultstore/v2/file_set.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/resultstore/v2/invocation.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/resultstore/v2/resultstore_download.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/resultstore/v2/resultstore_file_download.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/resultstore/v2/resultstore_upload.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/resultstore/v2/target.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/resultstore/v2/test_suite.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/resultstore/v2/upload_metadata.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_go_proto"), - "google/devtools/source/v1/source_context.proto": label.New("go_googleapis", "google/devtools/source/v1", "source_go_proto"), - "google/devtools/sourcerepo/v1/sourcerepo.proto": label.New("go_googleapis", "google/devtools/sourcerepo/v1", "sourcerepo_go_proto"), - "google/example/library/v1/library.proto": label.New("go_googleapis", "google/example/library/v1", "library_go_proto"), - "google/firebase/fcm/connection/v1alpha1/connection_api.proto": label.New("go_googleapis", "google/firebase/fcm/connection/v1alpha1", "connection_go_proto"), - "google/firestore/admin/v1/field.proto": label.New("go_googleapis", "google/firestore/admin/v1", "admin_go_proto"), - "google/firestore/admin/v1/firestore_admin.proto": label.New("go_googleapis", "google/firestore/admin/v1", "admin_go_proto"), - "google/firestore/admin/v1/index.proto": label.New("go_googleapis", "google/firestore/admin/v1", "admin_go_proto"), - "google/firestore/admin/v1/location.proto": label.New("go_googleapis", "google/firestore/admin/v1", "admin_go_proto"), - "google/firestore/admin/v1/operation.proto": label.New("go_googleapis", "google/firestore/admin/v1", "admin_go_proto"), - "google/firestore/admin/v1beta1/firestore_admin.proto": label.New("go_googleapis", "google/firestore/admin/v1beta1", "admin_go_proto"), - "google/firestore/admin/v1beta1/index.proto": label.New("go_googleapis", "google/firestore/admin/v1beta1", "admin_go_proto"), - "google/firestore/admin/v1beta1/location.proto": label.New("go_googleapis", "google/firestore/admin/v1beta1", "admin_go_proto"), - "google/firestore/admin/v1beta2/field.proto": label.New("go_googleapis", "google/firestore/admin/v1beta2", "admin_go_proto"), - "google/firestore/admin/v1beta2/firestore_admin.proto": label.New("go_googleapis", "google/firestore/admin/v1beta2", "admin_go_proto"), - "google/firestore/admin/v1beta2/index.proto": label.New("go_googleapis", "google/firestore/admin/v1beta2", "admin_go_proto"), - "google/firestore/admin/v1beta2/operation.proto": label.New("go_googleapis", "google/firestore/admin/v1beta2", "admin_go_proto"), - "google/firestore/v1/common.proto": label.New("go_googleapis", "google/firestore/v1", "firestore_go_proto"), - "google/firestore/v1/document.proto": label.New("go_googleapis", "google/firestore/v1", "firestore_go_proto"), - "google/firestore/v1/firestore.proto": label.New("go_googleapis", "google/firestore/v1", "firestore_go_proto"), - "google/firestore/v1/query.proto": label.New("go_googleapis", "google/firestore/v1", "firestore_go_proto"), - "google/firestore/v1/write.proto": label.New("go_googleapis", "google/firestore/v1", "firestore_go_proto"), - "google/firestore/v1beta1/common.proto": label.New("go_googleapis", "google/firestore/v1beta1", "firestore_go_proto"), - "google/firestore/v1beta1/document.proto": label.New("go_googleapis", "google/firestore/v1beta1", "firestore_go_proto"), - "google/firestore/v1beta1/firestore.proto": label.New("go_googleapis", "google/firestore/v1beta1", "firestore_go_proto"), - "google/firestore/v1beta1/query.proto": label.New("go_googleapis", "google/firestore/v1beta1", "firestore_go_proto"), - "google/firestore/v1beta1/write.proto": label.New("go_googleapis", "google/firestore/v1beta1", "firestore_go_proto"), - "google/genomics/v1/annotations.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_go_proto"), - "google/genomics/v1/cigar.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_go_proto"), - "google/genomics/v1/datasets.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_go_proto"), - "google/genomics/v1/operations.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_go_proto"), - "google/genomics/v1/position.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_go_proto"), - "google/genomics/v1/range.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_go_proto"), - "google/genomics/v1/readalignment.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_go_proto"), - "google/genomics/v1/readgroup.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_go_proto"), - "google/genomics/v1/readgroupset.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_go_proto"), - "google/genomics/v1/reads.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_go_proto"), - "google/genomics/v1/references.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_go_proto"), - "google/genomics/v1/variants.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_go_proto"), - "google/genomics/v1alpha2/pipelines.proto": label.New("go_googleapis", "google/genomics/v1alpha2", "genomics_go_proto"), - "google/geo/type/viewport.proto": label.New("go_googleapis", "google/geo/type", "viewport_go_proto"), - "google/home/graph/v1/device.proto": label.New("go_googleapis", "google/home/graph/v1", "graph_go_proto"), - "google/home/graph/v1/homegraph.proto": label.New("go_googleapis", "google/home/graph/v1", "graph_go_proto"), - "google/iam/admin/v1/iam.proto": label.New("go_googleapis", "google/iam/admin/v1", "admin_go_proto"), - "google/iam/credentials/v1/common.proto": label.New("go_googleapis", "google/iam/credentials/v1", "credentials_go_proto"), - "google/iam/credentials/v1/iamcredentials.proto": label.New("go_googleapis", "google/iam/credentials/v1", "credentials_go_proto"), - "google/iam/v1/iam_policy.proto": label.New("go_googleapis", "google/iam/v1", "iam_go_proto"), - "google/iam/v1/logging/audit_data.proto": label.New("go_googleapis", "google/iam/v1/logging", "logging_go_proto"), - "google/iam/v1/options.proto": label.New("go_googleapis", "google/iam/v1", "iam_go_proto"), - "google/iam/v1/policy.proto": label.New("go_googleapis", "google/iam/v1", "iam_go_proto"), - "google/logging/type/http_request.proto": label.New("go_googleapis", "google/logging/type", "ltype_go_proto"), - "google/logging/type/log_severity.proto": label.New("go_googleapis", "google/logging/type", "ltype_go_proto"), - "google/logging/v2/log_entry.proto": label.New("go_googleapis", "google/logging/v2", "logging_go_proto"), - "google/logging/v2/logging.proto": label.New("go_googleapis", "google/logging/v2", "logging_go_proto"), - "google/logging/v2/logging_config.proto": label.New("go_googleapis", "google/logging/v2", "logging_go_proto"), - "google/logging/v2/logging_metrics.proto": label.New("go_googleapis", "google/logging/v2", "logging_go_proto"), - "google/longrunning/operations.proto": label.New("go_googleapis", "google/longrunning", "longrunning_go_proto"), - "google/monitoring/v3/alert.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_go_proto"), - "google/monitoring/v3/alert_service.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_go_proto"), - "google/monitoring/v3/common.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_go_proto"), - "google/monitoring/v3/dropped_labels.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_go_proto"), - "google/monitoring/v3/group.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_go_proto"), - "google/monitoring/v3/group_service.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_go_proto"), - "google/monitoring/v3/metric.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_go_proto"), - "google/monitoring/v3/metric_service.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_go_proto"), - "google/monitoring/v3/mutation_record.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_go_proto"), - "google/monitoring/v3/notification.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_go_proto"), - "google/monitoring/v3/notification_service.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_go_proto"), - "google/monitoring/v3/span_context.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_go_proto"), - "google/monitoring/v3/uptime.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_go_proto"), - "google/monitoring/v3/uptime_service.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_go_proto"), - "google/privacy/dlp/v2/dlp.proto": label.New("go_googleapis", "google/privacy/dlp/v2", "dlp_go_proto"), - "google/privacy/dlp/v2/storage.proto": label.New("go_googleapis", "google/privacy/dlp/v2", "dlp_go_proto"), - "google/pubsub/v1/pubsub.proto": label.New("go_googleapis", "google/pubsub/v1", "pubsub_go_proto"), - "google/pubsub/v1beta2/pubsub.proto": label.New("go_googleapis", "google/pubsub/v1beta2", "pubsub_go_proto"), - "google/rpc/code.proto": label.New("go_googleapis", "google/rpc", "code_go_proto"), - "google/rpc/error_details.proto": label.New("go_googleapis", "google/rpc", "errdetails_go_proto"), - "google/rpc/status.proto": label.New("go_googleapis", "google/rpc", "status_go_proto"), - "google/spanner/admin/database/v1/spanner_database_admin.proto": label.New("go_googleapis", "google/spanner/admin/database/v1", "database_go_proto"), - "google/spanner/admin/instance/v1/spanner_instance_admin.proto": label.New("go_googleapis", "google/spanner/admin/instance/v1", "instance_go_proto"), - "google/spanner/v1/keys.proto": label.New("go_googleapis", "google/spanner/v1", "spanner_go_proto"), - "google/spanner/v1/mutation.proto": label.New("go_googleapis", "google/spanner/v1", "spanner_go_proto"), - "google/spanner/v1/query_plan.proto": label.New("go_googleapis", "google/spanner/v1", "spanner_go_proto"), - "google/spanner/v1/result_set.proto": label.New("go_googleapis", "google/spanner/v1", "spanner_go_proto"), - "google/spanner/v1/spanner.proto": label.New("go_googleapis", "google/spanner/v1", "spanner_go_proto"), - "google/spanner/v1/transaction.proto": label.New("go_googleapis", "google/spanner/v1", "spanner_go_proto"), - "google/spanner/v1/type.proto": label.New("go_googleapis", "google/spanner/v1", "spanner_go_proto"), - "google/storagetransfer/v1/transfer.proto": label.New("go_googleapis", "google/storagetransfer/v1", "storagetransfer_go_proto"), - "google/storagetransfer/v1/transfer_types.proto": label.New("go_googleapis", "google/storagetransfer/v1", "storagetransfer_go_proto"), - "google/streetview/publish/v1/resources.proto": label.New("go_googleapis", "google/streetview/publish/v1", "publish_go_proto"), - "google/streetview/publish/v1/rpcmessages.proto": label.New("go_googleapis", "google/streetview/publish/v1", "publish_go_proto"), - "google/streetview/publish/v1/streetview_publish.proto": label.New("go_googleapis", "google/streetview/publish/v1", "publish_go_proto"), - "google/type/calendar_period.proto": label.New("go_googleapis", "google/type", "calendarperiod_go_proto"), - "google/type/color.proto": label.New("go_googleapis", "google/type", "color_go_proto"), - "google/type/date.proto": label.New("go_googleapis", "google/type", "date_go_proto"), - "google/type/dayofweek.proto": label.New("go_googleapis", "google/type", "dayofweek_go_proto"), - "google/type/expr.proto": label.New("go_googleapis", "google/type", "expr_go_proto"), - "google/type/fraction.proto": label.New("go_googleapis", "google/type", "fraction_go_proto"), - "google/type/latlng.proto": label.New("go_googleapis", "google/type", "latlng_go_proto"), - "google/type/money.proto": label.New("go_googleapis", "google/type", "money_go_proto"), - "google/type/postal_address.proto": label.New("go_googleapis", "google/type", "postaladdress_go_proto"), - "google/type/quaternion.proto": label.New("go_googleapis", "google/type", "quaternion_go_proto"), - "google/type/timeofday.proto": label.New("go_googleapis", "google/type", "timeofday_go_proto"), - "google/watcher/v1/watch.proto": label.New("go_googleapis", "google/watcher/v1", "watcher_go_proto"), - "grafeas/v1/attestation.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_go_proto"), - "grafeas/v1/build.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_go_proto"), - "grafeas/v1/common.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_go_proto"), - "grafeas/v1/cvss.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_go_proto"), - "grafeas/v1/deployment.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_go_proto"), - "grafeas/v1/discovery.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_go_proto"), - "grafeas/v1/grafeas.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_go_proto"), - "grafeas/v1/image.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_go_proto"), - "grafeas/v1/package.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_go_proto"), - "grafeas/v1/provenance.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_go_proto"), - "grafeas/v1/vulnerability.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_go_proto"), -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/lang.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/lang.go deleted file mode 100644 index 27d50cae294..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/lang.go +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 golang provides support for Go and Go proto rules. It generates -// go_library, go_binary, go_test, and go_proto_library rules. -// -// Configuration -// -// Go rules support the flags -build_tags, -go_prefix, and -external. -// They also support the directives # gazelle:build_tags, # gazelle:prefix, -// and # gazelle:importmap_prefix. See -// https://github.com/bazelbuild/bazel-gazelle/blob/master/README.rst#directives -// for information on these. -// -// Rule generation -// -// Currently, Gazelle generates rules for one Go package per directory. In -// general, we aim to support Go code which is compatible with "go build". If -// there are no buildable packages, Gazelle will delete existing rules with -// default names. If there are multiple packages, Gazelle will pick one that -// matches the directory name or will print an error if no such package is -// found. -// -// Gazelle names library and test rules somewhat oddly: go_default_library, and -// go_default_test. This is for historic reasons: before the importpath -// attribute was mandatory, import paths were inferred from label names. Even if -// we never support multiple packages in the future (we should), we should -// migrate away from this because it's surprising. Libraries should generally -// be named after their directories. -// -// Dependency resolution -// -// Go libraries are indexed by their importpath attribute. Gazelle attempts to -// resolve libraries by import path using the index, filtered using the -// vendoring algorithm. If an import doesn't match any known library, Gazelle -// guesses a name for it, locally (if the import path is under the current -// prefix), or in an external repository or vendor directory (depending -// on external mode). -// -// Gazelle has special cases for import paths associated with proto Well -// Known Types and Google APIs. rules_go declares canonical rules for these. -package golang - -import "github.com/bazelbuild/bazel-gazelle/language" - -const goName = "go" - -type goLang struct { - // goPkgDirs is a set of relative paths to directories containing buildable - // Go code, including in subdirectories. - goPkgRels map[string]bool -} - -func (_ *goLang) Name() string { return goName } - -func NewLanguage() language.Language { - return &goLang{goPkgRels: make(map[string]bool)} -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/modules.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/modules.go deleted file mode 100644 index c195b0eecd8..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/modules.go +++ /dev/null @@ -1,214 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 golang - -import ( - "bytes" - "encoding/json" - "go/build" - "io" - "io/ioutil" - "log" - "os" - "os/exec" - "path/filepath" - "runtime" - "sort" - "strings" - - "github.com/bazelbuild/bazel-gazelle/label" - "github.com/bazelbuild/bazel-gazelle/language" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -func importReposFromModules(args language.ImportReposArgs) language.ImportReposResult { - // Copy go.mod to temporary directory. We may run commands that modify it, - // and we want to leave the original alone. - tempDir, err := copyGoModToTemp(args.Path) - if err != nil { - return language.ImportReposResult{Error: err} - } - defer os.RemoveAll(tempDir) - - // List all modules except for the main module, including implicit indirect - // dependencies. - type module struct { - Path, Version, Sum string - Main bool - Replace *struct { - Path, Version string - } - } - // path@version can be used as a unique identifier for looking up sums - pathToModule := map[string]*module{} - data, err := goListModules(tempDir) - if err != nil { - return language.ImportReposResult{Error: err} - } - dec := json.NewDecoder(bytes.NewReader(data)) - for dec.More() { - mod := new(module) - if err := dec.Decode(mod); err != nil { - return language.ImportReposResult{Error: err} - } - if mod.Main { - continue - } - if mod.Replace != nil { - if filepath.IsAbs(mod.Replace.Path) || build.IsLocalImport(mod.Replace.Path) { - log.Printf("go_repository does not support file path replacements for %s -> %s", mod.Path, - mod.Replace.Path) - continue - } - pathToModule[mod.Replace.Path+"@"+mod.Replace.Version] = mod - } else { - pathToModule[mod.Path+"@"+mod.Version] = mod - } - } - // Load sums from go.sum. Ideally, they're all there. - goSumPath := filepath.Join(filepath.Dir(args.Path), "go.sum") - data, _ = ioutil.ReadFile(goSumPath) - lines := bytes.Split(data, []byte("\n")) - for _, line := range lines { - line = bytes.TrimSpace(line) - fields := bytes.Fields(line) - if len(fields) != 3 { - continue - } - path, version, sum := string(fields[0]), string(fields[1]), string(fields[2]) - if strings.HasSuffix(version, "/go.mod") { - continue - } - if mod, ok := pathToModule[path+"@"+version]; ok { - mod.Sum = sum - } - } - // If sums are missing, run go mod download to get them. - var missingSumArgs []string - for pathVer, mod := range pathToModule { - if mod.Sum == "" { - missingSumArgs = append(missingSumArgs, pathVer) - } - } - if len(missingSumArgs) > 0 { - data, err := goModDownload(tempDir, missingSumArgs) - if err != nil { - return language.ImportReposResult{Error: err} - } - dec = json.NewDecoder(bytes.NewReader(data)) - for dec.More() { - var dl module - if err := dec.Decode(&dl); err != nil { - return language.ImportReposResult{Error: err} - } - if mod, ok := pathToModule[dl.Path+"@"+dl.Version]; ok { - mod.Sum = dl.Sum - } - } - } - - // Translate to repository rules. - gen := make([]*rule.Rule, 0, len(pathToModule)) - for pathVer, mod := range pathToModule { - if mod.Sum == "" { - log.Printf("could not determine sum for module %s", pathVer) - continue - } - r := rule.NewRule("go_repository", label.ImportPathToBazelRepoName(mod.Path)) - r.SetAttr("importpath", mod.Path) - r.SetAttr("sum", mod.Sum) - if mod.Replace == nil { - r.SetAttr("version", mod.Version) - } else { - r.SetAttr("replace", mod.Replace.Path) - r.SetAttr("version", mod.Replace.Version) - } - gen = append(gen, r) - } - sort.Slice(gen, func(i, j int) bool { - return gen[i].Name() < gen[j].Name() - }) - return language.ImportReposResult{Gen: gen} -} - -// goListModules invokes "go list" in a directory containing a go.mod file. -var goListModules = func(dir string) ([]byte, error) { - goTool := findGoTool() - cmd := exec.Command(goTool, "list", "-m", "-json", "all") - cmd.Stderr = os.Stderr - cmd.Dir = dir - return cmd.Output() -} - -// goModDownload invokes "go mod download" in a directory containing a -// go.mod file. -var goModDownload = func(dir string, args []string) ([]byte, error) { - goTool := findGoTool() - cmd := exec.Command(goTool, "mod", "download", "-json") - cmd.Args = append(cmd.Args, args...) - cmd.Stderr = os.Stderr - cmd.Dir = dir - return cmd.Output() -} - -// copyGoModToTemp copies to given go.mod file to a temporary directory. -// go list tends to mutate go.mod files, but gazelle shouldn't do that. -func copyGoModToTemp(filename string) (tempDir string, err error) { - goModOrig, err := os.Open(filename) - if err != nil { - return "", err - } - defer goModOrig.Close() - - tempDir, err = ioutil.TempDir("", "gazelle-temp-gomod") - if err != nil { - return "", err - } - - goModCopy, err := os.Create(filepath.Join(tempDir, "go.mod")) - if err != nil { - os.Remove(tempDir) - return "", err - } - defer func() { - if cerr := goModCopy.Close(); err == nil && cerr != nil { - err = cerr - } - }() - - _, err = io.Copy(goModCopy, goModOrig) - if err != nil { - os.RemoveAll(tempDir) - return "", err - } - return tempDir, err -} - -// findGoTool attempts to locate the go executable. If GOROOT is set, we'll -// prefer the one in there; otherwise, we'll rely on PATH. If the wrapper -// script generated by the gazelle rule is invoked by Bazel, it will set -// GOROOT to the configured SDK. We don't want to rely on the host SDK in -// that situation. -func findGoTool() string { - path := "go" // rely on PATH by default - if goroot, ok := os.LookupEnv("GOROOT"); ok { - path = filepath.Join(goroot, "bin", "go") - } - if runtime.GOOS == "windows" { - path += ".exe" - } - return path -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/package.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/package.go deleted file mode 100644 index 4de0c2fdb63..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/package.go +++ /dev/null @@ -1,507 +0,0 @@ -/* Copyright 2017 The Bazel Authors. 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 golang - -import ( - "fmt" - "log" - "path" - "regexp" - "sort" - "strings" - - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/language/proto" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -// goPackage contains metadata for a set of .go and .proto files that can be -// used to generate Go rules. -type goPackage struct { - name, dir, rel string - library, binary, test goTarget - proto protoTarget - hasTestdata bool - importPath string -} - -// goTarget contains information used to generate an individual Go rule -// (library, binary, or test). -type goTarget struct { - sources, imports, copts, clinkopts platformStringsBuilder - cgo bool -} - -// protoTarget contains information used to generate a go_proto_library rule. -type protoTarget struct { - name string - sources platformStringsBuilder - imports platformStringsBuilder - hasServices bool -} - -// platformStringsBuilder is used to construct rule.PlatformStrings. Bazel -// has some requirements for deps list (a dependency cannot appear in more -// than one select expression; dependencies cannot be duplicated), so we need -// to build these carefully. -type platformStringsBuilder struct { - strs map[string]platformStringInfo -} - -// platformStringInfo contains information about a single string (source, -// import, or option). -type platformStringInfo struct { - set platformStringSet - oss map[string]bool - archs map[string]bool - platforms map[rule.Platform]bool -} - -type platformStringSet int - -const ( - genericSet platformStringSet = iota - osSet - archSet - platformSet -) - -// addFile adds the file described by "info" to a target in the package "p" if -// the file is buildable. -// -// "cgo" tells whether any ".go" file in the package contains cgo code. This -// affects whether C files are added to targets. -// -// An error is returned if a file is buildable but invalid (for example, a -// test .go file containing cgo code). Files that are not buildable will not -// be added to any target (for example, .txt files). -func (pkg *goPackage) addFile(c *config.Config, info fileInfo, cgo bool) error { - switch { - case info.ext == unknownExt || !cgo && (info.ext == cExt || info.ext == csExt): - return nil - case info.ext == protoExt: - if pcMode := getProtoMode(c); pcMode == proto.LegacyMode { - // Only add files in legacy mode. This is used to generate a filegroup - // that contains all protos. In order modes, we get the .proto files - // from information emitted by the proto language extension. - pkg.proto.addFile(c, info) - } - case info.isTest: - if info.isCgo { - return fmt.Errorf("%s: use of cgo in test not supported", info.path) - } - pkg.test.addFile(c, info) - default: - pkg.library.addFile(c, info) - } - - return nil -} - -// isCommand returns true if the package name is "main". -func (pkg *goPackage) isCommand() bool { - return pkg.name == "main" -} - -// isBuildable returns true if anything in the package is buildable. -// This is true if the package has Go code that satisfies build constraints -// on any platform or has proto files not in legacy mode. -func (pkg *goPackage) isBuildable(c *config.Config) bool { - return pkg.firstGoFile() != "" || !pkg.proto.sources.isEmpty() -} - -// firstGoFile returns the name of a .go file if the package contains at least -// one .go file, or "" otherwise. -func (pkg *goPackage) firstGoFile() string { - goSrcs := []platformStringsBuilder{ - pkg.library.sources, - pkg.binary.sources, - pkg.test.sources, - } - for _, sb := range goSrcs { - if sb.strs != nil { - for s := range sb.strs { - if strings.HasSuffix(s, ".go") { - return s - } - } - } - } - return "" -} - -func (pkg *goPackage) haveCgo() bool { - return pkg.library.cgo || pkg.binary.cgo || pkg.test.cgo -} - -func (pkg *goPackage) inferImportPath(c *config.Config) error { - if pkg.importPath != "" { - log.Panic("importPath already set") - } - gc := getGoConfig(c) - if !gc.prefixSet { - return fmt.Errorf("%s: go prefix is not set, so importpath can't be determined for rules. Set a prefix with a '# gazelle:prefix' comment or with -go_prefix on the command line", pkg.dir) - } - pkg.importPath = inferImportPath(gc, pkg.rel) - - if pkg.rel == gc.prefixRel { - pkg.importPath = gc.prefix - } else { - fromPrefixRel := strings.TrimPrefix(pkg.rel, gc.prefixRel+"/") - pkg.importPath = path.Join(gc.prefix, fromPrefixRel) - } - return nil -} - -func inferImportPath(gc *goConfig, rel string) string { - if rel == gc.prefixRel { - return gc.prefix - } else { - fromPrefixRel := strings.TrimPrefix(rel, gc.prefixRel+"/") - return path.Join(gc.prefix, fromPrefixRel) - } -} - -func goProtoPackageName(pkg proto.Package) string { - if value, ok := pkg.Options["go_package"]; ok { - if strings.LastIndexByte(value, '/') == -1 { - return value - } else { - if i := strings.LastIndexByte(value, ';'); i != -1 { - return value[i+1:] - } else { - return path.Base(value) - } - } - } - return strings.Replace(pkg.Name, ".", "_", -1) -} - -func goProtoImportPath(gc *goConfig, pkg proto.Package, rel string) string { - if value, ok := pkg.Options["go_package"]; ok { - if strings.LastIndexByte(value, '/') == -1 { - return inferImportPath(gc, rel) - } else if i := strings.LastIndexByte(value, ';'); i != -1 { - return value[:i] - } else { - return value - } - } - return inferImportPath(gc, rel) -} - -func (t *goTarget) addFile(c *config.Config, info fileInfo) { - t.cgo = t.cgo || info.isCgo - add := getPlatformStringsAddFunction(c, info, nil) - add(&t.sources, info.name) - add(&t.imports, info.imports...) - for _, copts := range info.copts { - optAdd := add - if len(copts.tags) > 0 { - optAdd = getPlatformStringsAddFunction(c, info, copts.tags) - } - optAdd(&t.copts, copts.opts) - } - for _, clinkopts := range info.clinkopts { - optAdd := add - if len(clinkopts.tags) > 0 { - optAdd = getPlatformStringsAddFunction(c, info, clinkopts.tags) - } - optAdd(&t.clinkopts, clinkopts.opts) - } -} - -func protoTargetFromProtoPackage(name string, pkg proto.Package) protoTarget { - target := protoTarget{name: name} - for f := range pkg.Files { - target.sources.addGenericString(f) - } - for i := range pkg.Imports { - target.imports.addGenericString(i) - } - target.hasServices = pkg.HasServices - return target -} - -func (t *protoTarget) addFile(c *config.Config, info fileInfo) { - t.sources.addGenericString(info.name) - for _, imp := range info.imports { - t.imports.addGenericString(imp) - } - t.hasServices = t.hasServices || info.hasServices -} - -// getPlatformStringsAddFunction returns a function used to add strings to -// a *platformStringsBuilder under the same set of constraints. This is a -// performance optimization to avoid evaluating constraints repeatedly. -func getPlatformStringsAddFunction(c *config.Config, info fileInfo, cgoTags tagLine) func(sb *platformStringsBuilder, ss ...string) { - isOSSpecific, isArchSpecific := isOSArchSpecific(info, cgoTags) - - switch { - case !isOSSpecific && !isArchSpecific: - if checkConstraints(c, "", "", info.goos, info.goarch, info.tags, cgoTags) { - return func(sb *platformStringsBuilder, ss ...string) { - for _, s := range ss { - sb.addGenericString(s) - } - } - } - - case isOSSpecific && !isArchSpecific: - var osMatch []string - for _, os := range rule.KnownOSs { - if checkConstraints(c, os, "", info.goos, info.goarch, info.tags, cgoTags) { - osMatch = append(osMatch, os) - } - } - if len(osMatch) > 0 { - return func(sb *platformStringsBuilder, ss ...string) { - for _, s := range ss { - sb.addOSString(s, osMatch) - } - } - } - - case !isOSSpecific && isArchSpecific: - var archMatch []string - for _, arch := range rule.KnownArchs { - if checkConstraints(c, "", arch, info.goos, info.goarch, info.tags, cgoTags) { - archMatch = append(archMatch, arch) - } - } - if len(archMatch) > 0 { - return func(sb *platformStringsBuilder, ss ...string) { - for _, s := range ss { - sb.addArchString(s, archMatch) - } - } - } - - default: - var platformMatch []rule.Platform - for _, platform := range rule.KnownPlatforms { - if checkConstraints(c, platform.OS, platform.Arch, info.goos, info.goarch, info.tags, cgoTags) { - platformMatch = append(platformMatch, platform) - } - } - if len(platformMatch) > 0 { - return func(sb *platformStringsBuilder, ss ...string) { - for _, s := range ss { - sb.addPlatformString(s, platformMatch) - } - } - } - } - - return func(_ *platformStringsBuilder, _ ...string) {} -} - -func (sb *platformStringsBuilder) isEmpty() bool { - return sb.strs == nil -} - -func (sb *platformStringsBuilder) hasGo() bool { - for s := range sb.strs { - if strings.HasSuffix(s, ".go") { - return true - } - } - return false -} - -func (sb *platformStringsBuilder) addGenericString(s string) { - if sb.strs == nil { - sb.strs = make(map[string]platformStringInfo) - } - sb.strs[s] = platformStringInfo{set: genericSet} -} - -func (sb *platformStringsBuilder) addOSString(s string, oss []string) { - if sb.strs == nil { - sb.strs = make(map[string]platformStringInfo) - } - si, ok := sb.strs[s] - if !ok { - si.set = osSet - si.oss = make(map[string]bool) - } - switch si.set { - case genericSet: - return - case osSet: - for _, os := range oss { - si.oss[os] = true - } - default: - si.convertToPlatforms() - for _, os := range oss { - for _, arch := range rule.KnownOSArchs[os] { - si.platforms[rule.Platform{OS: os, Arch: arch}] = true - } - } - } - sb.strs[s] = si -} - -func (sb *platformStringsBuilder) addArchString(s string, archs []string) { - if sb.strs == nil { - sb.strs = make(map[string]platformStringInfo) - } - si, ok := sb.strs[s] - if !ok { - si.set = archSet - si.archs = make(map[string]bool) - } - switch si.set { - case genericSet: - return - case archSet: - for _, arch := range archs { - si.archs[arch] = true - } - default: - si.convertToPlatforms() - for _, arch := range archs { - for _, os := range rule.KnownArchOSs[arch] { - si.platforms[rule.Platform{OS: os, Arch: arch}] = true - } - } - } - sb.strs[s] = si -} - -func (sb *platformStringsBuilder) addPlatformString(s string, platforms []rule.Platform) { - if sb.strs == nil { - sb.strs = make(map[string]platformStringInfo) - } - si, ok := sb.strs[s] - if !ok { - si.set = platformSet - si.platforms = make(map[rule.Platform]bool) - } - switch si.set { - case genericSet: - return - default: - si.convertToPlatforms() - for _, p := range platforms { - si.platforms[p] = true - } - } - sb.strs[s] = si -} - -func (sb *platformStringsBuilder) build() rule.PlatformStrings { - var ps rule.PlatformStrings - for s, si := range sb.strs { - switch si.set { - case genericSet: - ps.Generic = append(ps.Generic, s) - case osSet: - if ps.OS == nil { - ps.OS = make(map[string][]string) - } - for os := range si.oss { - ps.OS[os] = append(ps.OS[os], s) - } - case archSet: - if ps.Arch == nil { - ps.Arch = make(map[string][]string) - } - for arch := range si.archs { - ps.Arch[arch] = append(ps.Arch[arch], s) - } - case platformSet: - if ps.Platform == nil { - ps.Platform = make(map[rule.Platform][]string) - } - for p := range si.platforms { - ps.Platform[p] = append(ps.Platform[p], s) - } - } - } - sort.Strings(ps.Generic) - if ps.OS != nil { - for _, ss := range ps.OS { - sort.Strings(ss) - } - } - if ps.Arch != nil { - for _, ss := range ps.Arch { - sort.Strings(ss) - } - } - if ps.Platform != nil { - for _, ss := range ps.Platform { - sort.Strings(ss) - } - } - return ps -} - -func (sb *platformStringsBuilder) buildFlat() []string { - strs := make([]string, 0, len(sb.strs)) - for s := range sb.strs { - strs = append(strs, s) - } - sort.Strings(strs) - return strs -} - -func (si *platformStringInfo) convertToPlatforms() { - switch si.set { - case genericSet: - log.Panic("cannot convert generic string to platforms") - case platformSet: - return - case osSet: - si.set = platformSet - si.platforms = make(map[rule.Platform]bool) - for os := range si.oss { - for _, arch := range rule.KnownOSArchs[os] { - si.platforms[rule.Platform{OS: os, Arch: arch}] = true - } - } - si.oss = nil - case archSet: - si.set = platformSet - si.platforms = make(map[rule.Platform]bool) - for arch := range si.archs { - for _, os := range rule.KnownArchOSs[arch] { - si.platforms[rule.Platform{OS: os, Arch: arch}] = true - } - } - si.archs = nil - } -} - -var semverRex = regexp.MustCompile(`^.*?(/v\d+)(?:/.*)?$`) - -// pathWithoutSemver removes a semantic version suffix from path. -// For example, if path is "example.com/foo/v2/bar", pathWithoutSemver -// will return "example.com/foo/bar". If there is no semantic version suffix, -// "" will be returned. -func pathWithoutSemver(path string) string { - m := semverRex.FindStringSubmatchIndex(path) - if m == nil { - return "" - } - v := path[m[2]+2 : m[3]] - if v[0] == '0' || v == "1" { - return "" - } - return path[:m[2]] + path[m[3]:] -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/resolve.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/resolve.go deleted file mode 100644 index e4e5f486c03..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/resolve.go +++ /dev/null @@ -1,373 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 golang - -import ( - "errors" - "fmt" - "go/build" - "log" - "path" - "regexp" - "strings" - - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/label" - "github.com/bazelbuild/bazel-gazelle/pathtools" - "github.com/bazelbuild/bazel-gazelle/repo" - "github.com/bazelbuild/bazel-gazelle/resolve" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -func (_ *goLang) Imports(_ *config.Config, r *rule.Rule, f *rule.File) []resolve.ImportSpec { - if !isGoLibrary(r.Kind()) { - return nil - } - if importPath := r.AttrString("importpath"); importPath == "" { - return []resolve.ImportSpec{} - } else { - return []resolve.ImportSpec{{goName, importPath}} - } -} - -func (_ *goLang) Embeds(r *rule.Rule, from label.Label) []label.Label { - embedStrings := r.AttrStrings("embed") - if isGoProtoLibrary(r.Kind()) { - embedStrings = append(embedStrings, r.AttrString("proto")) - } - embedLabels := make([]label.Label, 0, len(embedStrings)) - for _, s := range embedStrings { - l, err := label.Parse(s) - if err != nil { - continue - } - l = l.Abs(from.Repo, from.Pkg) - embedLabels = append(embedLabels, l) - } - return embedLabels -} - -func (gl *goLang) Resolve(c *config.Config, ix *resolve.RuleIndex, rc *repo.RemoteCache, r *rule.Rule, importsRaw interface{}, from label.Label) { - if importsRaw == nil { - // may not be set in tests. - return - } - imports := importsRaw.(rule.PlatformStrings) - r.DelAttr("deps") - resolve := ResolveGo - if r.Kind() == "go_proto_library" { - resolve = resolveProto - } - deps, errs := imports.Map(func(imp string) (string, error) { - l, err := resolve(c, ix, rc, imp, from) - if err == skipImportError { - return "", nil - } else if err != nil { - return "", err - } - for _, embed := range gl.Embeds(r, from) { - if embed.Equal(l) { - return "", nil - } - } - l = l.Rel(from.Repo, from.Pkg) - return l.String(), nil - }) - for _, err := range errs { - log.Print(err) - } - if !deps.IsEmpty() { - if r.Kind() == "go_proto_library" { - // protos may import the same library multiple times by different names, - // so we need to de-duplicate them. Protos are not platform-specific, - // so it's safe to just flatten them. - r.SetAttr("deps", deps.Flat()) - } else { - r.SetAttr("deps", deps) - } - } -} - -var ( - skipImportError = errors.New("std or self import") - notFoundError = errors.New("rule not found") -) - -// ResolveGo resolves a Go import path to a Bazel label, possibly using the -// given rule index and remote cache. Some special cases may be applied to -// known proto import paths, depending on the current proto mode. -// -// This may be used directly by other language extensions related to Go -// (gomock). Gazelle calls Language.Resolve instead. -func ResolveGo(c *config.Config, ix *resolve.RuleIndex, rc *repo.RemoteCache, imp string, from label.Label) (label.Label, error) { - gc := getGoConfig(c) - pcMode := getProtoMode(c) - if build.IsLocalImport(imp) { - cleanRel := path.Clean(path.Join(from.Pkg, imp)) - if build.IsLocalImport(cleanRel) { - return label.NoLabel, fmt.Errorf("relative import path %q from %q points outside of repository", imp, from.Pkg) - } - imp = path.Join(gc.prefix, cleanRel) - } - - if IsStandard(imp) { - return label.NoLabel, skipImportError - } - - if l, ok := resolve.FindRuleWithOverride(c, resolve.ImportSpec{Lang: "go", Imp: imp}, "go"); ok { - return l, nil - } - - if pcMode.ShouldUseKnownImports() { - // These are commonly used libraries that depend on Well Known Types. - // They depend on the generated versions of these protos to avoid conflicts. - // However, since protoc-gen-go depends on these libraries, we generate - // its rules in disable_global mode (to avoid cyclic dependency), so the - // "go_default_library" versions of these libraries depend on the - // pre-generated versions of the proto libraries. - switch imp { - case "github.com/golang/protobuf/proto": - return label.New("com_github_golang_protobuf", "proto", "go_default_library"), nil - case "github.com/golang/protobuf/jsonpb": - return label.New("com_github_golang_protobuf", "jsonpb", "go_default_library_gen"), nil - case "github.com/golang/protobuf/descriptor": - return label.New("com_github_golang_protobuf", "descriptor", "go_default_library_gen"), nil - case "github.com/golang/protobuf/ptypes": - return label.New("com_github_golang_protobuf", "ptypes", "go_default_library_gen"), nil - case "github.com/golang/protobuf/protoc-gen-go/generator": - return label.New("com_github_golang_protobuf", "protoc-gen-go/generator", "go_default_library_gen"), nil - case "google.golang.org/grpc": - return label.New("org_golang_google_grpc", "", "go_default_library"), nil - } - if l, ok := knownGoProtoImports[imp]; ok { - return l, nil - } - } - - if l, err := resolveWithIndexGo(ix, imp, from); err == nil || err == skipImportError { - return l, err - } else if err != notFoundError { - return label.NoLabel, err - } - - // Special cases for rules_go and bazel_gazelle. - // These have names that don't following conventions and they're - // typeically declared with http_archive, not go_repository, so Gazelle - // won't recognize them. - if pathtools.HasPrefix(imp, "github.com/bazelbuild/rules_go") { - pkg := pathtools.TrimPrefix(imp, "github.com/bazelbuild/rules_go") - return label.New("io_bazel_rules_go", pkg, "go_default_library"), nil - } else if pathtools.HasPrefix(imp, "github.com/bazelbuild/bazel-gazelle") { - pkg := pathtools.TrimPrefix(imp, "github.com/bazelbuild/bazel-gazelle") - return label.New("bazel_gazelle", pkg, "go_default_library"), nil - } - - if !c.IndexLibraries { - // packages in current repo were not indexed, relying on prefix to decide what may have been in - // current repo - if pathtools.HasPrefix(imp, gc.prefix) { - pkg := path.Join(gc.prefixRel, pathtools.TrimPrefix(imp, gc.prefix)) - return label.New("", pkg, defaultLibName), nil - } - } - - if gc.depMode == externalMode { - return resolveExternal(gc.moduleMode, rc, imp) - } else { - return resolveVendored(rc, imp) - } -} - -// IsStandard returns whether a package is in the standard library. -func IsStandard(imp string) bool { - return stdPackages[imp] -} - -func resolveWithIndexGo(ix *resolve.RuleIndex, imp string, from label.Label) (label.Label, error) { - matches := ix.FindRulesByImport(resolve.ImportSpec{Lang: "go", Imp: imp}, "go") - var bestMatch resolve.FindResult - var bestMatchIsVendored bool - var bestMatchVendorRoot string - var matchError error - - for _, m := range matches { - // Apply vendoring logic for Go libraries. A library in a vendor directory - // is only visible in the parent tree. Vendored libraries supercede - // non-vendored libraries, and libraries closer to from.Pkg supercede - // those further up the tree. - isVendored := false - vendorRoot := "" - parts := strings.Split(m.Label.Pkg, "/") - for i := len(parts) - 1; i >= 0; i-- { - if parts[i] == "vendor" { - isVendored = true - vendorRoot = strings.Join(parts[:i], "/") - break - } - } - if isVendored { - } - if isVendored && !label.New(m.Label.Repo, vendorRoot, "").Contains(from) { - // vendor directory not visible - continue - } - if bestMatch.Label.Equal(label.NoLabel) || isVendored && (!bestMatchIsVendored || len(vendorRoot) > len(bestMatchVendorRoot)) { - // Current match is better - bestMatch = m - bestMatchIsVendored = isVendored - bestMatchVendorRoot = vendorRoot - matchError = nil - } else if (!isVendored && bestMatchIsVendored) || (isVendored && len(vendorRoot) < len(bestMatchVendorRoot)) { - // Current match is worse - } else { - // Match is ambiguous - // TODO: consider listing all the ambiguous rules here. - matchError = fmt.Errorf("rule %s imports %q which matches multiple rules: %s and %s. # gazelle:resolve may be used to disambiguate", from, imp, bestMatch.Label, m.Label) - } - } - if matchError != nil { - return label.NoLabel, matchError - } - if bestMatch.Label.Equal(label.NoLabel) { - return label.NoLabel, notFoundError - } - if bestMatch.IsSelfImport(from) { - return label.NoLabel, skipImportError - } - return bestMatch.Label, nil -} - -var modMajorRex = regexp.MustCompile(`/v\d+(?:/|$)`) - -func resolveExternal(moduleMode bool, rc *repo.RemoteCache, imp string) (label.Label, error) { - // If we're in module mode, use "go list" to find the module path and - // repository name. Otherwise, use special cases (for github.com, golang.org) - // or send a GET with ?go-get=1 to find the root. If the path contains - // a major version suffix (e.g., /v2), treat it as a module anyway though. - // - // Eventually module mode will be the only mode. But for now, it's expensive - // and not the common case, especially when known repositories aren't - // listed in WORKSPACE (which is currently the case within go_repository). - if !moduleMode { - moduleMode = pathWithoutSemver(imp) != "" - } - - var prefix, repo string - var err error - if moduleMode { - prefix, repo, err = rc.Mod(imp) - } else { - prefix, repo, err = rc.Root(imp) - } - if err != nil { - return label.NoLabel, err - } - - var pkg string - if pathtools.HasPrefix(imp, prefix) { - pkg = pathtools.TrimPrefix(imp, prefix) - } else if impWithoutSemver := pathWithoutSemver(imp); pathtools.HasPrefix(impWithoutSemver, prefix) { - // We may have used minimal module compatibility to resolve a path - // without a semantic import version suffix to a repository that has one. - pkg = pathtools.TrimPrefix(impWithoutSemver, prefix) - } - - return label.New(repo, pkg, defaultLibName), nil -} - -func resolveVendored(rc *repo.RemoteCache, imp string) (label.Label, error) { - return label.New("", path.Join("vendor", imp), defaultLibName), nil -} - -func resolveProto(c *config.Config, ix *resolve.RuleIndex, rc *repo.RemoteCache, imp string, from label.Label) (label.Label, error) { - pcMode := getProtoMode(c) - - if wellKnownProtos[imp] { - return label.NoLabel, skipImportError - } - - if l, ok := resolve.FindRuleWithOverride(c, resolve.ImportSpec{Lang: "proto", Imp: imp}, "go"); ok { - return l, nil - } - - if l, ok := knownProtoImports[imp]; ok && pcMode.ShouldUseKnownImports() { - if l.Equal(from) { - return label.NoLabel, skipImportError - } else { - return l, nil - } - } - - if l, err := resolveWithIndexProto(ix, imp, from); err == nil || err == skipImportError { - return l, err - } else if err != notFoundError { - return label.NoLabel, err - } - - // As a fallback, guess the label based on the proto file name. We assume - // all proto files in a directory belong to the same package, and the - // package name matches the directory base name. We also assume that protos - // in the vendor directory must refer to something else in vendor. - rel := path.Dir(imp) - if rel == "." { - rel = "" - } - if from.Pkg == "vendor" || strings.HasPrefix(from.Pkg, "vendor/") { - rel = path.Join("vendor", rel) - } - return label.New("", rel, defaultLibName), nil -} - -// wellKnownProtos is the set of proto sets for which we don't need to add -// an explicit dependency in go_proto_library. -// TODO(jayconrod): generate from -// @io_bazel_rules_go//proto/wkt:WELL_KNOWN_TYPE_PACKAGES -var wellKnownProtos = map[string]bool{ - "google/protobuf/any.proto": true, - "google/protobuf/api.proto": true, - "google/protobuf/compiler/plugin.proto": true, - "google/protobuf/descriptor.proto": true, - "google/protobuf/duration.proto": true, - "google/protobuf/empty.proto": true, - "google/protobuf/field_mask.proto": true, - "google/protobuf/source_context.proto": true, - "google/protobuf/struct.proto": true, - "google/protobuf/timestamp.proto": true, - "google/protobuf/type.proto": true, - "google/protobuf/wrappers.proto": true, -} - -func resolveWithIndexProto(ix *resolve.RuleIndex, imp string, from label.Label) (label.Label, error) { - matches := ix.FindRulesByImport(resolve.ImportSpec{Lang: "proto", Imp: imp}, "go") - if len(matches) == 0 { - return label.NoLabel, notFoundError - } - if len(matches) > 1 { - return label.NoLabel, fmt.Errorf("multiple rules (%s and %s) may be imported with %q from %s", matches[0].Label, matches[1].Label, imp, from) - } - if matches[0].IsSelfImport(from) { - return label.NoLabel, skipImportError - } - return matches[0].Label, nil -} - -func isGoLibrary(kind string) bool { - return kind == "go_library" || isGoProtoLibrary(kind) -} - -func isGoProtoLibrary(kind string) bool { - return kind == "go_proto_library" || kind == "go_grpc_library" -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/std_package_list.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/std_package_list.go deleted file mode 100644 index cf908872486..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/std_package_list.go +++ /dev/null @@ -1,678 +0,0 @@ - -/* Copyright 2017 The Bazel Authors. 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. -*/ - -// Generated by gen_std_package_list.go -// DO NOT EDIT - -package golang - -var stdPackages = map[string]bool{ - "archive/tar": true, - "archive/tar/testdata": true, - "archive/zip": true, - "archive/zip/testdata": true, - "bufio": true, - "builtin": true, - "bytes": true, - "cmd": true, - "cmd/addr2line": true, - "cmd/api": true, - "cmd/api/testdata/src/issue21181/dep": true, - "cmd/api/testdata/src/issue21181/indirect": true, - "cmd/api/testdata/src/issue21181/p": true, - "cmd/api/testdata/src/issue29837/p": true, - "cmd/api/testdata/src/pkg/p1": true, - "cmd/api/testdata/src/pkg/p2": true, - "cmd/api/testdata/src/pkg/p3": true, - "cmd/asm": true, - "cmd/asm/internal/arch": true, - "cmd/asm/internal/asm": true, - "cmd/asm/internal/asm/testdata": true, - "cmd/asm/internal/asm/testdata/avx512enc": true, - "cmd/asm/internal/flags": true, - "cmd/asm/internal/lex": true, - "cmd/buildid": true, - "cmd/cgo": true, - "cmd/compile": true, - "cmd/compile/internal/amd64": true, - "cmd/compile/internal/arm": true, - "cmd/compile/internal/arm64": true, - "cmd/compile/internal/gc": true, - "cmd/compile/internal/gc/builtin": true, - "cmd/compile/internal/gc/testdata": true, - "cmd/compile/internal/gc/testdata/gen": true, - "cmd/compile/internal/gc/testdata/reproducible": true, - "cmd/compile/internal/mips": true, - "cmd/compile/internal/mips64": true, - "cmd/compile/internal/ppc64": true, - "cmd/compile/internal/s390x": true, - "cmd/compile/internal/ssa": true, - "cmd/compile/internal/ssa/gen": true, - "cmd/compile/internal/ssa/testdata": true, - "cmd/compile/internal/syntax": true, - "cmd/compile/internal/syntax/testdata": true, - "cmd/compile/internal/test": true, - "cmd/compile/internal/types": true, - "cmd/compile/internal/wasm": true, - "cmd/compile/internal/x86": true, - "cmd/cover": true, - "cmd/cover/testdata": true, - "cmd/cover/testdata/html": true, - "cmd/dist": true, - "cmd/doc": true, - "cmd/doc/testdata": true, - "cmd/doc/testdata/nested": true, - "cmd/doc/testdata/nested/nested": true, - "cmd/fix": true, - "cmd/go": true, - "cmd/go/internal/auth": true, - "cmd/go/internal/base": true, - "cmd/go/internal/bug": true, - "cmd/go/internal/cache": true, - "cmd/go/internal/cfg": true, - "cmd/go/internal/clean": true, - "cmd/go/internal/cmdflag": true, - "cmd/go/internal/dirhash": true, - "cmd/go/internal/doc": true, - "cmd/go/internal/envcmd": true, - "cmd/go/internal/fix": true, - "cmd/go/internal/fmtcmd": true, - "cmd/go/internal/generate": true, - "cmd/go/internal/get": true, - "cmd/go/internal/help": true, - "cmd/go/internal/imports": true, - "cmd/go/internal/imports/testdata/android": true, - "cmd/go/internal/imports/testdata/illumos": true, - "cmd/go/internal/imports/testdata/star": true, - "cmd/go/internal/list": true, - "cmd/go/internal/load": true, - "cmd/go/internal/lockedfile": true, - "cmd/go/internal/lockedfile/internal/filelock": true, - "cmd/go/internal/modcmd": true, - "cmd/go/internal/modconv": true, - "cmd/go/internal/modconv/testdata": true, - "cmd/go/internal/modfetch": true, - "cmd/go/internal/modfetch/codehost": true, - "cmd/go/internal/modfile": true, - "cmd/go/internal/modfile/testdata": true, - "cmd/go/internal/modget": true, - "cmd/go/internal/modinfo": true, - "cmd/go/internal/modload": true, - "cmd/go/internal/module": true, - "cmd/go/internal/mvs": true, - "cmd/go/internal/note": true, - "cmd/go/internal/par": true, - "cmd/go/internal/renameio": true, - "cmd/go/internal/robustio": true, - "cmd/go/internal/run": true, - "cmd/go/internal/search": true, - "cmd/go/internal/semver": true, - "cmd/go/internal/str": true, - "cmd/go/internal/sumweb": true, - "cmd/go/internal/test": true, - "cmd/go/internal/tlog": true, - "cmd/go/internal/tool": true, - "cmd/go/internal/txtar": true, - "cmd/go/internal/version": true, - "cmd/go/internal/vet": true, - "cmd/go/internal/web": true, - "cmd/go/internal/work": true, - "cmd/go/testdata": true, - "cmd/go/testdata/badmod": true, - "cmd/go/testdata/failssh": true, - "cmd/go/testdata/generate": true, - "cmd/go/testdata/importcom": true, - "cmd/go/testdata/importcom/src/bad": true, - "cmd/go/testdata/importcom/src/conflict": true, - "cmd/go/testdata/importcom/src/works/x": true, - "cmd/go/testdata/importcom/src/wrongplace": true, - "cmd/go/testdata/importcycle/src/selfimport": true, - "cmd/go/testdata/local": true, - "cmd/go/testdata/local/easysub": true, - "cmd/go/testdata/local/sub": true, - "cmd/go/testdata/local/sub/sub": true, - "cmd/go/testdata/mod": true, - "cmd/go/testdata/modlegacy/src/new": true, - "cmd/go/testdata/modlegacy/src/new/p1": true, - "cmd/go/testdata/modlegacy/src/new/p2": true, - "cmd/go/testdata/modlegacy/src/new/sub": true, - "cmd/go/testdata/modlegacy/src/new/sub/inner": true, - "cmd/go/testdata/modlegacy/src/new/sub/inner/x": true, - "cmd/go/testdata/modlegacy/src/new/sub/x/v1/y": true, - "cmd/go/testdata/modlegacy/src/old/p1": true, - "cmd/go/testdata/modlegacy/src/old/p2": true, - "cmd/go/testdata/norunexample": true, - "cmd/go/testdata/rundir": true, - "cmd/go/testdata/rundir/sub": true, - "cmd/go/testdata/script": true, - "cmd/go/testdata/shadow/root1/src/foo": true, - "cmd/go/testdata/shadow/root1/src/math": true, - "cmd/go/testdata/shadow/root2/src/foo": true, - "cmd/go/testdata/src": true, - "cmd/go/testdata/src/badc": true, - "cmd/go/testdata/src/badpkg": true, - "cmd/go/testdata/src/bench": true, - "cmd/go/testdata/src/benchfatal": true, - "cmd/go/testdata/src/canonical/a": true, - "cmd/go/testdata/src/canonical/a/vendor/c": true, - "cmd/go/testdata/src/canonical/b": true, - "cmd/go/testdata/src/canonical/d": true, - "cmd/go/testdata/src/cgoasm": true, - "cmd/go/testdata/src/cgocover": true, - "cmd/go/testdata/src/cgocover2": true, - "cmd/go/testdata/src/cgocover3": true, - "cmd/go/testdata/src/cgocover4": true, - "cmd/go/testdata/src/cgotest": true, - "cmd/go/testdata/src/coverasm": true, - "cmd/go/testdata/src/coverbad": true, - "cmd/go/testdata/src/coverdep": true, - "cmd/go/testdata/src/coverdep/p1": true, - "cmd/go/testdata/src/coverdep2/p1": true, - "cmd/go/testdata/src/coverdep2/p2": true, - "cmd/go/testdata/src/coverdot1": true, - "cmd/go/testdata/src/coverdot2": true, - "cmd/go/testdata/src/dupload": true, - "cmd/go/testdata/src/dupload/p": true, - "cmd/go/testdata/src/dupload/p2": true, - "cmd/go/testdata/src/dupload/vendor/p": true, - "cmd/go/testdata/src/empty/pkg": true, - "cmd/go/testdata/src/empty/pkgtest": true, - "cmd/go/testdata/src/empty/pkgtestxtest": true, - "cmd/go/testdata/src/empty/pkgxtest": true, - "cmd/go/testdata/src/empty/test": true, - "cmd/go/testdata/src/empty/testxtest": true, - "cmd/go/testdata/src/empty/xtest": true, - "cmd/go/testdata/src/exclude": true, - "cmd/go/testdata/src/exclude/empty": true, - "cmd/go/testdata/src/exclude/ignore": true, - "cmd/go/testdata/src/gencycle": true, - "cmd/go/testdata/src/go-cmd-test": true, - "cmd/go/testdata/src/hello": true, - "cmd/go/testdata/src/importmain/ismain": true, - "cmd/go/testdata/src/importmain/test": true, - "cmd/go/testdata/src/main_test": true, - "cmd/go/testdata/src/multimain": true, - "cmd/go/testdata/src/my.pkg": true, - "cmd/go/testdata/src/my.pkg/main": true, - "cmd/go/testdata/src/not_main": true, - "cmd/go/testdata/src/notest": true, - "cmd/go/testdata/src/run": true, - "cmd/go/testdata/src/run/internal": true, - "cmd/go/testdata/src/run/subdir/internal/private": true, - "cmd/go/testdata/src/skipper": true, - "cmd/go/testdata/src/sleepy1": true, - "cmd/go/testdata/src/sleepy2": true, - "cmd/go/testdata/src/sleepybad": true, - "cmd/go/testdata/src/syntaxerror": true, - "cmd/go/testdata/src/testcache": true, - "cmd/go/testdata/src/testcycle/p1": true, - "cmd/go/testdata/src/testcycle/p2": true, - "cmd/go/testdata/src/testcycle/p3": true, - "cmd/go/testdata/src/testcycle/q1": true, - "cmd/go/testdata/src/testdep/p1": true, - "cmd/go/testdata/src/testdep/p2": true, - "cmd/go/testdata/src/testdep/p3": true, - "cmd/go/testdata/src/testlist": true, - "cmd/go/testdata/src/testnorun": true, - "cmd/go/testdata/src/testrace": true, - "cmd/go/testdata/src/testregexp": true, - "cmd/go/testdata/src/vend": true, - "cmd/go/testdata/src/vend/dir1": true, - "cmd/go/testdata/src/vend/hello": true, - "cmd/go/testdata/src/vend/subdir": true, - "cmd/go/testdata/src/vend/vendor/p": true, - "cmd/go/testdata/src/vend/vendor/q": true, - "cmd/go/testdata/src/vend/vendor/strings": true, - "cmd/go/testdata/src/vend/vendor/vend/dir1/dir2": true, - "cmd/go/testdata/src/vend/x": true, - "cmd/go/testdata/src/vend/x/invalid": true, - "cmd/go/testdata/src/vend/x/vendor/p": true, - "cmd/go/testdata/src/vend/x/vendor/p/p": true, - "cmd/go/testdata/src/vend/x/vendor/r": true, - "cmd/go/testdata/src/vetcycle": true, - "cmd/go/testdata/src/vetfail/p1": true, - "cmd/go/testdata/src/vetfail/p2": true, - "cmd/go/testdata/src/vetpkg": true, - "cmd/go/testdata/src/xtestonly": true, - "cmd/go/testdata/testcover/pkg1": true, - "cmd/go/testdata/testcover/pkg2": true, - "cmd/go/testdata/testcover/pkg3": true, - "cmd/go/testdata/testcover/pkg4": true, - "cmd/go/testdata/testimport": true, - "cmd/go/testdata/testimport/p1": true, - "cmd/go/testdata/testimport/p2": true, - "cmd/go/testdata/testinternal": true, - "cmd/go/testdata/testinternal2": true, - "cmd/go/testdata/testinternal2/x/y/z/internal/w": true, - "cmd/go/testdata/testinternal3": true, - "cmd/go/testdata/testinternal4/src/p": true, - "cmd/go/testdata/testinternal4/src/q/internal/x": true, - "cmd/go/testdata/testinternal4/src/q/j": true, - "cmd/go/testdata/testonly": true, - "cmd/go/testdata/testonly2": true, - "cmd/go/testdata/testterminal18153": true, - "cmd/go/testdata/testvendor/src/p": true, - "cmd/go/testdata/testvendor/src/q/vendor/x": true, - "cmd/go/testdata/testvendor/src/q/y": true, - "cmd/go/testdata/testvendor/src/q/z": true, - "cmd/go/testdata/testvendor2/src/p": true, - "cmd/go/testdata/testvendor2/vendor/x": true, - "cmd/gofmt": true, - "cmd/gofmt/testdata": true, - "cmd/internal/bio": true, - "cmd/internal/browser": true, - "cmd/internal/buildid": true, - "cmd/internal/buildid/testdata": true, - "cmd/internal/dwarf": true, - "cmd/internal/edit": true, - "cmd/internal/gcprog": true, - "cmd/internal/goobj": true, - "cmd/internal/goobj/testdata": true, - "cmd/internal/goobj/testdata/mycgo": true, - "cmd/internal/obj": true, - "cmd/internal/obj/arm": true, - "cmd/internal/obj/arm64": true, - "cmd/internal/obj/mips": true, - "cmd/internal/obj/ppc64": true, - "cmd/internal/obj/s390x": true, - "cmd/internal/obj/wasm": true, - "cmd/internal/obj/x86": true, - "cmd/internal/objabi": true, - "cmd/internal/objfile": true, - "cmd/internal/src": true, - "cmd/internal/sys": true, - "cmd/internal/test2json": true, - "cmd/internal/test2json/testdata": true, - "cmd/link": true, - "cmd/link/internal/amd64": true, - "cmd/link/internal/arm": true, - "cmd/link/internal/arm64": true, - "cmd/link/internal/ld": true, - "cmd/link/internal/ld/testdata/httptest/main": true, - "cmd/link/internal/ld/testdata/issue10978": true, - "cmd/link/internal/ld/testdata/issue25459/a": true, - "cmd/link/internal/ld/testdata/issue25459/main": true, - "cmd/link/internal/ld/testdata/issue26237/b.dir": true, - "cmd/link/internal/ld/testdata/issue26237/main": true, - "cmd/link/internal/ld/testdata/issue32233/lib": true, - "cmd/link/internal/ld/testdata/issue32233/main": true, - "cmd/link/internal/loadelf": true, - "cmd/link/internal/loadmacho": true, - "cmd/link/internal/loadpe": true, - "cmd/link/internal/loadxcoff": true, - "cmd/link/internal/mips": true, - "cmd/link/internal/mips64": true, - "cmd/link/internal/objfile": true, - "cmd/link/internal/ppc64": true, - "cmd/link/internal/s390x": true, - "cmd/link/internal/sym": true, - "cmd/link/internal/wasm": true, - "cmd/link/internal/x86": true, - "cmd/link/testdata": true, - "cmd/nm": true, - "cmd/objdump": true, - "cmd/objdump/testdata": true, - "cmd/pack": true, - "cmd/pprof": true, - "cmd/test2json": true, - "cmd/trace": true, - "cmd/vendor": true, - "cmd/vendor/github.com/google/pprof": true, - "cmd/vendor/github.com/google/pprof/driver": true, - "cmd/vendor/github.com/google/pprof/internal/binutils": true, - "cmd/vendor/github.com/google/pprof/internal/driver": true, - "cmd/vendor/github.com/google/pprof/internal/elfexec": true, - "cmd/vendor/github.com/google/pprof/internal/graph": true, - "cmd/vendor/github.com/google/pprof/internal/measurement": true, - "cmd/vendor/github.com/google/pprof/internal/plugin": true, - "cmd/vendor/github.com/google/pprof/internal/report": true, - "cmd/vendor/github.com/google/pprof/internal/symbolizer": true, - "cmd/vendor/github.com/google/pprof/internal/symbolz": true, - "cmd/vendor/github.com/google/pprof/internal/transport": true, - "cmd/vendor/github.com/google/pprof/profile": true, - "cmd/vendor/github.com/google/pprof/third_party/d3": true, - "cmd/vendor/github.com/google/pprof/third_party/d3flamegraph": true, - "cmd/vendor/github.com/google/pprof/third_party/svgpan": true, - "cmd/vendor/github.com/ianlancetaylor/demangle": true, - "cmd/vendor/golang.org/x/arch": true, - "cmd/vendor/golang.org/x/arch/arm/armasm": true, - "cmd/vendor/golang.org/x/arch/arm64/arm64asm": true, - "cmd/vendor/golang.org/x/arch/ppc64/ppc64asm": true, - "cmd/vendor/golang.org/x/arch/x86/x86asm": true, - "cmd/vendor/golang.org/x/crypto": true, - "cmd/vendor/golang.org/x/crypto/ssh/terminal": true, - "cmd/vendor/golang.org/x/sys": true, - "cmd/vendor/golang.org/x/sys/unix": true, - "cmd/vendor/golang.org/x/sys/windows": true, - "cmd/vendor/golang.org/x/tools": true, - "cmd/vendor/golang.org/x/tools/go/analysis": true, - "cmd/vendor/golang.org/x/tools/go/analysis/internal/analysisflags": true, - "cmd/vendor/golang.org/x/tools/go/analysis/internal/facts": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/asmdecl": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/assign": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/atomic": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/bools": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/buildtag": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/cgocall": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/composite": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/copylock": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/ctrlflow": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/errorsas": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/httpresponse": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/inspect": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/internal/analysisutil": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/loopclosure": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/lostcancel": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/nilfunc": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/printf": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/shift": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/stdmethods": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/structtag": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/tests": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/unmarshal": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/unreachable": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/unsafeptr": true, - "cmd/vendor/golang.org/x/tools/go/analysis/passes/unusedresult": true, - "cmd/vendor/golang.org/x/tools/go/analysis/unitchecker": true, - "cmd/vendor/golang.org/x/tools/go/ast/astutil": true, - "cmd/vendor/golang.org/x/tools/go/ast/inspector": true, - "cmd/vendor/golang.org/x/tools/go/cfg": true, - "cmd/vendor/golang.org/x/tools/go/types/objectpath": true, - "cmd/vendor/golang.org/x/tools/go/types/typeutil": true, - "cmd/vet": true, - "cmd/vet/testdata/asm": true, - "cmd/vet/testdata/assign": true, - "cmd/vet/testdata/atomic": true, - "cmd/vet/testdata/bool": true, - "cmd/vet/testdata/buildtag": true, - "cmd/vet/testdata/cgo": true, - "cmd/vet/testdata/composite": true, - "cmd/vet/testdata/copylock": true, - "cmd/vet/testdata/deadcode": true, - "cmd/vet/testdata/httpresponse": true, - "cmd/vet/testdata/lostcancel": true, - "cmd/vet/testdata/method": true, - "cmd/vet/testdata/nilfunc": true, - "cmd/vet/testdata/print": true, - "cmd/vet/testdata/rangeloop": true, - "cmd/vet/testdata/shift": true, - "cmd/vet/testdata/structtag": true, - "cmd/vet/testdata/tagtest": true, - "cmd/vet/testdata/testingpkg": true, - "cmd/vet/testdata/unmarshal": true, - "cmd/vet/testdata/unsafeptr": true, - "cmd/vet/testdata/unused": true, - "compress/bzip2": true, - "compress/bzip2/testdata": true, - "compress/flate": true, - "compress/flate/testdata": true, - "compress/gzip": true, - "compress/gzip/testdata": true, - "compress/lzw": true, - "compress/testdata": true, - "compress/zlib": true, - "container/heap": true, - "container/list": true, - "container/ring": true, - "context": true, - "crypto": true, - "crypto/aes": true, - "crypto/cipher": true, - "crypto/des": true, - "crypto/dsa": true, - "crypto/ecdsa": true, - "crypto/ecdsa/testdata": true, - "crypto/ed25519": true, - "crypto/ed25519/internal/edwards25519": true, - "crypto/ed25519/testdata": true, - "crypto/elliptic": true, - "crypto/hmac": true, - "crypto/internal/randutil": true, - "crypto/internal/subtle": true, - "crypto/md5": true, - "crypto/rand": true, - "crypto/rc4": true, - "crypto/rsa": true, - "crypto/rsa/testdata": true, - "crypto/sha1": true, - "crypto/sha256": true, - "crypto/sha512": true, - "crypto/subtle": true, - "crypto/tls": true, - "crypto/tls/testdata": true, - "crypto/x509": true, - "crypto/x509/pkix": true, - "crypto/x509/testdata": true, - "database/sql": true, - "database/sql/driver": true, - "debug/dwarf": true, - "debug/dwarf/testdata": true, - "debug/elf": true, - "debug/elf/testdata": true, - "debug/gosym": true, - "debug/gosym/testdata": true, - "debug/macho": true, - "debug/macho/testdata": true, - "debug/pe": true, - "debug/pe/testdata": true, - "debug/plan9obj": true, - "debug/plan9obj/testdata": true, - "encoding": true, - "encoding/ascii85": true, - "encoding/asn1": true, - "encoding/base32": true, - "encoding/base64": true, - "encoding/binary": true, - "encoding/csv": true, - "encoding/gob": true, - "encoding/hex": true, - "encoding/json": true, - "encoding/json/testdata": true, - "encoding/pem": true, - "encoding/xml": true, - "errors": true, - "expvar": true, - "flag": true, - "fmt": true, - "go/ast": true, - "go/build": true, - "go/build/testdata/doc": true, - "go/build/testdata/empty": true, - "go/build/testdata/multi": true, - "go/build/testdata/other": true, - "go/build/testdata/other/file": true, - "go/build/testdata/withvendor/src/a/b": true, - "go/build/testdata/withvendor/src/a/vendor/c/d": true, - "go/constant": true, - "go/doc": true, - "go/doc/testdata": true, - "go/format": true, - "go/importer": true, - "go/internal/gccgoimporter": true, - "go/internal/gccgoimporter/testdata": true, - "go/internal/gcimporter": true, - "go/internal/gcimporter/testdata": true, - "go/internal/gcimporter/testdata/versions": true, - "go/internal/srcimporter": true, - "go/internal/srcimporter/testdata/issue20855": true, - "go/internal/srcimporter/testdata/issue23092": true, - "go/internal/srcimporter/testdata/issue24392": true, - "go/parser": true, - "go/parser/testdata": true, - "go/printer": true, - "go/printer/testdata": true, - "go/scanner": true, - "go/token": true, - "go/types": true, - "go/types/testdata": true, - "hash": true, - "hash/adler32": true, - "hash/crc32": true, - "hash/crc64": true, - "hash/fnv": true, - "html": true, - "html/template": true, - "image": true, - "image/color": true, - "image/color/palette": true, - "image/draw": true, - "image/gif": true, - "image/internal/imageutil": true, - "image/jpeg": true, - "image/png": true, - "image/png/testdata": true, - "image/png/testdata/pngsuite": true, - "image/testdata": true, - "index/suffixarray": true, - "internal/bytealg": true, - "internal/cfg": true, - "internal/cpu": true, - "internal/fmtsort": true, - "internal/goroot": true, - "internal/goversion": true, - "internal/lazyregexp": true, - "internal/lazytemplate": true, - "internal/nettrace": true, - "internal/oserror": true, - "internal/poll": true, - "internal/race": true, - "internal/reflectlite": true, - "internal/singleflight": true, - "internal/syscall/unix": true, - "internal/syscall/windows": true, - "internal/syscall/windows/registry": true, - "internal/syscall/windows/sysdll": true, - "internal/testenv": true, - "internal/testlog": true, - "internal/trace": true, - "internal/trace/testdata": true, - "internal/xcoff": true, - "internal/xcoff/testdata": true, - "io": true, - "io/ioutil": true, - "io/ioutil/testdata": true, - "log": true, - "log/syslog": true, - "math": true, - "math/big": true, - "math/bits": true, - "math/cmplx": true, - "math/rand": true, - "mime": true, - "mime/multipart": true, - "mime/multipart/testdata": true, - "mime/quotedprintable": true, - "mime/testdata": true, - "net": true, - "net/http": true, - "net/http/cgi": true, - "net/http/cgi/testdata": true, - "net/http/cookiejar": true, - "net/http/fcgi": true, - "net/http/httptest": true, - "net/http/httptrace": true, - "net/http/httputil": true, - "net/http/internal": true, - "net/http/pprof": true, - "net/http/testdata": true, - "net/internal/socktest": true, - "net/mail": true, - "net/rpc": true, - "net/rpc/jsonrpc": true, - "net/smtp": true, - "net/testdata": true, - "net/textproto": true, - "net/url": true, - "os": true, - "os/exec": true, - "os/signal": true, - "os/signal/internal/pty": true, - "os/user": true, - "path": true, - "path/filepath": true, - "plugin": true, - "reflect": true, - "regexp": true, - "regexp/syntax": true, - "regexp/testdata": true, - "runtime": true, - "runtime/cgo": true, - "runtime/debug": true, - "runtime/internal/atomic": true, - "runtime/internal/math": true, - "runtime/internal/sys": true, - "runtime/msan": true, - "runtime/pprof": true, - "runtime/pprof/internal/profile": true, - "runtime/pprof/testdata": true, - "runtime/pprof/testdata/mappingtest": true, - "runtime/race": true, - "runtime/race/testdata": true, - "runtime/testdata/testprog": true, - "runtime/testdata/testprogcgo": true, - "runtime/testdata/testprogcgo/windows": true, - "runtime/testdata/testprognet": true, - "runtime/trace": true, - "sort": true, - "strconv": true, - "strconv/testdata": true, - "strings": true, - "sync": true, - "sync/atomic": true, - "syscall": true, - "syscall/js": true, - "testdata": true, - "testing": true, - "testing/internal/testdeps": true, - "testing/iotest": true, - "testing/quick": true, - "text/scanner": true, - "text/tabwriter": true, - "text/template": true, - "text/template/parse": true, - "text/template/testdata": true, - "time": true, - "unicode": true, - "unicode/utf16": true, - "unicode/utf8": true, - "unsafe": true, - "vendor": true, - "vendor/golang.org/x/crypto": true, - "vendor/golang.org/x/crypto/chacha20poly1305": true, - "vendor/golang.org/x/crypto/cryptobyte": true, - "vendor/golang.org/x/crypto/cryptobyte/asn1": true, - "vendor/golang.org/x/crypto/curve25519": true, - "vendor/golang.org/x/crypto/hkdf": true, - "vendor/golang.org/x/crypto/internal/chacha20": true, - "vendor/golang.org/x/crypto/internal/subtle": true, - "vendor/golang.org/x/crypto/poly1305": true, - "vendor/golang.org/x/net": true, - "vendor/golang.org/x/net/dns/dnsmessage": true, - "vendor/golang.org/x/net/http/httpguts": true, - "vendor/golang.org/x/net/http/httpproxy": true, - "vendor/golang.org/x/net/http2/hpack": true, - "vendor/golang.org/x/net/idna": true, - "vendor/golang.org/x/net/lif": true, - "vendor/golang.org/x/net/nettest": true, - "vendor/golang.org/x/net/route": true, - "vendor/golang.org/x/sys": true, - "vendor/golang.org/x/sys/cpu": true, - "vendor/golang.org/x/text": true, - "vendor/golang.org/x/text/secure/bidirule": true, - "vendor/golang.org/x/text/transform": true, - "vendor/golang.org/x/text/unicode/bidi": true, - "vendor/golang.org/x/text/unicode/norm": true, -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/update.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/go/update.go deleted file mode 100644 index 6a33078d6a6..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/go/update.go +++ /dev/null @@ -1,109 +0,0 @@ -/* Copyright 2019 The Bazel Authors. 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 golang - -import ( - "path/filepath" - "strings" - - "github.com/bazelbuild/bazel-gazelle/language" - "github.com/bazelbuild/bazel-gazelle/rule" - "golang.org/x/sync/errgroup" -) - -// UpdateRepos generates go_repository rules corresponding to modules in -// args.Imports. Each module argument may specify a version with an '@' suffix -// (in the same format as 'go get'). If no version is specified, @latest -// is requested. -func (*goLang) UpdateRepos(args language.UpdateReposArgs) language.UpdateReposResult { - gen := make([]*rule.Rule, len(args.Imports)) - var eg errgroup.Group - for i := range args.Imports { - i := i - eg.Go(func() error { - arg := args.Imports[i] - modPath, query := arg, "latest" - if i := strings.IndexByte(arg, '@'); i >= 0 { - modPath, query = arg[:i], arg[i+1:] - } - name, version, sum, err := args.Cache.ModVersion(modPath, query) - if err != nil { - return err - } - gen[i] = rule.NewRule("go_repository", name) - gen[i].SetAttr("importpath", modPath) - gen[i].SetAttr("version", version) - gen[i].SetAttr("sum", sum) - setBuildAttrs(getGoConfig(args.Config), gen[i]) - return nil - }) - } - if err := eg.Wait(); err != nil { - return language.UpdateReposResult{Error: err} - } - return language.UpdateReposResult{Gen: gen} -} - -var repoImportFuncs = map[string]func(args language.ImportReposArgs) language.ImportReposResult{ - "Gopkg.lock": importReposFromDep, - "go.mod": importReposFromModules, - "Godeps.json": importReposFromGodep, -} - -func (*goLang) CanImport(path string) bool { - return repoImportFuncs[filepath.Base(path)] != nil -} - -func (*goLang) ImportRepos(args language.ImportReposArgs) language.ImportReposResult { - res := repoImportFuncs[filepath.Base(args.Path)](args) - for _, r := range res.Gen { - setBuildAttrs(getGoConfig(args.Config), r) - } - if args.Prune { - genNamesSet := make(map[string]bool) - for _, r := range res.Gen { - genNamesSet[r.Name()] = true - } - for _, r := range args.Config.Repos { - if name := r.Name(); r.Kind() == "go_repository" && !genNamesSet[name] { - res.Empty = append(res.Empty, rule.NewRule("go_repository", name)) - } - } - } - return res -} - -func setBuildAttrs(gc *goConfig, r *rule.Rule) { - if gc.buildExternalAttr != "" { - r.SetAttr("build_external", gc.buildExternalAttr) - } - if gc.buildFileNamesAttr != "" { - r.SetAttr("build_file_name", gc.buildFileNamesAttr) - } - if gc.buildFileGenerationAttr != "" { - r.SetAttr("build_file_generation", gc.buildFileGenerationAttr) - } - if gc.buildTagsAttr != "" { - r.SetAttr("build_tags", gc.buildTagsAttr) - } - if gc.buildFileProtoModeAttr != "" { - r.SetAttr("build_file_proto_mode", gc.buildFileProtoModeAttr) - } - if gc.buildExtraArgsAttr != "" { - extraArgs := strings.Split(gc.buildExtraArgsAttr, ",") - r.SetAttr("build_extra_args", extraArgs) - } -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/lang.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/lang.go deleted file mode 100644 index 5081dc1c55e..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/lang.go +++ /dev/null @@ -1,151 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 language provides an interface for language extensions in Gazelle. -// Support for a new language can be added by defining a package with a -// function named "New" that returns a value assignable to this interface. -// -// TODO(jayconrod): document how to incorporate languages into a gazelle -// binary that can be run by Bazel. -package language - -import ( - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/resolve" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -// Language describes an extension for Gazelle that provides support for -// a set of Bazel rules. -// -// Languages are used primarily by the fix and update commands. The order -// in which languages are used matters, since languages may depend on -// one another. For example, go depends on proto, since go_proto_libraries -// are generated from metadata stored in proto_libraries. -// -// A single instance of Language is created for each fix / update run. Some -// state may be stored in this instance, but stateless behavior is encouraged, -// especially since some operations may be concurrent in the future. -// -// Tasks languages are used for -// -// * Configuration (embedded interface config.Configurer). Languages may -// define command line flags and alter the configuration in a directory -// based on directives in build files. -// -// * Fixing deprecated usage of rules in build files. -// -// * Generating rules from source files in a directory. -// -// * Resolving library imports (embedded interface resolve.Resolver). For -// example, import strings like "github.com/foo/bar" in Go can be resolved -// into Bazel labels like "@com_github_foo_bar//:go_default_library". -// -// Tasks languages support -// -// * Generating load statements: languages list files and symbols that may -// be loaded. -// -// * Merging generated rules into existing rules: languages provide metadata -// that helps with rule matching, merging, and deletion. -type Language interface { - // TODO(jayconrod): is embedding Configurer strictly necessary? - config.Configurer - resolve.Resolver - - // Kinds returns a map of maps rule names (kinds) and information on how to - // match and merge attributes that may be found in rules of those kinds. All - // kinds of rules generated for this language may be found here. - Kinds() map[string]rule.KindInfo - - // Loads returns .bzl files and symbols they define. Every rule generated by - // GenerateRules, now or in the past, should be loadable from one of these - // files. - Loads() []rule.LoadInfo - - // GenerateRules extracts build metadata from source files in a directory. - // GenerateRules is called in each directory where an update is requested - // in depth-first post-order. - // - // args contains the arguments for GenerateRules. This is passed as a - // struct to avoid breaking implementations in the future when new - // fields are added. - // - // A GenerateResult struct is returned. Optional fields may be added to this - // type in the future. - // - // Any non-fatal errors this function encounters should be logged using - // log.Print. - GenerateRules(args GenerateArgs) GenerateResult - - // Fix repairs deprecated usage of language-specific rules in f. This is - // called before the file is indexed. Unless c.ShouldFix is true, fixes - // that delete or rename rules should not be performed. - Fix(c *config.Config, f *rule.File) -} - -// GenerateArgs contains arguments for language.GenerateRules. Arguments are -// passed in a struct value so that new fields may be added in the future -// without breaking existing implementations. -type GenerateArgs struct { - // Config is the configuration for the directory where rules are being - // generated. - Config *config.Config - - // Dir is the canonical absolute path to the directory. - Dir string - - // Rel is the slash-separated path to the directory, relative to the - // repository root ("" for the root directory itself). This may be used - // as the package name in labels. - Rel string - - // File is the build file for the directory. File is nil if there is - // no existing build file. - File *rule.File - - // Subdirs is a list of subdirectories in the directory, including - // symbolic links to directories that Gazelle will follow. - // RegularFiles is a list of regular files including other symbolic - // links. - // GeneratedFiles is a list of generated files in the directory - // (usually these are mentioned as "out" or "outs" attributes in rules). - Subdirs, RegularFiles, GenFiles []string - - // OtherEmpty is a list of empty rules generated by other languages. - // OtherGen is a list of generated rules generated by other languages. - OtherEmpty, OtherGen []*rule.Rule -} - -// GenerateResult contains return values for language.GenerateRules. -// Results are returned through a struct value so that new (optional) -// fields may be added without breaking existing implementations. -type GenerateResult struct { - // Gen is a list of rules generated from files found in the directory - // GenerateRules was asked to process. These will be merged with existing - // rules or added to the build file. - Gen []*rule.Rule - - // Empty is a list of rules that cannot be built with the files found in the - // directory GenerateRules was asked to process. These will be merged with - // existing rules. If ther merged rules are empty, they will be deleted. - Empty []*rule.Rule - - // Imports contains information about the imported libraries for each - // rule in Gen. Gen and Imports must have the same length, since they - // correspond. These values are passed to Resolve after merge. The type - // is opaque since different languages may use different representations. - Imports []interface{} -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/BUILD b/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/BUILD deleted file mode 100644 index e80ce75e9e5..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/BUILD +++ /dev/null @@ -1,42 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "config.go", - "constants.go", - "fileinfo.go", - "fix.go", - "generate.go", - "kinds.go", - "known_imports.go", - "lang.go", - "package.go", - "resolve.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/bazel-gazelle/language/proto", - importpath = "github.com/bazelbuild/bazel-gazelle/language/proto", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/bazelbuild/bazel-gazelle/config:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/label:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/language:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/repo:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/resolve:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/rule:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/config.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/config.go deleted file mode 100644 index 97c9b22803b..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/config.go +++ /dev/null @@ -1,284 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 proto - -import ( - "flag" - "fmt" - "log" - "path" - "strings" - - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -// ProtoConfig contains configuration values related to protos. -// -// This type is public because other languages need to generate rules based -// on protos, so this configuration may be relevant to them. -type ProtoConfig struct { - // Mode determines how rules are generated for protos. - Mode Mode - - // ModeExplicit indicates whether the proto mode was set explicitly. - ModeExplicit bool - - // GoPrefix is the current Go prefix (the Go extension may set this in the - // root directory only). Used to generate proto rule names in the root - // directory when there are no proto files or the proto package name - // can't be determined. - // TODO(jayconrod): deprecate and remove Go-specific behavior. - GoPrefix string - - // groupOption is an option name that Gazelle will use to group .proto - // files into proto_library rules. If unset, the proto package name is used. - groupOption string - - // stripImportPrefix The prefix to strip from the paths of the .proto files. - // If set, Gazelle will apply this value to the strip_import_prefix attribute - // within the proto_library_rule. - stripImportPrefix string - - // importPrefix The prefix to add to the paths of the .proto files. - // If set, Gazelle will apply this value to the import_prefix attribute - // within the proto_library_rule. - importPrefix string -} - -// GetProtoConfig returns the proto language configuration. If the proto -// extension was not run, it will return nil. -func GetProtoConfig(c *config.Config) *ProtoConfig { - pc := c.Exts[protoName] - if pc == nil { - return nil - } - return pc.(*ProtoConfig) -} - -// Mode determines how proto rules are generated. -type Mode int - -const ( - // DefaultMode generates proto_library rules. Other languages should generate - // library rules based on these (e.g., go_proto_library) and should ignore - // checked-in generated files (e.g., .pb.go files) when there is a .proto - // file with a similar name. - DefaultMode Mode = iota - - // DisableMode ignores .proto files and generates empty proto_library rules. - // Checked-in generated files (e.g., .pb.go files) should be treated as - // normal sources. - DisableMode - - // DisableGlobalMode is similar to DisableMode, but it also prevents - // the use of special cases in dependency resolution for well known types - // and Google APIs. - DisableGlobalMode - - // LegacyMode generates filegroups for .proto files if .pb.go files are - // present in the same directory. - LegacyMode - - // PackageMode generates a proto_library for each set of .proto files with - // the same package name in each directory. - PackageMode -) - -func ModeFromString(s string) (Mode, error) { - switch s { - case "default": - return DefaultMode, nil - case "disable": - return DisableMode, nil - case "disable_global": - return DisableGlobalMode, nil - case "legacy": - return LegacyMode, nil - case "package": - return PackageMode, nil - default: - return 0, fmt.Errorf("unrecognized proto mode: %q", s) - } -} - -func (m Mode) String() string { - switch m { - case DefaultMode: - return "default" - case DisableMode: - return "disable" - case DisableGlobalMode: - return "disable_global" - case LegacyMode: - return "legacy" - case PackageMode: - return "package" - default: - log.Panicf("unknown mode %d", m) - return "" - } -} - -func (m Mode) ShouldGenerateRules() bool { - switch m { - case DisableMode, DisableGlobalMode, LegacyMode: - return false - default: - return true - } -} - -func (m Mode) ShouldIncludePregeneratedFiles() bool { - switch m { - case DisableMode, DisableGlobalMode, LegacyMode: - return true - default: - return false - } -} - -func (m Mode) ShouldUseKnownImports() bool { - return m != DisableGlobalMode -} - -type modeFlag struct { - mode *Mode -} - -func (f *modeFlag) Set(value string) error { - if mode, err := ModeFromString(value); err != nil { - return err - } else { - *f.mode = mode - return nil - } -} - -func (f *modeFlag) String() string { - var mode Mode - if f != nil && f.mode != nil { - mode = *f.mode - } - return mode.String() -} - -func (_ *protoLang) RegisterFlags(fs *flag.FlagSet, cmd string, c *config.Config) { - pc := &ProtoConfig{} - c.Exts[protoName] = pc - - // Note: the -proto flag does not set the ModeExplicit flag. We want to - // be able to switch to DisableMode in vendor directories, even when - // this is set for compatibility with older versions. - fs.Var(&modeFlag{&pc.Mode}, "proto", "default: generates a proto_library rule for one package\n\tpackage: generates a proto_library rule for for each package\n\tdisable: does not touch proto rules\n\tdisable_global: does not touch proto rules and does not use special cases for protos in dependency resolution") - fs.StringVar(&pc.groupOption, "proto_group", "", "option name used to group .proto files into proto_library rules") - fs.StringVar(&pc.importPrefix, "proto_import_prefix", "", "When set, .proto source files in the srcs attribute of the rule are accessible at their path with this prefix appended on.") -} - -func (_ *protoLang) CheckFlags(fs *flag.FlagSet, c *config.Config) error { - return nil -} - -func (_ *protoLang) KnownDirectives() []string { - return []string{"proto", "proto_group", "proto_strip_import_prefix", "proto_import_prefix"} -} - -func (_ *protoLang) Configure(c *config.Config, rel string, f *rule.File) { - pc := &ProtoConfig{} - *pc = *GetProtoConfig(c) - c.Exts[protoName] = pc - if f != nil { - for _, d := range f.Directives { - switch d.Key { - case "proto": - mode, err := ModeFromString(d.Value) - if err != nil { - log.Print(err) - continue - } - pc.Mode = mode - pc.ModeExplicit = true - case "proto_group": - pc.groupOption = d.Value - case "proto_strip_import_prefix": - pc.stripImportPrefix = d.Value - if rel != "" { - if err := checkStripImportPrefix(pc.stripImportPrefix, rel); err != nil { - log.Print(err) - } - } - case "proto_import_prefix": - pc.importPrefix = d.Value - } - } - } - inferProtoMode(c, rel, f) -} - -// inferProtoMode sets ProtoConfig.Mode based on the directory name and the -// contents of f. If the proto mode is set explicitly, this function does not -// change it. If this is a vendor directory, or go_proto_library is loaded from -// another file, proto rule generation is disabled. -// -// TODO(jayconrod): this logic is archaic, now that rules are generated by -// separate language extensions. Proto rule generation should be independent -// from Go. -func inferProtoMode(c *config.Config, rel string, f *rule.File) { - pc := GetProtoConfig(c) - if pc.Mode != DefaultMode || pc.ModeExplicit { - return - } - if pc.GoPrefix == wellKnownTypesGoPrefix { - pc.Mode = LegacyMode - return - } - if path.Base(rel) == "vendor" { - pc.Mode = DisableMode - return - } - if f == nil { - return - } - mode := DefaultMode -outer: - for _, l := range f.Loads { - name := l.Name() - if name == "@io_bazel_rules_go//proto:def.bzl" { - break - } - if name == "@io_bazel_rules_go//proto:go_proto_library.bzl" { - mode = LegacyMode - break - } - for _, sym := range l.Symbols() { - if sym == "go_proto_library" { - mode = DisableMode - break outer - } - } - } - if mode == DefaultMode || pc.Mode == mode || c.ShouldFix && mode == LegacyMode { - return - } - pc.Mode = mode -} - -func checkStripImportPrefix(prefix, rel string) error { - if !strings.HasPrefix(prefix, "/") || !strings.HasPrefix(rel, prefix[1:]) { - return fmt.Errorf("invalid proto_strip_import_prefix %q at %s", prefix, rel) - } - return nil -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/constants.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/constants.go deleted file mode 100644 index be6bb4c8d60..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/constants.go +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 proto - -const ( - // PackageInfoKey is the name of a private attribute set on generated - // proto_library rules. This attribute contains a Package record which - // describes the library and its sources. - PackageKey = "_package" - - // wellKnownTypesGoPrefix is the import path for the Go repository containing - // pre-generated code for the Well Known Types. - wellKnownTypesGoPrefix = "github.com/golang/protobuf" -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/fileinfo.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/fileinfo.go deleted file mode 100644 index 640fdb6c087..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/fileinfo.go +++ /dev/null @@ -1,138 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 proto - -import ( - "bytes" - "io/ioutil" - "log" - "path/filepath" - "regexp" - "sort" - "strconv" - "strings" -) - -// FileInfo contains metadata extracted from a .proto file. -type FileInfo struct { - Path, Name string - - PackageName string - - Options []Option - Imports []string - - HasServices bool -} - -// Option represents a top-level option statement in a .proto file. Only -// string options are supported for now. -type Option struct { - Key, Value string -} - -var protoRe = buildProtoRegexp() - -func protoFileInfo(dir, name string) FileInfo { - info := FileInfo{ - Path: filepath.Join(dir, name), - Name: name, - } - content, err := ioutil.ReadFile(info.Path) - if err != nil { - log.Printf("%s: error reading proto file: %v", info.Path, err) - return info - } - - for _, match := range protoRe.FindAllSubmatch(content, -1) { - switch { - case match[importSubexpIndex] != nil: - imp := unquoteProtoString(match[importSubexpIndex]) - info.Imports = append(info.Imports, imp) - - case match[packageSubexpIndex] != nil: - pkg := string(match[packageSubexpIndex]) - if info.PackageName == "" { - info.PackageName = pkg - } - - case match[optkeySubexpIndex] != nil: - key := string(match[optkeySubexpIndex]) - value := unquoteProtoString(match[optvalSubexpIndex]) - info.Options = append(info.Options, Option{key, value}) - - case match[serviceSubexpIndex] != nil: - info.HasServices = true - - default: - // Comment matched. Nothing to extract. - } - } - sort.Strings(info.Imports) - - return info -} - -const ( - importSubexpIndex = 1 - packageSubexpIndex = 2 - optkeySubexpIndex = 3 - optvalSubexpIndex = 4 - serviceSubexpIndex = 5 -) - -// Based on https://developers.google.com/protocol-buffers/docs/reference/proto3-spec -func buildProtoRegexp() *regexp.Regexp { - hexEscape := `\\[xX][0-9a-fA-f]{2}` - octEscape := `\\[0-7]{3}` - charEscape := `\\[abfnrtv'"\\]` - charValue := strings.Join([]string{hexEscape, octEscape, charEscape, "[^\x00\\'\\\"\\\\]"}, "|") - strLit := `'(?:` + charValue + `|")*'|"(?:` + charValue + `|')*"` - ident := `[A-Za-z][A-Za-z0-9_]*` - fullIdent := ident + `(?:\.` + ident + `)*` - importStmt := `\bimport\s*(?:public|weak)?\s*(?P` + strLit + `)\s*;` - packageStmt := `\bpackage\s*(?P` + fullIdent + `)\s*;` - optionStmt := `\boption\s*(?P` + fullIdent + `)\s*=\s*(?P` + strLit + `)\s*;` - serviceStmt := `(?Pservice)` - comment := `//[^\n]*` - protoReSrc := strings.Join([]string{importStmt, packageStmt, optionStmt, serviceStmt, comment}, "|") - return regexp.MustCompile(protoReSrc) -} - -func unquoteProtoString(q []byte) string { - // Adjust quotes so that Unquote is happy. We need a double quoted string - // without unescaped double quote characters inside. - noQuotes := bytes.Split(q[1:len(q)-1], []byte{'"'}) - if len(noQuotes) != 1 { - for i := 0; i < len(noQuotes)-1; i++ { - if len(noQuotes[i]) == 0 || noQuotes[i][len(noQuotes[i])-1] != '\\' { - noQuotes[i] = append(noQuotes[i], '\\') - } - } - q = append([]byte{'"'}, bytes.Join(noQuotes, []byte{'"'})...) - q = append(q, '"') - } - if q[0] == '\'' { - q[0] = '"' - q[len(q)-1] = '"' - } - - s, err := strconv.Unquote(string(q)) - if err != nil { - log.Panicf("unquoting string literal %s from proto: %v", q, err) - } - return s -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/fix.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/fix.go deleted file mode 100644 index c8e67bf8fb5..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/fix.go +++ /dev/null @@ -1,24 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 proto - -import ( - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -func (_ *protoLang) Fix(c *config.Config, f *rule.File) { -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/generate.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/generate.go deleted file mode 100644 index e9c1b00c3bc..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/generate.go +++ /dev/null @@ -1,265 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 proto - -import ( - "fmt" - "log" - "sort" - "strings" - - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/language" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -func (_ *protoLang) GenerateRules(args language.GenerateArgs) language.GenerateResult { - c := args.Config - pc := GetProtoConfig(c) - if !pc.Mode.ShouldGenerateRules() { - // Don't create or delete proto rules in this mode. Any existing rules - // are likely hand-written. - return language.GenerateResult{} - } - - var regularProtoFiles []string - for _, name := range args.RegularFiles { - if strings.HasSuffix(name, ".proto") { - regularProtoFiles = append(regularProtoFiles, name) - } - } - var genProtoFiles []string - for _, name := range args.GenFiles { - if strings.HasSuffix(name, ".proto") { - genProtoFiles = append(genProtoFiles, name) - } - } - pkgs := buildPackages(pc, args.Dir, args.Rel, regularProtoFiles, genProtoFiles) - shouldSetVisibility := args.File == nil || !args.File.HasDefaultVisibility() - var res language.GenerateResult - for _, pkg := range pkgs { - r := generateProto(pc, args.Rel, pkg, shouldSetVisibility) - if r.IsEmpty(protoKinds[r.Kind()]) { - res.Empty = append(res.Empty, r) - } else { - res.Gen = append(res.Gen, r) - } - } - sort.SliceStable(res.Gen, func(i, j int) bool { - return res.Gen[i].Name() < res.Gen[j].Name() - }) - res.Imports = make([]interface{}, len(res.Gen)) - for i, r := range res.Gen { - res.Imports[i] = r.PrivateAttr(config.GazelleImportsKey) - } - res.Empty = append(res.Empty, generateEmpty(args.File, regularProtoFiles, genProtoFiles)...) - return res -} - -// RuleName returns a name for a proto_library derived from the given strings. -// For each string, RuleName will look for a non-empty suffix of identifier -// characters and then append "_proto" to that. -func RuleName(names ...string) string { - base := "root" - for _, name := range names { - notIdent := func(c rune) bool { - return !('A' <= c && c <= 'Z' || - 'a' <= c && c <= 'z' || - '0' <= c && c <= '9' || - c == '_') - } - if i := strings.LastIndexFunc(name, notIdent); i >= 0 { - name = name[i+1:] - } - if name != "" { - base = name - break - } - } - return base + "_proto" -} - -// buildPackage extracts metadata from the .proto files in a directory and -// constructs possibly several packages, then selects a package to generate -// a proto_library rule for. -func buildPackages(pc *ProtoConfig, dir, rel string, protoFiles, genFiles []string) []*Package { - packageMap := make(map[string]*Package) - for _, name := range protoFiles { - info := protoFileInfo(dir, name) - key := info.PackageName - if pc.groupOption != "" { - for _, opt := range info.Options { - if opt.Key == pc.groupOption { - key = opt.Value - break - } - } - } - if packageMap[key] == nil { - packageMap[key] = newPackage(info.PackageName) - } - packageMap[key].addFile(info) - } - - switch pc.Mode { - case DefaultMode: - pkg, err := selectPackage(dir, rel, packageMap) - if err != nil { - log.Print(err) - } - if pkg == nil { - return nil // empty rule created in generateEmpty - } - for _, name := range genFiles { - pkg.addGenFile(dir, name) - } - return []*Package{pkg} - - case PackageMode: - pkgs := make([]*Package, 0, len(packageMap)) - for _, pkg := range packageMap { - pkgs = append(pkgs, pkg) - } - return pkgs - - default: - return nil - } -} - -// selectPackage chooses a package to generate rules for. -func selectPackage(dir, rel string, packageMap map[string]*Package) (*Package, error) { - if len(packageMap) == 0 { - return nil, nil - } - if len(packageMap) == 1 { - for _, pkg := range packageMap { - return pkg, nil - } - } - defaultPackageName := strings.Replace(rel, "/", "_", -1) - for _, pkg := range packageMap { - if pkgName := goPackageName(pkg); pkgName != "" && pkgName == defaultPackageName { - return pkg, nil - } - } - return nil, fmt.Errorf("%s: directory contains multiple proto packages. Gazelle can only generate a proto_library for one package.", dir) -} - -// goPackageName guesses the identifier in package declarations at the top of -// the .pb.go files that will be generated for this package. "" is returned -// if the package name cannot be determined. -// -// TODO(jayconrod): remove all Go-specific functionality. This is here -// temporarily for compatibility. -func goPackageName(pkg *Package) string { - if opt, ok := pkg.Options["go_package"]; ok { - if i := strings.IndexByte(opt, ';'); i >= 0 { - return opt[i+1:] - } else if i := strings.LastIndexByte(opt, '/'); i >= 0 { - return opt[i+1:] - } else { - return opt - } - } - if pkg.Name != "" { - return strings.Replace(pkg.Name, ".", "_", -1) - } - if len(pkg.Files) == 1 { - for s := range pkg.Files { - return strings.TrimSuffix(s, ".proto") - } - } - return "" -} - -// generateProto creates a new proto_library rule for a package. The rule may -// be empty if there are no sources. -func generateProto(pc *ProtoConfig, rel string, pkg *Package, shouldSetVisibility bool) *rule.Rule { - var name string - if pc.Mode == DefaultMode { - name = RuleName(goPackageName(pkg), pc.GoPrefix, rel) - } else { - name = RuleName(pkg.Options[pc.groupOption], pkg.Name, rel) - } - r := rule.NewRule("proto_library", name) - srcs := make([]string, 0, len(pkg.Files)) - for f := range pkg.Files { - srcs = append(srcs, f) - } - sort.Strings(srcs) - if len(srcs) > 0 { - r.SetAttr("srcs", srcs) - } - r.SetPrivateAttr(PackageKey, *pkg) - imports := make([]string, 0, len(pkg.Imports)) - for i := range pkg.Imports { - imports = append(imports, i) - } - sort.Strings(imports) - // NOTE: This attribute should not be used outside this extension. It's still - // convenient for testing though. - r.SetPrivateAttr(config.GazelleImportsKey, imports) - for k, v := range pkg.Options { - r.SetPrivateAttr(k, v) - } - if shouldSetVisibility { - vis := rule.CheckInternalVisibility(rel, "//visibility:public") - r.SetAttr("visibility", []string{vis}) - } - if pc.stripImportPrefix != "" { - r.SetAttr("strip_import_prefix", pc.stripImportPrefix) - } - if pc.importPrefix != "" { - r.SetAttr("import_prefix", pc.importPrefix) - } - return r -} - -// generateEmpty generates a list of proto_library rules that may be deleted. -// This is generated from existing proto_library rules with srcs lists that -// don't match any static or generated files. -func generateEmpty(f *rule.File, regularFiles, genFiles []string) []*rule.Rule { - if f == nil { - return nil - } - knownFiles := make(map[string]bool) - for _, f := range regularFiles { - knownFiles[f] = true - } - for _, f := range genFiles { - knownFiles[f] = true - } - var empty []*rule.Rule -outer: - for _, r := range f.Rules { - if r.Kind() != "proto_library" { - continue - } - srcs := r.AttrStrings("srcs") - if len(srcs) == 0 && r.Attr("srcs") != nil { - // srcs is not a string list; leave it alone - continue - } - for _, src := range r.AttrStrings("srcs") { - if knownFiles[src] { - continue outer - } - } - empty = append(empty, rule.NewRule("proto_library", r.Name())) - } - return empty -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/kinds.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/kinds.go deleted file mode 100644 index 902cd6ac03f..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/kinds.go +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 proto - -import "github.com/bazelbuild/bazel-gazelle/rule" - -var protoKinds = map[string]rule.KindInfo{ - "proto_library": { - NonEmptyAttrs: map[string]bool{"srcs": true}, - MergeableAttrs: map[string]bool{ - "srcs": true, - }, - ResolveAttrs: map[string]bool{"deps": true}, - }, -} - -func (_ *protoLang) Kinds() map[string]rule.KindInfo { return protoKinds } -func (_ *protoLang) Loads() []rule.LoadInfo { return nil } diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/known_imports.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/known_imports.go deleted file mode 100644 index 6335e0db538..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/known_imports.go +++ /dev/null @@ -1,1614 +0,0 @@ -// Generated by language/proto/gen/gen_known_imports.go -// From proto.csv - -package proto - -import "github.com/bazelbuild/bazel-gazelle/label" - -var knownImports = map[string]label.Label{ - - "google/protobuf/any.proto": label.New("com_google_protobuf", "", "any_proto"), - "google/protobuf/api.proto": label.New("com_google_protobuf", "", "api_proto"), - "google/protobuf/compiler/plugin.proto": label.New("com_google_protobuf", "", "compiler_plugin_proto"), - "google/protobuf/descriptor.proto": label.New("com_google_protobuf", "", "descriptor_proto"), - "google/protobuf/duration.proto": label.New("com_google_protobuf", "", "duration_proto"), - "google/protobuf/empty.proto": label.New("com_google_protobuf", "", "empty_proto"), - "google/protobuf/field_mask.proto": label.New("com_google_protobuf", "", "field_mask_proto"), - "google/protobuf/source_context.proto": label.New("com_google_protobuf", "", "source_context_proto"), - "google/protobuf/struct.proto": label.New("com_google_protobuf", "", "struct_proto"), - "google/protobuf/timestamp.proto": label.New("com_google_protobuf", "", "timestamp_proto"), - "google/protobuf/type.proto": label.New("com_google_protobuf", "", "type_proto"), - "google/protobuf/wrappers.proto": label.New("com_google_protobuf", "", "wrappers_proto"), - "google/ads/googleads/v1/common/ad_asset.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/ad_type_infos.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/asset_types.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/bidding.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/click_location.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/criteria.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/criterion_category_availability.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/custom_parameter.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/dates.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/explorer_auto_optimizer_setting.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/extensions.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/feed_common.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/final_app_url.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/frequency_cap.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/keyword_plan_common.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/matching_function.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/metrics.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/policy.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/real_time_bidding_setting.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/segments.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/simulation.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/tag_snippet.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/targeting_setting.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/text_label.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/url_collection.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/user_lists.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/common/value.proto": label.New("go_googleapis", "google/ads/googleads/v1/common", "common_proto"), - "google/ads/googleads/v1/enums/access_reason.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/account_budget_proposal_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/account_budget_proposal_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/account_budget_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/ad_customizer_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/ad_group_ad_rotation_mode.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/ad_group_ad_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/ad_group_criterion_approval_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/ad_group_criterion_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/ad_group_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/ad_group_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/ad_network_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/ad_serving_optimization_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/ad_strength.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/ad_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/advertising_channel_sub_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/advertising_channel_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/affiliate_location_feed_relationship_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/affiliate_location_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/age_range_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/app_campaign_app_store.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/app_campaign_bidding_strategy_goal_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/app_payment_model_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/app_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/app_store.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/app_url_operating_system_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/asset_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/attribution_model.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/bid_modifier_source.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/bidding_source.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/bidding_strategy_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/bidding_strategy_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/billing_setup_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/brand_safety_suitability.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/budget_delivery_method.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/budget_period.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/budget_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/budget_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/call_conversion_reporting_state.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/call_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/callout_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/campaign_criterion_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/campaign_draft_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/campaign_experiment_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/campaign_experiment_traffic_split_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/campaign_experiment_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/campaign_serving_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/campaign_shared_set_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/campaign_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/change_status_operation.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/change_status_resource_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/click_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/content_label_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/conversion_action_category.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/conversion_action_counting_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/conversion_action_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/conversion_action_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/conversion_adjustment_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/conversion_attribution_event_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/conversion_lag_bucket.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/conversion_or_adjustment_lag_bucket.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/criterion_category_channel_availability_mode.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/criterion_category_locale_availability_mode.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/criterion_system_serving_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/criterion_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/custom_interest_member_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/custom_interest_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/custom_interest_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/custom_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/customer_match_upload_key_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/customer_pay_per_conversion_eligibility_failure_reason.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/data_driven_model_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/day_of_week.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/device.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/display_ad_format_setting.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/display_upload_product_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/dsa_page_feed_criterion_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/education_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/extension_setting_device.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/extension_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/external_conversion_source.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/feed_attribute_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/feed_item_quality_approval_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/feed_item_quality_disapproval_reason.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/feed_item_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/feed_item_target_device.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/feed_item_target_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/feed_item_validation_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/feed_link_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/feed_mapping_criterion_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/feed_mapping_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/feed_origin.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/feed_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/flight_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/frequency_cap_event_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/frequency_cap_level.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/frequency_cap_time_unit.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/gender_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/geo_target_constant_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/geo_targeting_restriction.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/geo_targeting_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/google_ads_field_category.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/google_ads_field_data_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/hotel_date_selection_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/hotel_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/hotel_rate_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/income_range_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/interaction_event_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/interaction_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/job_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/keyword_match_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/keyword_plan_competition_level.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/keyword_plan_forecast_interval.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/keyword_plan_network.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/label_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/legacy_app_install_ad_app_store.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/listing_custom_attribute_index.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/listing_group_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/local_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/location_extension_targeting_criterion_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/location_group_radius_units.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/location_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/manager_link_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/matching_function_context_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/matching_function_operator.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/media_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/merchant_center_link_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/message_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/mime_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/minute_of_hour.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/mobile_device_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/month_of_year.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/mutate_job_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/negative_geo_target_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/operating_system_version_operator_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/page_one_promoted_strategy_goal.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/parental_status_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/payment_mode.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/placeholder_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/placement_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/policy_approval_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/policy_review_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/policy_topic_entry_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/policy_topic_evidence_destination_mismatch_url_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/policy_topic_evidence_destination_not_working_device.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/positive_geo_target_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/preferred_content_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/price_extension_price_qualifier.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/price_extension_price_unit.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/price_extension_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/price_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/product_bidding_category_level.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/product_bidding_category_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/product_channel.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/product_channel_exclusivity.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/product_condition.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/product_type_level.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/promotion_extension_discount_modifier.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/promotion_extension_occasion.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/promotion_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/proximity_radius_units.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/quality_score_bucket.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/real_estate_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/recommendation_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/search_engine_results_page_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/search_term_match_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/search_term_targeting_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/served_asset_field_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/shared_set_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/shared_set_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/simulation_modification_method.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/simulation_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/sitelink_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/slot.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/spending_limit_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/structured_snippet_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/system_managed_entity_source.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/target_cpa_opt_in_recommendation_goal.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/target_impression_share_location.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/targeting_dimension.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/time_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/tracking_code_page_format.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/tracking_code_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/travel_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/user_interest_taxonomy_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/user_list_access_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/user_list_closing_reason.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/user_list_combined_rule_operator.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/user_list_crm_data_source_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/user_list_date_rule_item_operator.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/user_list_logical_rule_operator.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/user_list_membership_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/user_list_number_rule_item_operator.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/user_list_prepopulation_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/user_list_rule_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/user_list_size_range.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/user_list_string_rule_item_operator.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/user_list_type.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/vanity_pharma_display_url_mode.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/vanity_pharma_text.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/webpage_condition_operand.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/enums/webpage_condition_operator.proto": label.New("go_googleapis", "google/ads/googleads/v1/enums", "enums_proto"), - "google/ads/googleads/v1/errors/account_budget_proposal_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/ad_customizer_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/ad_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/ad_group_ad_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/ad_group_bid_modifier_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/ad_group_criterion_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/ad_group_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/ad_group_feed_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/ad_parameter_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/ad_sharing_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/adx_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/asset_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/authentication_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/authorization_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/bidding_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/bidding_strategy_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/billing_setup_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/campaign_budget_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/campaign_criterion_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/campaign_draft_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/campaign_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/campaign_experiment_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/campaign_feed_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/campaign_shared_set_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/change_status_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/collection_size_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/context_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/conversion_action_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/conversion_adjustment_upload_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/conversion_upload_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/country_code_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/criterion_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/custom_interest_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/customer_client_link_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/customer_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/customer_feed_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/customer_manager_link_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/database_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/date_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/date_range_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/distinct_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/enum_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/errors.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/extension_feed_item_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/extension_setting_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/feed_attribute_reference_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/feed_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/feed_item_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/feed_item_target_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/feed_item_validation_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/feed_mapping_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/field_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/field_mask_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/function_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/function_parsing_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/geo_target_constant_suggestion_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/header_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/id_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/image_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/internal_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/keyword_plan_ad_group_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/keyword_plan_campaign_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/keyword_plan_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/keyword_plan_idea_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/keyword_plan_keyword_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/keyword_plan_negative_keyword_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/label_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/language_code_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/list_operation_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/manager_link_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/media_bundle_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/media_file_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/media_upload_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/multiplier_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/mutate_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/mutate_job_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/new_resource_creation_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/not_empty_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/not_whitelisted_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/null_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/operation_access_denied_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/operator_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/partial_failure_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/policy_finding_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/policy_validation_parameter_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/policy_violation_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/query_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/quota_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/range_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/recommendation_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/region_code_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/request_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/resource_access_denied_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/resource_count_limit_exceeded_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/setting_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/shared_criterion_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/shared_set_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/size_limit_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/string_format_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/string_length_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/url_field_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/user_list_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/errors/youtube_video_registration_error.proto": label.New("go_googleapis", "google/ads/googleads/v1/errors", "errors_proto"), - "google/ads/googleads/v1/resources/account_budget.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/account_budget_proposal.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/ad.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/ad_group.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/ad_group_ad.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/ad_group_ad_label.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/ad_group_audience_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/ad_group_bid_modifier.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/ad_group_criterion.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/ad_group_criterion_label.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/ad_group_criterion_simulation.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/ad_group_extension_setting.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/ad_group_feed.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/ad_group_label.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/ad_group_simulation.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/ad_parameter.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/ad_schedule_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/age_range_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/asset.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/bidding_strategy.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/billing_setup.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/campaign.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/campaign_audience_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/campaign_bid_modifier.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/campaign_budget.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/campaign_criterion.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/campaign_criterion_simulation.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/campaign_draft.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/campaign_experiment.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/campaign_extension_setting.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/campaign_feed.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/campaign_label.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/campaign_shared_set.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/carrier_constant.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/change_status.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/click_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/conversion_action.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/custom_interest.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/customer.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/customer_client.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/customer_client_link.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/customer_extension_setting.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/customer_feed.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/customer_label.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/customer_manager_link.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/customer_negative_criterion.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/detail_placement_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/display_keyword_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/domain_category.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/dynamic_search_ads_search_term_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/expanded_landing_page_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/extension_feed_item.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/feed.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/feed_item.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/feed_item_target.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/feed_mapping.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/feed_placeholder_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/gender_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/geo_target_constant.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/geographic_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/google_ads_field.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/group_placement_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/hotel_group_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/hotel_performance_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/keyword_plan.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/keyword_plan_ad_group.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/keyword_plan_campaign.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/keyword_plan_keyword.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/keyword_plan_negative_keyword.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/keyword_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/label.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/landing_page_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/language_constant.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/location_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/managed_placement_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/media_file.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/merchant_center_link.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/mobile_app_category_constant.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/mobile_device_constant.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/mutate_job.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/operating_system_version_constant.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/paid_organic_search_term_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/parental_status_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/payments_account.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/product_bidding_category_constant.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/product_group_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/recommendation.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/remarketing_action.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/search_term_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/shared_criterion.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/shared_set.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/shopping_performance_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/topic_constant.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/topic_view.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/user_interest.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/user_list.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/resources/video.proto": label.New("go_googleapis", "google/ads/googleads/v1/resources", "resources_proto"), - "google/ads/googleads/v1/services/account_budget_proposal_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/account_budget_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/ad_group_ad_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/ad_group_ad_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/ad_group_audience_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/ad_group_bid_modifier_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/ad_group_criterion_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/ad_group_criterion_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/ad_group_criterion_simulation_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/ad_group_extension_setting_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/ad_group_feed_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/ad_group_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/ad_group_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/ad_group_simulation_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/ad_parameter_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/ad_schedule_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/age_range_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/asset_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/bidding_strategy_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/billing_setup_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/campaign_audience_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/campaign_bid_modifier_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/campaign_budget_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/campaign_criterion_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/campaign_criterion_simulation_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/campaign_draft_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/campaign_experiment_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/campaign_extension_setting_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/campaign_feed_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/campaign_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/campaign_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/campaign_shared_set_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/carrier_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/change_status_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/click_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/conversion_action_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/conversion_adjustment_upload_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/conversion_upload_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/custom_interest_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/customer_client_link_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/customer_client_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/customer_extension_setting_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/customer_feed_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/customer_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/customer_manager_link_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/customer_negative_criterion_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/customer_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/detail_placement_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/display_keyword_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/domain_category_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/dynamic_search_ads_search_term_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/expanded_landing_page_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/extension_feed_item_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/feed_item_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/feed_item_target_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/feed_mapping_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/feed_placeholder_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/feed_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/gender_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/geo_target_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/geographic_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/google_ads_field_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/google_ads_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/group_placement_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/hotel_group_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/hotel_performance_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/keyword_plan_ad_group_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/keyword_plan_campaign_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/keyword_plan_idea_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/keyword_plan_keyword_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/keyword_plan_negative_keyword_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/keyword_plan_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/keyword_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/label_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/landing_page_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/language_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/location_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/managed_placement_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/media_file_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/merchant_center_link_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/mobile_app_category_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/mobile_device_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/mutate_job_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/operating_system_version_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/paid_organic_search_term_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/parental_status_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/payments_account_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/product_bidding_category_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/product_group_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/recommendation_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/remarketing_action_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/search_term_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/shared_criterion_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/shared_set_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/shopping_performance_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/topic_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/topic_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/user_interest_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/user_list_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v1/services/video_service.proto": label.New("go_googleapis", "google/ads/googleads/v1/services", "services_proto"), - "google/ads/googleads/v2/common/ad_asset.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/ad_type_infos.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/asset_types.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/bidding.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/click_location.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/criteria.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/criterion_category_availability.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/custom_parameter.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/dates.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/explorer_auto_optimizer_setting.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/extensions.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/feed_common.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/final_app_url.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/frequency_cap.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/keyword_plan_common.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/matching_function.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/metrics.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/policy.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/real_time_bidding_setting.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/segments.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/simulation.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/tag_snippet.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/targeting_setting.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/text_label.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/url_collection.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/user_lists.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/common/value.proto": label.New("go_googleapis", "google/ads/googleads/v2/common", "common_proto"), - "google/ads/googleads/v2/enums/access_reason.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/access_role.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/account_budget_proposal_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/account_budget_proposal_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/account_budget_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/ad_customizer_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/ad_group_ad_rotation_mode.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/ad_group_ad_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/ad_group_criterion_approval_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/ad_group_criterion_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/ad_group_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/ad_group_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/ad_network_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/ad_serving_optimization_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/ad_strength.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/ad_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/advertising_channel_sub_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/advertising_channel_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/affiliate_location_feed_relationship_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/affiliate_location_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/age_range_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/app_campaign_app_store.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/app_campaign_bidding_strategy_goal_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/app_payment_model_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/app_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/app_store.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/app_url_operating_system_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/asset_field_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/asset_performance_label.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/asset_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/attribution_model.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/bid_modifier_source.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/bidding_source.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/bidding_strategy_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/bidding_strategy_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/billing_setup_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/brand_safety_suitability.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/budget_delivery_method.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/budget_period.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/budget_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/budget_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/call_conversion_reporting_state.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/call_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/callout_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/campaign_criterion_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/campaign_draft_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/campaign_experiment_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/campaign_experiment_traffic_split_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/campaign_experiment_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/campaign_serving_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/campaign_shared_set_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/campaign_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/change_status_operation.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/change_status_resource_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/click_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/content_label_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/conversion_action_category.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/conversion_action_counting_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/conversion_action_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/conversion_action_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/conversion_adjustment_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/conversion_attribution_event_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/conversion_lag_bucket.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/conversion_or_adjustment_lag_bucket.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/criterion_category_channel_availability_mode.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/criterion_category_locale_availability_mode.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/criterion_system_serving_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/criterion_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/custom_interest_member_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/custom_interest_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/custom_interest_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/custom_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/customer_match_upload_key_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/customer_pay_per_conversion_eligibility_failure_reason.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/data_driven_model_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/day_of_week.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/device.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/display_ad_format_setting.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/display_upload_product_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/distance_bucket.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/dsa_page_feed_criterion_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/education_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/extension_setting_device.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/extension_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/external_conversion_source.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/feed_attribute_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/feed_item_quality_approval_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/feed_item_quality_disapproval_reason.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/feed_item_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/feed_item_target_device.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/feed_item_target_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/feed_item_validation_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/feed_link_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/feed_mapping_criterion_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/feed_mapping_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/feed_origin.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/feed_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/flight_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/frequency_cap_event_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/frequency_cap_level.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/frequency_cap_time_unit.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/gender_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/geo_target_constant_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/geo_targeting_restriction.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/geo_targeting_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/google_ads_field_category.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/google_ads_field_data_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/hotel_date_selection_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/hotel_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/hotel_price_bucket.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/hotel_rate_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/income_range_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/interaction_event_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/interaction_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/invoice_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/job_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/keyword_match_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/keyword_plan_competition_level.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/keyword_plan_forecast_interval.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/keyword_plan_network.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/label_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/legacy_app_install_ad_app_store.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/listing_custom_attribute_index.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/listing_group_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/local_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/location_extension_targeting_criterion_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/location_group_radius_units.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/location_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/manager_link_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/matching_function_context_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/matching_function_operator.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/media_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/merchant_center_link_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/message_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/mime_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/minute_of_hour.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/mobile_device_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/month_of_year.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/mutate_job_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/negative_geo_target_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/operating_system_version_operator_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/page_one_promoted_strategy_goal.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/parental_status_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/payment_mode.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/placeholder_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/placement_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/policy_approval_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/policy_review_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/policy_topic_entry_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/policy_topic_evidence_destination_mismatch_url_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/policy_topic_evidence_destination_not_working_device.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/policy_topic_evidence_destination_not_working_dns_error_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/positive_geo_target_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/preferred_content_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/price_extension_price_qualifier.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/price_extension_price_unit.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/price_extension_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/price_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/product_bidding_category_level.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/product_bidding_category_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/product_channel.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/product_channel_exclusivity.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/product_condition.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/product_type_level.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/promotion_extension_discount_modifier.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/promotion_extension_occasion.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/promotion_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/proximity_radius_units.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/quality_score_bucket.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/reach_plan_ad_length.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/reach_plan_age_range.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/real_estate_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/recommendation_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/search_engine_results_page_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/search_term_match_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/search_term_targeting_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/served_asset_field_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/shared_set_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/shared_set_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/simulation_modification_method.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/simulation_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/sitelink_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/slot.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/spending_limit_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/structured_snippet_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/system_managed_entity_source.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/target_cpa_opt_in_recommendation_goal.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/target_impression_share_location.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/targeting_dimension.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/time_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/tracking_code_page_format.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/tracking_code_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/travel_placeholder_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/user_interest_taxonomy_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/user_list_access_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/user_list_closing_reason.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/user_list_combined_rule_operator.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/user_list_crm_data_source_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/user_list_date_rule_item_operator.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/user_list_logical_rule_operator.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/user_list_membership_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/user_list_number_rule_item_operator.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/user_list_prepopulation_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/user_list_rule_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/user_list_size_range.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/user_list_string_rule_item_operator.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/user_list_type.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/vanity_pharma_display_url_mode.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/vanity_pharma_text.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/webpage_condition_operand.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/enums/webpage_condition_operator.proto": label.New("go_googleapis", "google/ads/googleads/v2/enums", "enums_proto"), - "google/ads/googleads/v2/errors/access_invitation_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/account_budget_proposal_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/ad_customizer_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/ad_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/ad_group_ad_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/ad_group_bid_modifier_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/ad_group_criterion_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/ad_group_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/ad_group_feed_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/ad_parameter_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/ad_sharing_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/adx_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/asset_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/authentication_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/authorization_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/bidding_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/bidding_strategy_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/billing_setup_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/campaign_budget_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/campaign_criterion_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/campaign_draft_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/campaign_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/campaign_experiment_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/campaign_feed_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/campaign_shared_set_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/change_status_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/collection_size_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/context_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/conversion_action_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/conversion_adjustment_upload_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/conversion_upload_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/country_code_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/criterion_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/currency_code_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/custom_interest_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/customer_client_link_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/customer_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/customer_feed_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/customer_manager_link_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/database_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/date_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/date_range_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/distinct_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/enum_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/errors.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/extension_feed_item_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/extension_setting_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/feed_attribute_reference_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/feed_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/feed_item_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/feed_item_target_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/feed_item_validation_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/feed_mapping_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/field_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/field_mask_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/function_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/function_parsing_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/geo_target_constant_suggestion_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/header_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/id_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/image_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/internal_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/invoice_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/keyword_plan_ad_group_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/keyword_plan_campaign_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/keyword_plan_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/keyword_plan_idea_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/keyword_plan_keyword_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/keyword_plan_negative_keyword_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/label_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/language_code_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/list_operation_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/manager_link_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/media_bundle_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/media_file_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/media_upload_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/multiplier_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/mutate_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/mutate_job_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/new_resource_creation_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/not_empty_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/not_whitelisted_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/null_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/operation_access_denied_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/operator_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/partial_failure_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/policy_finding_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/policy_validation_parameter_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/policy_violation_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/query_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/quota_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/range_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/reach_plan_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/recommendation_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/region_code_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/request_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/resource_access_denied_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/resource_count_limit_exceeded_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/setting_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/shared_criterion_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/shared_set_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/size_limit_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/string_format_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/string_length_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/url_field_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/user_list_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/errors/youtube_video_registration_error.proto": label.New("go_googleapis", "google/ads/googleads/v2/errors", "errors_proto"), - "google/ads/googleads/v2/resources/account_budget.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/account_budget_proposal.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/ad.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/ad_group.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/ad_group_ad.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/ad_group_ad_asset_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/ad_group_ad_label.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/ad_group_audience_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/ad_group_bid_modifier.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/ad_group_criterion.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/ad_group_criterion_label.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/ad_group_criterion_simulation.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/ad_group_extension_setting.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/ad_group_feed.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/ad_group_label.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/ad_group_simulation.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/ad_parameter.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/ad_schedule_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/age_range_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/asset.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/bidding_strategy.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/billing_setup.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/campaign.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/campaign_audience_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/campaign_bid_modifier.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/campaign_budget.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/campaign_criterion.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/campaign_criterion_simulation.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/campaign_draft.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/campaign_experiment.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/campaign_extension_setting.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/campaign_feed.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/campaign_label.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/campaign_shared_set.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/carrier_constant.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/change_status.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/click_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/conversion_action.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/custom_interest.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/customer.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/customer_client.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/customer_client_link.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/customer_extension_setting.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/customer_feed.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/customer_label.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/customer_manager_link.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/customer_negative_criterion.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/detail_placement_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/display_keyword_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/distance_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/domain_category.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/dynamic_search_ads_search_term_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/expanded_landing_page_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/extension_feed_item.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/feed.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/feed_item.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/feed_item_target.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/feed_mapping.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/feed_placeholder_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/gender_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/geo_target_constant.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/geographic_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/google_ads_field.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/group_placement_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/hotel_group_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/hotel_performance_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/invoice.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/keyword_plan.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/keyword_plan_ad_group.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/keyword_plan_campaign.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/keyword_plan_keyword.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/keyword_plan_negative_keyword.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/keyword_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/label.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/landing_page_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/language_constant.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/location_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/managed_placement_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/media_file.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/merchant_center_link.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/mobile_app_category_constant.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/mobile_device_constant.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/mutate_job.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/operating_system_version_constant.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/paid_organic_search_term_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/parental_status_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/payments_account.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/product_bidding_category_constant.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/product_group_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/recommendation.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/remarketing_action.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/search_term_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/shared_criterion.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/shared_set.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/shopping_performance_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/topic_constant.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/topic_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/user_interest.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/user_list.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/user_location_view.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/resources/video.proto": label.New("go_googleapis", "google/ads/googleads/v2/resources", "resources_proto"), - "google/ads/googleads/v2/services/account_budget_proposal_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/account_budget_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/ad_group_ad_asset_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/ad_group_ad_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/ad_group_ad_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/ad_group_audience_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/ad_group_bid_modifier_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/ad_group_criterion_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/ad_group_criterion_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/ad_group_criterion_simulation_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/ad_group_extension_setting_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/ad_group_feed_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/ad_group_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/ad_group_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/ad_group_simulation_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/ad_parameter_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/ad_schedule_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/ad_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/age_range_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/asset_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/bidding_strategy_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/billing_setup_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/campaign_audience_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/campaign_bid_modifier_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/campaign_budget_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/campaign_criterion_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/campaign_criterion_simulation_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/campaign_draft_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/campaign_experiment_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/campaign_extension_setting_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/campaign_feed_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/campaign_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/campaign_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/campaign_shared_set_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/carrier_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/change_status_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/click_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/conversion_action_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/conversion_adjustment_upload_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/conversion_upload_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/custom_interest_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/customer_client_link_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/customer_client_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/customer_extension_setting_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/customer_feed_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/customer_label_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/customer_manager_link_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/customer_negative_criterion_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/customer_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/detail_placement_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/display_keyword_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/distance_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/domain_category_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/dynamic_search_ads_search_term_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/expanded_landing_page_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/extension_feed_item_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/feed_item_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/feed_item_target_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/feed_mapping_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/feed_placeholder_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/feed_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/gender_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/geo_target_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/geographic_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/google_ads_field_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/google_ads_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/group_placement_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/hotel_group_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/hotel_performance_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/invoice_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/keyword_plan_ad_group_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/keyword_plan_campaign_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/keyword_plan_idea_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/keyword_plan_keyword_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/keyword_plan_negative_keyword_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/keyword_plan_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/keyword_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/label_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/landing_page_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/language_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/location_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/managed_placement_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/media_file_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/merchant_center_link_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/mobile_app_category_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/mobile_device_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/mutate_job_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/operating_system_version_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/paid_organic_search_term_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/parental_status_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/payments_account_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/product_bidding_category_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/product_group_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/reach_plan_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/recommendation_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/remarketing_action_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/search_term_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/shared_criterion_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/shared_set_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/shopping_performance_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/topic_constant_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/topic_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/user_interest_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/user_list_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/user_location_view_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/ads/googleads/v2/services/video_service.proto": label.New("go_googleapis", "google/ads/googleads/v2/services", "services_proto"), - "google/api/annotations.proto": label.New("go_googleapis", "google/api", "annotations_proto"), - "google/api/auth.proto": label.New("go_googleapis", "google/api", "serviceconfig_proto"), - "google/api/backend.proto": label.New("go_googleapis", "google/api", "serviceconfig_proto"), - "google/api/billing.proto": label.New("go_googleapis", "google/api", "serviceconfig_proto"), - "google/api/client.proto": label.New("go_googleapis", "google/api", "annotations_proto"), - "google/api/config_change.proto": label.New("go_googleapis", "google/api", "configchange_proto"), - "google/api/consumer.proto": label.New("go_googleapis", "google/api", "serviceconfig_proto"), - "google/api/context.proto": label.New("go_googleapis", "google/api", "serviceconfig_proto"), - "google/api/control.proto": label.New("go_googleapis", "google/api", "serviceconfig_proto"), - "google/api/distribution.proto": label.New("go_googleapis", "google/api", "distribution_proto"), - "google/api/documentation.proto": label.New("go_googleapis", "google/api", "serviceconfig_proto"), - "google/api/endpoint.proto": label.New("go_googleapis", "google/api", "serviceconfig_proto"), - "google/api/expr/v1alpha1/cel_service.proto": label.New("go_googleapis", "google/api/expr/v1alpha1", "expr_proto"), - "google/api/expr/v1alpha1/checked.proto": label.New("go_googleapis", "google/api/expr/v1alpha1", "expr_proto"), - "google/api/expr/v1alpha1/conformance_service.proto": label.New("go_googleapis", "google/api/expr/v1alpha1", "expr_proto"), - "google/api/expr/v1alpha1/eval.proto": label.New("go_googleapis", "google/api/expr/v1alpha1", "expr_proto"), - "google/api/expr/v1alpha1/explain.proto": label.New("go_googleapis", "google/api/expr/v1alpha1", "expr_proto"), - "google/api/expr/v1alpha1/syntax.proto": label.New("go_googleapis", "google/api/expr/v1alpha1", "expr_proto"), - "google/api/expr/v1alpha1/value.proto": label.New("go_googleapis", "google/api/expr/v1alpha1", "expr_proto"), - "google/api/expr/v1beta1/decl.proto": label.New("go_googleapis", "google/api/expr/v1beta1", "expr_proto"), - "google/api/expr/v1beta1/eval.proto": label.New("go_googleapis", "google/api/expr/v1beta1", "expr_proto"), - "google/api/expr/v1beta1/expr.proto": label.New("go_googleapis", "google/api/expr/v1beta1", "expr_proto"), - "google/api/expr/v1beta1/source.proto": label.New("go_googleapis", "google/api/expr/v1beta1", "expr_proto"), - "google/api/expr/v1beta1/value.proto": label.New("go_googleapis", "google/api/expr/v1beta1", "expr_proto"), - "google/api/field_behavior.proto": label.New("go_googleapis", "google/api", "annotations_proto"), - "google/api/http.proto": label.New("go_googleapis", "google/api", "annotations_proto"), - "google/api/httpbody.proto": label.New("go_googleapis", "google/api", "httpbody_proto"), - "google/api/label.proto": label.New("go_googleapis", "google/api", "label_proto"), - "google/api/launch_stage.proto": label.New("go_googleapis", "google/api", "api_proto"), - "google/api/log.proto": label.New("go_googleapis", "google/api", "serviceconfig_proto"), - "google/api/logging.proto": label.New("go_googleapis", "google/api", "serviceconfig_proto"), - "google/api/metric.proto": label.New("go_googleapis", "google/api", "metric_proto"), - "google/api/monitored_resource.proto": label.New("go_googleapis", "google/api", "monitoredres_proto"), - "google/api/monitoring.proto": label.New("go_googleapis", "google/api", "serviceconfig_proto"), - "google/api/quota.proto": label.New("go_googleapis", "google/api", "serviceconfig_proto"), - "google/api/resource.proto": label.New("go_googleapis", "google/api", "annotations_proto"), - "google/api/service.proto": label.New("go_googleapis", "google/api", "serviceconfig_proto"), - "google/api/servicecontrol/v1/check_error.proto": label.New("go_googleapis", "google/api/servicecontrol/v1", "servicecontrol_proto"), - "google/api/servicecontrol/v1/distribution.proto": label.New("go_googleapis", "google/api/servicecontrol/v1", "servicecontrol_proto"), - "google/api/servicecontrol/v1/log_entry.proto": label.New("go_googleapis", "google/api/servicecontrol/v1", "servicecontrol_proto"), - "google/api/servicecontrol/v1/metric_value.proto": label.New("go_googleapis", "google/api/servicecontrol/v1", "servicecontrol_proto"), - "google/api/servicecontrol/v1/operation.proto": label.New("go_googleapis", "google/api/servicecontrol/v1", "servicecontrol_proto"), - "google/api/servicecontrol/v1/quota_controller.proto": label.New("go_googleapis", "google/api/servicecontrol/v1", "servicecontrol_proto"), - "google/api/servicecontrol/v1/service_controller.proto": label.New("go_googleapis", "google/api/servicecontrol/v1", "servicecontrol_proto"), - "google/api/servicemanagement/v1/resources.proto": label.New("go_googleapis", "google/api/servicemanagement/v1", "servicemanagement_proto"), - "google/api/servicemanagement/v1/servicemanager.proto": label.New("go_googleapis", "google/api/servicemanagement/v1", "servicemanagement_proto"), - "google/api/source_info.proto": label.New("go_googleapis", "google/api", "serviceconfig_proto"), - "google/api/system_parameter.proto": label.New("go_googleapis", "google/api", "serviceconfig_proto"), - "google/api/usage.proto": label.New("go_googleapis", "google/api", "serviceconfig_proto"), - "google/appengine/legacy/audit_data.proto": label.New("go_googleapis", "google/appengine/legacy", "legacy_proto"), - "google/appengine/logging/v1/request_log.proto": label.New("go_googleapis", "google/appengine/logging/v1", "logging_proto"), - "google/appengine/v1/app_yaml.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_proto"), - "google/appengine/v1/appengine.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_proto"), - "google/appengine/v1/application.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_proto"), - "google/appengine/v1/audit_data.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_proto"), - "google/appengine/v1/deploy.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_proto"), - "google/appengine/v1/instance.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_proto"), - "google/appengine/v1/location.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_proto"), - "google/appengine/v1/operation.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_proto"), - "google/appengine/v1/service.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_proto"), - "google/appengine/v1/version.proto": label.New("go_googleapis", "google/appengine/v1", "appengine_proto"), - "google/assistant/embedded/v1alpha1/embedded_assistant.proto": label.New("go_googleapis", "google/assistant/embedded/v1alpha1", "embedded_proto"), - "google/assistant/embedded/v1alpha2/embedded_assistant.proto": label.New("go_googleapis", "google/assistant/embedded/v1alpha2", "embedded_proto"), - "google/bigtable/admin/cluster/v1/bigtable_cluster_data.proto": label.New("go_googleapis", "google/bigtable/admin/cluster/v1", "cluster_proto"), - "google/bigtable/admin/cluster/v1/bigtable_cluster_service.proto": label.New("go_googleapis", "google/bigtable/admin/cluster/v1", "cluster_proto"), - "google/bigtable/admin/cluster/v1/bigtable_cluster_service_messages.proto": label.New("go_googleapis", "google/bigtable/admin/cluster/v1", "cluster_proto"), - "google/bigtable/admin/table/v1/bigtable_table_data.proto": label.New("go_googleapis", "google/bigtable/admin/table/v1", "table_proto"), - "google/bigtable/admin/table/v1/bigtable_table_service.proto": label.New("go_googleapis", "google/bigtable/admin/table/v1", "table_proto"), - "google/bigtable/admin/table/v1/bigtable_table_service_messages.proto": label.New("go_googleapis", "google/bigtable/admin/table/v1", "table_proto"), - "google/bigtable/admin/v2/bigtable_instance_admin.proto": label.New("go_googleapis", "google/bigtable/admin/v2", "admin_proto"), - "google/bigtable/admin/v2/bigtable_table_admin.proto": label.New("go_googleapis", "google/bigtable/admin/v2", "admin_proto"), - "google/bigtable/admin/v2/common.proto": label.New("go_googleapis", "google/bigtable/admin/v2", "admin_proto"), - "google/bigtable/admin/v2/instance.proto": label.New("go_googleapis", "google/bigtable/admin/v2", "admin_proto"), - "google/bigtable/admin/v2/table.proto": label.New("go_googleapis", "google/bigtable/admin/v2", "admin_proto"), - "google/bigtable/v1/bigtable_data.proto": label.New("go_googleapis", "google/bigtable/v1", "bigtable_proto"), - "google/bigtable/v1/bigtable_service.proto": label.New("go_googleapis", "google/bigtable/v1", "bigtable_proto"), - "google/bigtable/v1/bigtable_service_messages.proto": label.New("go_googleapis", "google/bigtable/v1", "bigtable_proto"), - "google/bigtable/v2/bigtable.proto": label.New("go_googleapis", "google/bigtable/v2", "bigtable_proto"), - "google/bigtable/v2/data.proto": label.New("go_googleapis", "google/bigtable/v2", "bigtable_proto"), - "google/bytestream/bytestream.proto": label.New("go_googleapis", "google/bytestream", "bytestream_proto"), - "google/cloud/asset/v1/asset_service.proto": label.New("go_googleapis", "google/cloud/asset/v1", "asset_proto"), - "google/cloud/asset/v1/assets.proto": label.New("go_googleapis", "google/cloud/asset/v1", "asset_proto"), - "google/cloud/asset/v1beta1/asset_service.proto": label.New("go_googleapis", "google/cloud/asset/v1beta1", "asset_proto"), - "google/cloud/asset/v1beta1/assets.proto": label.New("go_googleapis", "google/cloud/asset/v1beta1", "asset_proto"), - "google/cloud/asset/v1p2beta1/asset_service.proto": label.New("go_googleapis", "google/cloud/asset/v1p2beta1", "asset_proto"), - "google/cloud/asset/v1p2beta1/assets.proto": label.New("go_googleapis", "google/cloud/asset/v1p2beta1", "asset_proto"), - "google/cloud/audit/audit_log.proto": label.New("go_googleapis", "google/cloud/audit", "audit_proto"), - "google/cloud/automl/v1/annotation_payload.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_proto"), - "google/cloud/automl/v1/data_items.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_proto"), - "google/cloud/automl/v1/dataset.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_proto"), - "google/cloud/automl/v1/io.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_proto"), - "google/cloud/automl/v1/model.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_proto"), - "google/cloud/automl/v1/model_evaluation.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_proto"), - "google/cloud/automl/v1/operations.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_proto"), - "google/cloud/automl/v1/prediction_service.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_proto"), - "google/cloud/automl/v1/service.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_proto"), - "google/cloud/automl/v1/translation.proto": label.New("go_googleapis", "google/cloud/automl/v1", "automl_proto"), - "google/cloud/automl/v1beta1/annotation_payload.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/annotation_spec.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/classification.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/column_spec.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/data_items.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/data_stats.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/data_types.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/dataset.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/detection.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/geometry.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/image.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/io.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/model.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/model_evaluation.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/operations.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/prediction_service.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/ranges.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/regression.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/service.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/table_spec.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/tables.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/temporal.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/text.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/text_extraction.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/text_segment.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/text_sentiment.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/translation.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/automl/v1beta1/video.proto": label.New("go_googleapis", "google/cloud/automl/v1beta1", "automl_proto"), - "google/cloud/bigquery/datatransfer/v1/datasource.proto": label.New("go_googleapis", "google/cloud/bigquery/datatransfer/v1", "datatransfer_proto"), - "google/cloud/bigquery/datatransfer/v1/datatransfer.proto": label.New("go_googleapis", "google/cloud/bigquery/datatransfer/v1", "datatransfer_proto"), - "google/cloud/bigquery/datatransfer/v1/transfer.proto": label.New("go_googleapis", "google/cloud/bigquery/datatransfer/v1", "datatransfer_proto"), - "google/cloud/bigquery/logging/v1/audit_data.proto": label.New("go_googleapis", "google/cloud/bigquery/logging/v1", "logging_proto"), - "google/cloud/bigquery/storage/v1beta1/arrow.proto": label.New("go_googleapis", "google/cloud/bigquery/storage/v1beta1", "storage_proto"), - "google/cloud/bigquery/storage/v1beta1/avro.proto": label.New("go_googleapis", "google/cloud/bigquery/storage/v1beta1", "storage_proto"), - "google/cloud/bigquery/storage/v1beta1/read_options.proto": label.New("go_googleapis", "google/cloud/bigquery/storage/v1beta1", "storage_proto"), - "google/cloud/bigquery/storage/v1beta1/storage.proto": label.New("go_googleapis", "google/cloud/bigquery/storage/v1beta1", "storage_proto"), - "google/cloud/bigquery/storage/v1beta1/table_reference.proto": label.New("go_googleapis", "google/cloud/bigquery/storage/v1beta1", "storage_proto"), - "google/cloud/bigquery/v2/encryption_config.proto": label.New("go_googleapis", "google/cloud/bigquery/v2", "bigquery_proto"), - "google/cloud/bigquery/v2/model.proto": label.New("go_googleapis", "google/cloud/bigquery/v2", "bigquery_proto"), - "google/cloud/bigquery/v2/model_reference.proto": label.New("go_googleapis", "google/cloud/bigquery/v2", "bigquery_proto"), - "google/cloud/bigquery/v2/standard_sql.proto": label.New("go_googleapis", "google/cloud/bigquery/v2", "bigquery_proto"), - "google/cloud/billing/v1/cloud_billing.proto": label.New("go_googleapis", "google/cloud/billing/v1", "billing_proto"), - "google/cloud/binaryauthorization/v1beta1/resources.proto": label.New("go_googleapis", "google/cloud/binaryauthorization/v1beta1", "binaryauthorization_proto"), - "google/cloud/binaryauthorization/v1beta1/service.proto": label.New("go_googleapis", "google/cloud/binaryauthorization/v1beta1", "binaryauthorization_proto"), - "google/cloud/datacatalog/v1beta1/datacatalog.proto": label.New("go_googleapis", "google/cloud/datacatalog/v1beta1", "datacatalog_proto"), - "google/cloud/datacatalog/v1beta1/gcs_fileset_spec.proto": label.New("go_googleapis", "google/cloud/datacatalog/v1beta1", "datacatalog_proto"), - "google/cloud/datacatalog/v1beta1/schema.proto": label.New("go_googleapis", "google/cloud/datacatalog/v1beta1", "datacatalog_proto"), - "google/cloud/datacatalog/v1beta1/search.proto": label.New("go_googleapis", "google/cloud/datacatalog/v1beta1", "datacatalog_proto"), - "google/cloud/datacatalog/v1beta1/table_spec.proto": label.New("go_googleapis", "google/cloud/datacatalog/v1beta1", "datacatalog_proto"), - "google/cloud/datacatalog/v1beta1/tags.proto": label.New("go_googleapis", "google/cloud/datacatalog/v1beta1", "datacatalog_proto"), - "google/cloud/datacatalog/v1beta1/timestamps.proto": label.New("go_googleapis", "google/cloud/datacatalog/v1beta1", "datacatalog_proto"), - "google/cloud/datalabeling/v1beta1/annotation.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_proto"), - "google/cloud/datalabeling/v1beta1/annotation_spec_set.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_proto"), - "google/cloud/datalabeling/v1beta1/data_labeling_service.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_proto"), - "google/cloud/datalabeling/v1beta1/data_payloads.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_proto"), - "google/cloud/datalabeling/v1beta1/dataset.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_proto"), - "google/cloud/datalabeling/v1beta1/evaluation.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_proto"), - "google/cloud/datalabeling/v1beta1/evaluation_job.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_proto"), - "google/cloud/datalabeling/v1beta1/human_annotation_config.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_proto"), - "google/cloud/datalabeling/v1beta1/instruction.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_proto"), - "google/cloud/datalabeling/v1beta1/operations.proto": label.New("go_googleapis", "google/cloud/datalabeling/v1beta1", "datalabeling_proto"), - "google/cloud/dataproc/v1/autoscaling_policies.proto": label.New("go_googleapis", "google/cloud/dataproc/v1", "dataproc_proto"), - "google/cloud/dataproc/v1/clusters.proto": label.New("go_googleapis", "google/cloud/dataproc/v1", "dataproc_proto"), - "google/cloud/dataproc/v1/jobs.proto": label.New("go_googleapis", "google/cloud/dataproc/v1", "dataproc_proto"), - "google/cloud/dataproc/v1/operations.proto": label.New("go_googleapis", "google/cloud/dataproc/v1", "dataproc_proto"), - "google/cloud/dataproc/v1/shared.proto": label.New("go_googleapis", "google/cloud/dataproc/v1", "dataproc_proto"), - "google/cloud/dataproc/v1/workflow_templates.proto": label.New("go_googleapis", "google/cloud/dataproc/v1", "dataproc_proto"), - "google/cloud/dataproc/v1beta2/autoscaling_policies.proto": label.New("go_googleapis", "google/cloud/dataproc/v1beta2", "dataproc_proto"), - "google/cloud/dataproc/v1beta2/clusters.proto": label.New("go_googleapis", "google/cloud/dataproc/v1beta2", "dataproc_proto"), - "google/cloud/dataproc/v1beta2/jobs.proto": label.New("go_googleapis", "google/cloud/dataproc/v1beta2", "dataproc_proto"), - "google/cloud/dataproc/v1beta2/operations.proto": label.New("go_googleapis", "google/cloud/dataproc/v1beta2", "dataproc_proto"), - "google/cloud/dataproc/v1beta2/shared.proto": label.New("go_googleapis", "google/cloud/dataproc/v1beta2", "dataproc_proto"), - "google/cloud/dataproc/v1beta2/workflow_templates.proto": label.New("go_googleapis", "google/cloud/dataproc/v1beta2", "dataproc_proto"), - "google/cloud/dialogflow/v2/agent.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_proto"), - "google/cloud/dialogflow/v2/audio_config.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_proto"), - "google/cloud/dialogflow/v2/context.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_proto"), - "google/cloud/dialogflow/v2/entity_type.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_proto"), - "google/cloud/dialogflow/v2/intent.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_proto"), - "google/cloud/dialogflow/v2/session.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_proto"), - "google/cloud/dialogflow/v2/session_entity_type.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_proto"), - "google/cloud/dialogflow/v2/webhook.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2", "dialogflow_proto"), - "google/cloud/dialogflow/v2beta1/agent.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_proto"), - "google/cloud/dialogflow/v2beta1/audio_config.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_proto"), - "google/cloud/dialogflow/v2beta1/context.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_proto"), - "google/cloud/dialogflow/v2beta1/document.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_proto"), - "google/cloud/dialogflow/v2beta1/entity_type.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_proto"), - "google/cloud/dialogflow/v2beta1/gcs.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_proto"), - "google/cloud/dialogflow/v2beta1/intent.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_proto"), - "google/cloud/dialogflow/v2beta1/knowledge_base.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_proto"), - "google/cloud/dialogflow/v2beta1/session.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_proto"), - "google/cloud/dialogflow/v2beta1/session_entity_type.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_proto"), - "google/cloud/dialogflow/v2beta1/validation_result.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_proto"), - "google/cloud/dialogflow/v2beta1/webhook.proto": label.New("go_googleapis", "google/cloud/dialogflow/v2beta1", "dialogflow_proto"), - "google/cloud/document/v1beta1/document.proto": label.New("go_googleapis", "google/cloud/document/v1beta1", "document_proto"), - "google/cloud/document/v1beta1/document_understanding.proto": label.New("go_googleapis", "google/cloud/document/v1beta1", "document_proto"), - "google/cloud/document/v1beta1/geometry.proto": label.New("go_googleapis", "google/cloud/document/v1beta1", "document_proto"), - "google/cloud/functions/v1beta2/functions.proto": label.New("go_googleapis", "google/cloud/functions/v1beta2", "functions_proto"), - "google/cloud/functions/v1beta2/operations.proto": label.New("go_googleapis", "google/cloud/functions/v1beta2", "functions_proto"), - "google/cloud/iot/v1/device_manager.proto": label.New("go_googleapis", "google/cloud/iot/v1", "iot_proto"), - "google/cloud/iot/v1/resources.proto": label.New("go_googleapis", "google/cloud/iot/v1", "iot_proto"), - "google/cloud/irm/v1alpha2/incidents.proto": label.New("go_googleapis", "google/cloud/irm/v1alpha2", "irm_proto"), - "google/cloud/irm/v1alpha2/incidents_service.proto": label.New("go_googleapis", "google/cloud/irm/v1alpha2", "irm_proto"), - "google/cloud/kms/v1/resources.proto": label.New("go_googleapis", "google/cloud/kms/v1", "kms_proto"), - "google/cloud/kms/v1/service.proto": label.New("go_googleapis", "google/cloud/kms/v1", "kms_proto"), - "google/cloud/language/v1/language_service.proto": label.New("go_googleapis", "google/cloud/language/v1", "language_proto"), - "google/cloud/language/v1beta1/language_service.proto": label.New("go_googleapis", "google/cloud/language/v1beta1", "language_proto"), - "google/cloud/language/v1beta2/language_service.proto": label.New("go_googleapis", "google/cloud/language/v1beta2", "language_proto"), - "google/cloud/location/locations.proto": label.New("go_googleapis", "google/cloud/location", "location_proto"), - "google/cloud/ml/v1/job_service.proto": label.New("go_googleapis", "google/cloud/ml/v1", "ml_proto"), - "google/cloud/ml/v1/model_service.proto": label.New("go_googleapis", "google/cloud/ml/v1", "ml_proto"), - "google/cloud/ml/v1/operation_metadata.proto": label.New("go_googleapis", "google/cloud/ml/v1", "ml_proto"), - "google/cloud/ml/v1/prediction_service.proto": label.New("go_googleapis", "google/cloud/ml/v1", "ml_proto"), - "google/cloud/ml/v1/project_service.proto": label.New("go_googleapis", "google/cloud/ml/v1", "ml_proto"), - "google/cloud/oslogin/common/common.proto": label.New("go_googleapis", "google/cloud/oslogin/common", "common_proto"), - "google/cloud/oslogin/v1/oslogin.proto": label.New("go_googleapis", "google/cloud/oslogin/v1", "oslogin_proto"), - "google/cloud/oslogin/v1alpha/oslogin.proto": label.New("go_googleapis", "google/cloud/oslogin/v1alpha", "oslogin_proto"), - "google/cloud/oslogin/v1beta/oslogin.proto": label.New("go_googleapis", "google/cloud/oslogin/v1beta", "oslogin_proto"), - "google/cloud/phishingprotection/v1beta1/phishingprotection.proto": label.New("go_googleapis", "google/cloud/phishingprotection/v1beta1", "phishingprotection_proto"), - "google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto": label.New("go_googleapis", "google/cloud/recaptchaenterprise/v1beta1", "recaptchaenterprise_proto"), - "google/cloud/recommender/v1beta1/recommendation.proto": label.New("go_googleapis", "google/cloud/recommender/v1beta1", "recommender_proto"), - "google/cloud/recommender/v1beta1/recommender_service.proto": label.New("go_googleapis", "google/cloud/recommender/v1beta1", "recommender_proto"), - "google/cloud/redis/v1/cloud_redis.proto": label.New("go_googleapis", "google/cloud/redis/v1", "redis_proto"), - "google/cloud/redis/v1beta1/cloud_redis.proto": label.New("go_googleapis", "google/cloud/redis/v1beta1", "redis_proto"), - "google/cloud/resourcemanager/v2/folders.proto": label.New("go_googleapis", "google/cloud/resourcemanager/v2", "resourcemanager_proto"), - "google/cloud/runtimeconfig/v1beta1/resources.proto": label.New("go_googleapis", "google/cloud/runtimeconfig/v1beta1", "runtimeconfig_proto"), - "google/cloud/runtimeconfig/v1beta1/runtimeconfig.proto": label.New("go_googleapis", "google/cloud/runtimeconfig/v1beta1", "runtimeconfig_proto"), - "google/cloud/scheduler/v1/cloudscheduler.proto": label.New("go_googleapis", "google/cloud/scheduler/v1", "scheduler_proto"), - "google/cloud/scheduler/v1/job.proto": label.New("go_googleapis", "google/cloud/scheduler/v1", "scheduler_proto"), - "google/cloud/scheduler/v1/target.proto": label.New("go_googleapis", "google/cloud/scheduler/v1", "scheduler_proto"), - "google/cloud/scheduler/v1beta1/cloudscheduler.proto": label.New("go_googleapis", "google/cloud/scheduler/v1beta1", "scheduler_proto"), - "google/cloud/scheduler/v1beta1/job.proto": label.New("go_googleapis", "google/cloud/scheduler/v1beta1", "scheduler_proto"), - "google/cloud/scheduler/v1beta1/target.proto": label.New("go_googleapis", "google/cloud/scheduler/v1beta1", "scheduler_proto"), - "google/cloud/securitycenter/v1/asset.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1", "securitycenter_proto"), - "google/cloud/securitycenter/v1/finding.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1", "securitycenter_proto"), - "google/cloud/securitycenter/v1/organization_settings.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1", "securitycenter_proto"), - "google/cloud/securitycenter/v1/run_asset_discovery_response.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1", "securitycenter_proto"), - "google/cloud/securitycenter/v1/security_marks.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1", "securitycenter_proto"), - "google/cloud/securitycenter/v1/securitycenter_service.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1", "securitycenter_proto"), - "google/cloud/securitycenter/v1/source.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1", "securitycenter_proto"), - "google/cloud/securitycenter/v1beta1/asset.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1beta1", "securitycenter_proto"), - "google/cloud/securitycenter/v1beta1/finding.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1beta1", "securitycenter_proto"), - "google/cloud/securitycenter/v1beta1/organization_settings.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1beta1", "securitycenter_proto"), - "google/cloud/securitycenter/v1beta1/security_marks.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1beta1", "securitycenter_proto"), - "google/cloud/securitycenter/v1beta1/securitycenter_service.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1beta1", "securitycenter_proto"), - "google/cloud/securitycenter/v1beta1/source.proto": label.New("go_googleapis", "google/cloud/securitycenter/v1beta1", "securitycenter_proto"), - "google/cloud/speech/v1/cloud_speech.proto": label.New("go_googleapis", "google/cloud/speech/v1", "speech_proto"), - "google/cloud/speech/v1p1beta1/cloud_speech.proto": label.New("go_googleapis", "google/cloud/speech/v1p1beta1", "speech_proto"), - "google/cloud/support/common.proto": label.New("go_googleapis", "google/cloud/support", "common_proto"), - "google/cloud/support/v1alpha1/cloud_support.proto": label.New("go_googleapis", "google/cloud/support/v1alpha1", "support_proto"), - "google/cloud/talent/v4beta1/application.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/talent/v4beta1/application_service.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/talent/v4beta1/batch.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/talent/v4beta1/common.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/talent/v4beta1/company.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/talent/v4beta1/company_service.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/talent/v4beta1/completion_service.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/talent/v4beta1/event.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/talent/v4beta1/event_service.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/talent/v4beta1/filters.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/talent/v4beta1/histogram.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/talent/v4beta1/job.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/talent/v4beta1/job_service.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/talent/v4beta1/profile.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/talent/v4beta1/profile_service.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/talent/v4beta1/tenant.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/talent/v4beta1/tenant_service.proto": label.New("go_googleapis", "google/cloud/talent/v4beta1", "talent_proto"), - "google/cloud/tasks/v2/cloudtasks.proto": label.New("go_googleapis", "google/cloud/tasks/v2", "tasks_proto"), - "google/cloud/tasks/v2/queue.proto": label.New("go_googleapis", "google/cloud/tasks/v2", "tasks_proto"), - "google/cloud/tasks/v2/target.proto": label.New("go_googleapis", "google/cloud/tasks/v2", "tasks_proto"), - "google/cloud/tasks/v2/task.proto": label.New("go_googleapis", "google/cloud/tasks/v2", "tasks_proto"), - "google/cloud/tasks/v2beta2/cloudtasks.proto": label.New("go_googleapis", "google/cloud/tasks/v2beta2", "tasks_proto"), - "google/cloud/tasks/v2beta2/queue.proto": label.New("go_googleapis", "google/cloud/tasks/v2beta2", "tasks_proto"), - "google/cloud/tasks/v2beta2/target.proto": label.New("go_googleapis", "google/cloud/tasks/v2beta2", "tasks_proto"), - "google/cloud/tasks/v2beta2/task.proto": label.New("go_googleapis", "google/cloud/tasks/v2beta2", "tasks_proto"), - "google/cloud/tasks/v2beta3/cloudtasks.proto": label.New("go_googleapis", "google/cloud/tasks/v2beta3", "tasks_proto"), - "google/cloud/tasks/v2beta3/queue.proto": label.New("go_googleapis", "google/cloud/tasks/v2beta3", "tasks_proto"), - "google/cloud/tasks/v2beta3/target.proto": label.New("go_googleapis", "google/cloud/tasks/v2beta3", "tasks_proto"), - "google/cloud/tasks/v2beta3/task.proto": label.New("go_googleapis", "google/cloud/tasks/v2beta3", "tasks_proto"), - "google/cloud/texttospeech/v1/cloud_tts.proto": label.New("go_googleapis", "google/cloud/texttospeech/v1", "texttospeech_proto"), - "google/cloud/texttospeech/v1beta1/cloud_tts.proto": label.New("go_googleapis", "google/cloud/texttospeech/v1beta1", "texttospeech_proto"), - "google/cloud/translate/v3/translation_service.proto": label.New("go_googleapis", "google/cloud/translate/v3", "translate_proto"), - "google/cloud/translate/v3beta1/translation_service.proto": label.New("go_googleapis", "google/cloud/translate/v3beta1", "translate_proto"), - "google/cloud/videointelligence/v1/video_intelligence.proto": label.New("go_googleapis", "google/cloud/videointelligence/v1", "videointelligence_proto"), - "google/cloud/videointelligence/v1beta1/video_intelligence.proto": label.New("go_googleapis", "google/cloud/videointelligence/v1beta1", "videointelligence_proto"), - "google/cloud/videointelligence/v1beta2/video_intelligence.proto": label.New("go_googleapis", "google/cloud/videointelligence/v1beta2", "videointelligence_proto"), - "google/cloud/videointelligence/v1p1beta1/video_intelligence.proto": label.New("go_googleapis", "google/cloud/videointelligence/v1p1beta1", "videointelligence_proto"), - "google/cloud/videointelligence/v1p2beta1/video_intelligence.proto": label.New("go_googleapis", "google/cloud/videointelligence/v1p2beta1", "videointelligence_proto"), - "google/cloud/videointelligence/v1p3beta1/video_intelligence.proto": label.New("go_googleapis", "google/cloud/videointelligence/v1p3beta1", "videointelligence_proto"), - "google/cloud/vision/v1/geometry.proto": label.New("go_googleapis", "google/cloud/vision/v1", "vision_proto"), - "google/cloud/vision/v1/image_annotator.proto": label.New("go_googleapis", "google/cloud/vision/v1", "vision_proto"), - "google/cloud/vision/v1/product_search.proto": label.New("go_googleapis", "google/cloud/vision/v1", "vision_proto"), - "google/cloud/vision/v1/product_search_service.proto": label.New("go_googleapis", "google/cloud/vision/v1", "vision_proto"), - "google/cloud/vision/v1/text_annotation.proto": label.New("go_googleapis", "google/cloud/vision/v1", "vision_proto"), - "google/cloud/vision/v1/web_detection.proto": label.New("go_googleapis", "google/cloud/vision/v1", "vision_proto"), - "google/cloud/vision/v1p1beta1/geometry.proto": label.New("go_googleapis", "google/cloud/vision/v1p1beta1", "vision_proto"), - "google/cloud/vision/v1p1beta1/image_annotator.proto": label.New("go_googleapis", "google/cloud/vision/v1p1beta1", "vision_proto"), - "google/cloud/vision/v1p1beta1/text_annotation.proto": label.New("go_googleapis", "google/cloud/vision/v1p1beta1", "vision_proto"), - "google/cloud/vision/v1p1beta1/web_detection.proto": label.New("go_googleapis", "google/cloud/vision/v1p1beta1", "vision_proto"), - "google/cloud/vision/v1p2beta1/geometry.proto": label.New("go_googleapis", "google/cloud/vision/v1p2beta1", "vision_proto"), - "google/cloud/vision/v1p2beta1/image_annotator.proto": label.New("go_googleapis", "google/cloud/vision/v1p2beta1", "vision_proto"), - "google/cloud/vision/v1p2beta1/text_annotation.proto": label.New("go_googleapis", "google/cloud/vision/v1p2beta1", "vision_proto"), - "google/cloud/vision/v1p2beta1/web_detection.proto": label.New("go_googleapis", "google/cloud/vision/v1p2beta1", "vision_proto"), - "google/cloud/vision/v1p3beta1/geometry.proto": label.New("go_googleapis", "google/cloud/vision/v1p3beta1", "vision_proto"), - "google/cloud/vision/v1p3beta1/image_annotator.proto": label.New("go_googleapis", "google/cloud/vision/v1p3beta1", "vision_proto"), - "google/cloud/vision/v1p3beta1/product_search.proto": label.New("go_googleapis", "google/cloud/vision/v1p3beta1", "vision_proto"), - "google/cloud/vision/v1p3beta1/product_search_service.proto": label.New("go_googleapis", "google/cloud/vision/v1p3beta1", "vision_proto"), - "google/cloud/vision/v1p3beta1/text_annotation.proto": label.New("go_googleapis", "google/cloud/vision/v1p3beta1", "vision_proto"), - "google/cloud/vision/v1p3beta1/web_detection.proto": label.New("go_googleapis", "google/cloud/vision/v1p3beta1", "vision_proto"), - "google/cloud/vision/v1p4beta1/geometry.proto": label.New("go_googleapis", "google/cloud/vision/v1p4beta1", "vision_proto"), - "google/cloud/vision/v1p4beta1/image_annotator.proto": label.New("go_googleapis", "google/cloud/vision/v1p4beta1", "vision_proto"), - "google/cloud/vision/v1p4beta1/product_search.proto": label.New("go_googleapis", "google/cloud/vision/v1p4beta1", "vision_proto"), - "google/cloud/vision/v1p4beta1/product_search_service.proto": label.New("go_googleapis", "google/cloud/vision/v1p4beta1", "vision_proto"), - "google/cloud/vision/v1p4beta1/text_annotation.proto": label.New("go_googleapis", "google/cloud/vision/v1p4beta1", "vision_proto"), - "google/cloud/vision/v1p4beta1/web_detection.proto": label.New("go_googleapis", "google/cloud/vision/v1p4beta1", "vision_proto"), - "google/cloud/webrisk/v1beta1/webrisk.proto": label.New("go_googleapis", "google/cloud/webrisk/v1beta1", "webrisk_proto"), - "google/cloud/websecurityscanner/v1alpha/crawled_url.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1alpha", "websecurityscanner_proto"), - "google/cloud/websecurityscanner/v1alpha/finding.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1alpha", "websecurityscanner_proto"), - "google/cloud/websecurityscanner/v1alpha/finding_addon.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1alpha", "websecurityscanner_proto"), - "google/cloud/websecurityscanner/v1alpha/finding_type_stats.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1alpha", "websecurityscanner_proto"), - "google/cloud/websecurityscanner/v1alpha/scan_config.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1alpha", "websecurityscanner_proto"), - "google/cloud/websecurityscanner/v1alpha/scan_run.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1alpha", "websecurityscanner_proto"), - "google/cloud/websecurityscanner/v1alpha/web_security_scanner.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1alpha", "websecurityscanner_proto"), - "google/cloud/websecurityscanner/v1beta/crawled_url.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_proto"), - "google/cloud/websecurityscanner/v1beta/finding.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_proto"), - "google/cloud/websecurityscanner/v1beta/finding_addon.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_proto"), - "google/cloud/websecurityscanner/v1beta/finding_type_stats.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_proto"), - "google/cloud/websecurityscanner/v1beta/scan_config.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_proto"), - "google/cloud/websecurityscanner/v1beta/scan_config_error.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_proto"), - "google/cloud/websecurityscanner/v1beta/scan_run.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_proto"), - "google/cloud/websecurityscanner/v1beta/scan_run_error_trace.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_proto"), - "google/cloud/websecurityscanner/v1beta/scan_run_warning_trace.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_proto"), - "google/cloud/websecurityscanner/v1beta/web_security_scanner.proto": label.New("go_googleapis", "google/cloud/websecurityscanner/v1beta", "websecurityscanner_proto"), - "google/container/v1/cluster_service.proto": label.New("go_googleapis", "google/container/v1", "container_proto"), - "google/container/v1alpha1/cluster_service.proto": label.New("go_googleapis", "google/container/v1alpha1", "container_proto"), - "google/container/v1beta1/cluster_service.proto": label.New("go_googleapis", "google/container/v1beta1", "container_proto"), - "google/datastore/admin/v1/datastore_admin.proto": label.New("go_googleapis", "google/datastore/admin/v1", "admin_proto"), - "google/datastore/admin/v1/index.proto": label.New("go_googleapis", "google/datastore/admin/v1", "admin_proto"), - "google/datastore/admin/v1beta1/datastore_admin.proto": label.New("go_googleapis", "google/datastore/admin/v1beta1", "admin_proto"), - "google/datastore/v1/datastore.proto": label.New("go_googleapis", "google/datastore/v1", "datastore_proto"), - "google/datastore/v1/entity.proto": label.New("go_googleapis", "google/datastore/v1", "datastore_proto"), - "google/datastore/v1/query.proto": label.New("go_googleapis", "google/datastore/v1", "datastore_proto"), - "google/datastore/v1beta3/datastore.proto": label.New("go_googleapis", "google/datastore/v1beta3", "datastore_proto"), - "google/datastore/v1beta3/entity.proto": label.New("go_googleapis", "google/datastore/v1beta3", "datastore_proto"), - "google/datastore/v1beta3/query.proto": label.New("go_googleapis", "google/datastore/v1beta3", "datastore_proto"), - "google/devtools/build/v1/build_events.proto": label.New("go_googleapis", "google/devtools/build/v1", "build_proto"), - "google/devtools/build/v1/build_status.proto": label.New("go_googleapis", "google/devtools/build/v1", "build_proto"), - "google/devtools/build/v1/publish_build_event.proto": label.New("go_googleapis", "google/devtools/build/v1", "build_proto"), - "google/devtools/cloudbuild/v1/cloudbuild.proto": label.New("go_googleapis", "google/devtools/cloudbuild/v1", "cloudbuild_proto"), - "google/devtools/clouddebugger/v2/controller.proto": label.New("go_googleapis", "google/devtools/clouddebugger/v2", "clouddebugger_proto"), - "google/devtools/clouddebugger/v2/data.proto": label.New("go_googleapis", "google/devtools/clouddebugger/v2", "clouddebugger_proto"), - "google/devtools/clouddebugger/v2/debugger.proto": label.New("go_googleapis", "google/devtools/clouddebugger/v2", "clouddebugger_proto"), - "google/devtools/clouderrorreporting/v1beta1/common.proto": label.New("go_googleapis", "google/devtools/clouderrorreporting/v1beta1", "clouderrorreporting_proto"), - "google/devtools/clouderrorreporting/v1beta1/error_group_service.proto": label.New("go_googleapis", "google/devtools/clouderrorreporting/v1beta1", "clouderrorreporting_proto"), - "google/devtools/clouderrorreporting/v1beta1/error_stats_service.proto": label.New("go_googleapis", "google/devtools/clouderrorreporting/v1beta1", "clouderrorreporting_proto"), - "google/devtools/clouderrorreporting/v1beta1/report_errors_service.proto": label.New("go_googleapis", "google/devtools/clouderrorreporting/v1beta1", "clouderrorreporting_proto"), - "google/devtools/cloudprofiler/v2/profiler.proto": label.New("go_googleapis", "google/devtools/cloudprofiler/v2", "cloudprofiler_proto"), - "google/devtools/cloudtrace/v1/trace.proto": label.New("go_googleapis", "google/devtools/cloudtrace/v1", "cloudtrace_proto"), - "google/devtools/cloudtrace/v2/trace.proto": label.New("go_googleapis", "google/devtools/cloudtrace/v2", "cloudtrace_proto"), - "google/devtools/cloudtrace/v2/tracing.proto": label.New("go_googleapis", "google/devtools/cloudtrace/v2", "cloudtrace_proto"), - "google/devtools/containeranalysis/v1/containeranalysis.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1", "containeranalysis_proto"), - "google/devtools/containeranalysis/v1alpha1/bill_of_materials.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1alpha1", "containeranalysis_proto"), - "google/devtools/containeranalysis/v1alpha1/containeranalysis.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1alpha1", "containeranalysis_proto"), - "google/devtools/containeranalysis/v1alpha1/image_basis.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1alpha1", "containeranalysis_proto"), - "google/devtools/containeranalysis/v1alpha1/package_vulnerability.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1alpha1", "containeranalysis_proto"), - "google/devtools/containeranalysis/v1alpha1/provenance.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1alpha1", "containeranalysis_proto"), - "google/devtools/containeranalysis/v1alpha1/source_context.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1alpha1", "containeranalysis_proto"), - "google/devtools/containeranalysis/v1beta1/attestation/attestation.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/attestation", "attestation_proto"), - "google/devtools/containeranalysis/v1beta1/build/build.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/build", "build_proto"), - "google/devtools/containeranalysis/v1beta1/common/common.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/common", "common_proto"), - "google/devtools/containeranalysis/v1beta1/containeranalysis.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1", "containeranalysis_proto"), - "google/devtools/containeranalysis/v1beta1/deployment/deployment.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/deployment", "deployment_proto"), - "google/devtools/containeranalysis/v1beta1/discovery/discovery.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/discovery", "discovery_proto"), - "google/devtools/containeranalysis/v1beta1/grafeas/grafeas.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/grafeas", "grafeas_proto"), - "google/devtools/containeranalysis/v1beta1/image/image.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/image", "image_proto"), - "google/devtools/containeranalysis/v1beta1/package/package.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/package", "package_proto"), - "google/devtools/containeranalysis/v1beta1/provenance/provenance.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/provenance", "provenance_proto"), - "google/devtools/containeranalysis/v1beta1/source/source.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/source", "source_proto"), - "google/devtools/containeranalysis/v1beta1/vulnerability/vulnerability.proto": label.New("go_googleapis", "google/devtools/containeranalysis/v1beta1/vulnerability", "vulnerability_proto"), - "google/devtools/remoteexecution/v1test/remote_execution.proto": label.New("go_googleapis", "google/devtools/remoteexecution/v1test", "remoteexecution_proto"), - "google/devtools/remoteworkers/v1test2/bots.proto": label.New("go_googleapis", "google/devtools/remoteworkers/v1test2", "remoteworkers_proto"), - "google/devtools/remoteworkers/v1test2/command.proto": label.New("go_googleapis", "google/devtools/remoteworkers/v1test2", "remoteworkers_proto"), - "google/devtools/remoteworkers/v1test2/tasks.proto": label.New("go_googleapis", "google/devtools/remoteworkers/v1test2", "remoteworkers_proto"), - "google/devtools/remoteworkers/v1test2/worker.proto": label.New("go_googleapis", "google/devtools/remoteworkers/v1test2", "remoteworkers_proto"), - "google/devtools/resultstore/v2/action.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/resultstore/v2/common.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/resultstore/v2/configuration.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/resultstore/v2/configured_target.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/resultstore/v2/coverage.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/resultstore/v2/coverage_summary.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/resultstore/v2/download_metadata.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/resultstore/v2/file.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/resultstore/v2/file_processing_error.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/resultstore/v2/file_set.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/resultstore/v2/invocation.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/resultstore/v2/resultstore_download.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/resultstore/v2/resultstore_file_download.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/resultstore/v2/resultstore_upload.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/resultstore/v2/target.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/resultstore/v2/test_suite.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/resultstore/v2/upload_metadata.proto": label.New("go_googleapis", "google/devtools/resultstore/v2", "resultstore_proto"), - "google/devtools/source/v1/source_context.proto": label.New("go_googleapis", "google/devtools/source/v1", "source_proto"), - "google/devtools/sourcerepo/v1/sourcerepo.proto": label.New("go_googleapis", "google/devtools/sourcerepo/v1", "sourcerepo_proto"), - "google/example/library/v1/library.proto": label.New("go_googleapis", "google/example/library/v1", "library_proto"), - "google/firebase/fcm/connection/v1alpha1/connection_api.proto": label.New("go_googleapis", "google/firebase/fcm/connection/v1alpha1", "connection_proto"), - "google/firestore/admin/v1/field.proto": label.New("go_googleapis", "google/firestore/admin/v1", "admin_proto"), - "google/firestore/admin/v1/firestore_admin.proto": label.New("go_googleapis", "google/firestore/admin/v1", "admin_proto"), - "google/firestore/admin/v1/index.proto": label.New("go_googleapis", "google/firestore/admin/v1", "admin_proto"), - "google/firestore/admin/v1/location.proto": label.New("go_googleapis", "google/firestore/admin/v1", "admin_proto"), - "google/firestore/admin/v1/operation.proto": label.New("go_googleapis", "google/firestore/admin/v1", "admin_proto"), - "google/firestore/admin/v1beta1/firestore_admin.proto": label.New("go_googleapis", "google/firestore/admin/v1beta1", "admin_proto"), - "google/firestore/admin/v1beta1/index.proto": label.New("go_googleapis", "google/firestore/admin/v1beta1", "admin_proto"), - "google/firestore/admin/v1beta1/location.proto": label.New("go_googleapis", "google/firestore/admin/v1beta1", "admin_proto"), - "google/firestore/admin/v1beta2/field.proto": label.New("go_googleapis", "google/firestore/admin/v1beta2", "admin_proto"), - "google/firestore/admin/v1beta2/firestore_admin.proto": label.New("go_googleapis", "google/firestore/admin/v1beta2", "admin_proto"), - "google/firestore/admin/v1beta2/index.proto": label.New("go_googleapis", "google/firestore/admin/v1beta2", "admin_proto"), - "google/firestore/admin/v1beta2/operation.proto": label.New("go_googleapis", "google/firestore/admin/v1beta2", "admin_proto"), - "google/firestore/v1/common.proto": label.New("go_googleapis", "google/firestore/v1", "firestore_proto"), - "google/firestore/v1/document.proto": label.New("go_googleapis", "google/firestore/v1", "firestore_proto"), - "google/firestore/v1/firestore.proto": label.New("go_googleapis", "google/firestore/v1", "firestore_proto"), - "google/firestore/v1/query.proto": label.New("go_googleapis", "google/firestore/v1", "firestore_proto"), - "google/firestore/v1/write.proto": label.New("go_googleapis", "google/firestore/v1", "firestore_proto"), - "google/firestore/v1beta1/common.proto": label.New("go_googleapis", "google/firestore/v1beta1", "firestore_proto"), - "google/firestore/v1beta1/document.proto": label.New("go_googleapis", "google/firestore/v1beta1", "firestore_proto"), - "google/firestore/v1beta1/firestore.proto": label.New("go_googleapis", "google/firestore/v1beta1", "firestore_proto"), - "google/firestore/v1beta1/query.proto": label.New("go_googleapis", "google/firestore/v1beta1", "firestore_proto"), - "google/firestore/v1beta1/write.proto": label.New("go_googleapis", "google/firestore/v1beta1", "firestore_proto"), - "google/genomics/v1/annotations.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_proto"), - "google/genomics/v1/cigar.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_proto"), - "google/genomics/v1/datasets.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_proto"), - "google/genomics/v1/operations.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_proto"), - "google/genomics/v1/position.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_proto"), - "google/genomics/v1/range.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_proto"), - "google/genomics/v1/readalignment.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_proto"), - "google/genomics/v1/readgroup.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_proto"), - "google/genomics/v1/readgroupset.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_proto"), - "google/genomics/v1/reads.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_proto"), - "google/genomics/v1/references.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_proto"), - "google/genomics/v1/variants.proto": label.New("go_googleapis", "google/genomics/v1", "genomics_proto"), - "google/genomics/v1alpha2/pipelines.proto": label.New("go_googleapis", "google/genomics/v1alpha2", "genomics_proto"), - "google/geo/type/viewport.proto": label.New("go_googleapis", "google/geo/type", "viewport_proto"), - "google/home/graph/v1/device.proto": label.New("go_googleapis", "google/home/graph/v1", "graph_proto"), - "google/home/graph/v1/homegraph.proto": label.New("go_googleapis", "google/home/graph/v1", "graph_proto"), - "google/iam/admin/v1/iam.proto": label.New("go_googleapis", "google/iam/admin/v1", "admin_proto"), - "google/iam/credentials/v1/common.proto": label.New("go_googleapis", "google/iam/credentials/v1", "credentials_proto"), - "google/iam/credentials/v1/iamcredentials.proto": label.New("go_googleapis", "google/iam/credentials/v1", "credentials_proto"), - "google/iam/v1/iam_policy.proto": label.New("go_googleapis", "google/iam/v1", "iam_proto"), - "google/iam/v1/logging/audit_data.proto": label.New("go_googleapis", "google/iam/v1/logging", "logging_proto"), - "google/iam/v1/options.proto": label.New("go_googleapis", "google/iam/v1", "iam_proto"), - "google/iam/v1/policy.proto": label.New("go_googleapis", "google/iam/v1", "iam_proto"), - "google/logging/type/http_request.proto": label.New("go_googleapis", "google/logging/type", "ltype_proto"), - "google/logging/type/log_severity.proto": label.New("go_googleapis", "google/logging/type", "ltype_proto"), - "google/logging/v2/log_entry.proto": label.New("go_googleapis", "google/logging/v2", "logging_proto"), - "google/logging/v2/logging.proto": label.New("go_googleapis", "google/logging/v2", "logging_proto"), - "google/logging/v2/logging_config.proto": label.New("go_googleapis", "google/logging/v2", "logging_proto"), - "google/logging/v2/logging_metrics.proto": label.New("go_googleapis", "google/logging/v2", "logging_proto"), - "google/longrunning/operations.proto": label.New("go_googleapis", "google/longrunning", "longrunning_proto"), - "google/monitoring/v3/alert.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_proto"), - "google/monitoring/v3/alert_service.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_proto"), - "google/monitoring/v3/common.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_proto"), - "google/monitoring/v3/dropped_labels.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_proto"), - "google/monitoring/v3/group.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_proto"), - "google/monitoring/v3/group_service.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_proto"), - "google/monitoring/v3/metric.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_proto"), - "google/monitoring/v3/metric_service.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_proto"), - "google/monitoring/v3/mutation_record.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_proto"), - "google/monitoring/v3/notification.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_proto"), - "google/monitoring/v3/notification_service.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_proto"), - "google/monitoring/v3/span_context.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_proto"), - "google/monitoring/v3/uptime.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_proto"), - "google/monitoring/v3/uptime_service.proto": label.New("go_googleapis", "google/monitoring/v3", "monitoring_proto"), - "google/privacy/dlp/v2/dlp.proto": label.New("go_googleapis", "google/privacy/dlp/v2", "dlp_proto"), - "google/privacy/dlp/v2/storage.proto": label.New("go_googleapis", "google/privacy/dlp/v2", "dlp_proto"), - "google/pubsub/v1/pubsub.proto": label.New("go_googleapis", "google/pubsub/v1", "pubsub_proto"), - "google/pubsub/v1beta2/pubsub.proto": label.New("go_googleapis", "google/pubsub/v1beta2", "pubsub_proto"), - "google/rpc/code.proto": label.New("go_googleapis", "google/rpc", "code_proto"), - "google/rpc/error_details.proto": label.New("go_googleapis", "google/rpc", "errdetails_proto"), - "google/rpc/status.proto": label.New("go_googleapis", "google/rpc", "status_proto"), - "google/spanner/admin/database/v1/spanner_database_admin.proto": label.New("go_googleapis", "google/spanner/admin/database/v1", "database_proto"), - "google/spanner/admin/instance/v1/spanner_instance_admin.proto": label.New("go_googleapis", "google/spanner/admin/instance/v1", "instance_proto"), - "google/spanner/v1/keys.proto": label.New("go_googleapis", "google/spanner/v1", "spanner_proto"), - "google/spanner/v1/mutation.proto": label.New("go_googleapis", "google/spanner/v1", "spanner_proto"), - "google/spanner/v1/query_plan.proto": label.New("go_googleapis", "google/spanner/v1", "spanner_proto"), - "google/spanner/v1/result_set.proto": label.New("go_googleapis", "google/spanner/v1", "spanner_proto"), - "google/spanner/v1/spanner.proto": label.New("go_googleapis", "google/spanner/v1", "spanner_proto"), - "google/spanner/v1/transaction.proto": label.New("go_googleapis", "google/spanner/v1", "spanner_proto"), - "google/spanner/v1/type.proto": label.New("go_googleapis", "google/spanner/v1", "spanner_proto"), - "google/storagetransfer/v1/transfer.proto": label.New("go_googleapis", "google/storagetransfer/v1", "storagetransfer_proto"), - "google/storagetransfer/v1/transfer_types.proto": label.New("go_googleapis", "google/storagetransfer/v1", "storagetransfer_proto"), - "google/streetview/publish/v1/resources.proto": label.New("go_googleapis", "google/streetview/publish/v1", "publish_proto"), - "google/streetview/publish/v1/rpcmessages.proto": label.New("go_googleapis", "google/streetview/publish/v1", "publish_proto"), - "google/streetview/publish/v1/streetview_publish.proto": label.New("go_googleapis", "google/streetview/publish/v1", "publish_proto"), - "google/type/calendar_period.proto": label.New("go_googleapis", "google/type", "calendarperiod_proto"), - "google/type/color.proto": label.New("go_googleapis", "google/type", "color_proto"), - "google/type/date.proto": label.New("go_googleapis", "google/type", "date_proto"), - "google/type/dayofweek.proto": label.New("go_googleapis", "google/type", "dayofweek_proto"), - "google/type/expr.proto": label.New("go_googleapis", "google/type", "expr_proto"), - "google/type/fraction.proto": label.New("go_googleapis", "google/type", "fraction_proto"), - "google/type/latlng.proto": label.New("go_googleapis", "google/type", "latlng_proto"), - "google/type/money.proto": label.New("go_googleapis", "google/type", "money_proto"), - "google/type/postal_address.proto": label.New("go_googleapis", "google/type", "postaladdress_proto"), - "google/type/quaternion.proto": label.New("go_googleapis", "google/type", "quaternion_proto"), - "google/type/timeofday.proto": label.New("go_googleapis", "google/type", "timeofday_proto"), - "google/watcher/v1/watch.proto": label.New("go_googleapis", "google/watcher/v1", "watcher_proto"), - "grafeas/v1/attestation.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_proto"), - "grafeas/v1/build.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_proto"), - "grafeas/v1/common.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_proto"), - "grafeas/v1/cvss.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_proto"), - "grafeas/v1/deployment.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_proto"), - "grafeas/v1/discovery.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_proto"), - "grafeas/v1/grafeas.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_proto"), - "grafeas/v1/image.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_proto"), - "grafeas/v1/package.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_proto"), - "grafeas/v1/provenance.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_proto"), - "grafeas/v1/vulnerability.proto": label.New("go_googleapis", "grafeas/v1", "grafeas_proto"), -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/lang.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/lang.go deleted file mode 100644 index fe009df88db..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/lang.go +++ /dev/null @@ -1,72 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 proto provides support for protocol buffer rules. -// It generates proto_library rules only (not go_proto_library or any other -// language-specific implementations). -// -// Configuration -// -// Configuration is largely controlled by Mode. In disable mode, proto rules are -// left alone (neither generated nor deleted). In legacy mode, filegroups are -// emitted containing protos. In default mode, proto_library rules are -// emitted. The proto mode may be set with the -proto command line flag or the -// "# gazelle:proto" directive. -// -// The configuration is largely public, and other languages may depend on it. -// For example, go uses Mode to determine whether to generate go_proto_library -// rules and ignore static .pb.go files. -// -// Rule generation -// -// Currently, Gazelle generates at most one proto_library per directory. Protos -// in the same package are grouped together into a proto_library. If there are -// sources for multiple packages, the package name that matches the directory -// name will be chosen; if there is no such package, an error will be printed. -// We expect to provide support for multiple proto_libraries in the future -// when Go has support for multiple packages and we have better rule matching. -// The generated proto_library will be named after the directory, not the -// proto or the package. For example, for foo/bar/baz.proto, a proto_library -// rule will be generated named //foo/bar:bar_proto. -// -// Dependency resolution -// -// proto_library rules are indexed by their srcs attribute. Gazelle attempts -// to resolve proto imports (e.g., import foo/bar/bar.proto) to the -// proto_library that contains the named source file -// (e.g., //foo/bar:bar_proto). If no indexed proto_library provides the source -// file, Gazelle will guess a label, following conventions. -// -// No attempt is made to resolve protos to rules in external repositories, -// since there's no indication that a proto import comes from an external -// repository. In the future, build files in external repos will be indexed, -// so we can support this (#12). -// -// Gazelle has special cases for Well Known Types (i.e., imports of the form -// google/protobuf/*.proto). These are resolved to rules in -// @com_google_protobuf. -package proto - -import "github.com/bazelbuild/bazel-gazelle/language" - -const protoName = "proto" - -type protoLang struct{} - -func (_ *protoLang) Name() string { return protoName } - -func NewLanguage() language.Language { - return &protoLang{} -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/package.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/package.go deleted file mode 100644 index fba05f0c32c..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/package.go +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 proto - -import "path/filepath" - -// Package contains metadata for a set of .proto files that have the -// same package name. This translates to a proto_library rule. -type Package struct { - Name string - Files map[string]FileInfo - Imports map[string]bool - Options map[string]string - HasServices bool -} - -func newPackage(name string) *Package { - return &Package{ - Name: name, - Files: map[string]FileInfo{}, - Imports: map[string]bool{}, - Options: map[string]string{}, - } -} - -func (p *Package) addFile(info FileInfo) { - p.Files[info.Name] = info - for _, imp := range info.Imports { - p.Imports[imp] = true - } - for _, opt := range info.Options { - p.Options[opt.Key] = opt.Value - } - p.HasServices = p.HasServices || info.HasServices -} - -func (p *Package) addGenFile(dir, name string) { - p.Files[name] = FileInfo{ - Name: name, - Path: filepath.Join(dir, filepath.FromSlash(name)), - } -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/proto.csv b/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/proto.csv deleted file mode 100644 index 06bd194c27b..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/proto.csv +++ /dev/null @@ -1,1611 +0,0 @@ -# This file lists special protos that Gazelle knows how to import. This is used to generate -# code for proto and Go resolvers. -# -# Generated by internal/language/proto/gen/update_proto_csv.go -# Do not edit directly. -# -# proto name,proto label,go import path,go proto label -google/protobuf/any.proto,@com_google_protobuf//:any_proto,github.com/golang/protobuf/ptypes/any,@io_bazel_rules_go//proto/wkt:any_go_proto -google/protobuf/api.proto,@com_google_protobuf//:api_proto,google.golang.org/genproto/protobuf/api,@io_bazel_rules_go//proto/wkt:api_go_proto -google/protobuf/compiler/plugin.proto,@com_google_protobuf//:compiler_plugin_proto,github.com/golang/protobuf/protoc-gen-go/plugin,@io_bazel_rules_go//proto/wkt:compiler_plugin_go_proto -google/protobuf/descriptor.proto,@com_google_protobuf//:descriptor_proto,github.com/golang/protobuf/protoc-gen-go/descriptor,@io_bazel_rules_go//proto/wkt:descriptor_go_proto -google/protobuf/duration.proto,@com_google_protobuf//:duration_proto,github.com/golang/protobuf/ptypes/duration,@io_bazel_rules_go//proto/wkt:duration_go_proto -google/protobuf/empty.proto,@com_google_protobuf//:empty_proto,github.com/golang/protobuf/ptypes/empty,@io_bazel_rules_go//proto/wkt:empty_go_proto -google/protobuf/field_mask.proto,@com_google_protobuf//:field_mask_proto,google.golang.org/genproto/protobuf/field_mask,@io_bazel_rules_go//proto/wkt:field_mask_go_proto -google/protobuf/source_context.proto,@com_google_protobuf//:source_context_proto,google.golang.org/genproto/protobuf/source_context,@io_bazel_rules_go//proto/wkt:source_context_go_proto -google/protobuf/struct.proto,@com_google_protobuf//:struct_proto,github.com/golang/protobuf/ptypes/struct,@io_bazel_rules_go//proto/wkt:struct_go_proto -google/protobuf/timestamp.proto,@com_google_protobuf//:timestamp_proto,github.com/golang/protobuf/ptypes/timestamp,@io_bazel_rules_go//proto/wkt:timestamp_go_proto -google/protobuf/type.proto,@com_google_protobuf//:type_proto,google.golang.org/genproto/protobuf/ptype,@io_bazel_rules_go//proto/wkt:type_go_proto -google/protobuf/wrappers.proto,@com_google_protobuf//:wrappers_proto,github.com/golang/protobuf/ptypes/wrappers,@io_bazel_rules_go//proto/wkt:wrappers_go_proto -google/ads/googleads/v1/common/ad_asset.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/ad_type_infos.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/asset_types.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/bidding.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/click_location.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/criteria.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/criterion_category_availability.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/custom_parameter.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/dates.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/explorer_auto_optimizer_setting.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/extensions.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/feed_common.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/final_app_url.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/frequency_cap.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/keyword_plan_common.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/matching_function.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/metrics.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/policy.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/real_time_bidding_setting.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/segments.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/simulation.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/tag_snippet.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/targeting_setting.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/text_label.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/url_collection.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/user_lists.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/common/value.proto,@go_googleapis//google/ads/googleads/v1/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/common,@go_googleapis//google/ads/googleads/v1/common:common_go_proto -google/ads/googleads/v1/enums/access_reason.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/account_budget_proposal_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/account_budget_proposal_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/account_budget_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/ad_customizer_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/ad_group_ad_rotation_mode.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/ad_group_ad_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/ad_group_criterion_approval_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/ad_group_criterion_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/ad_group_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/ad_group_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/ad_network_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/ad_serving_optimization_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/ad_strength.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/ad_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/advertising_channel_sub_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/advertising_channel_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/affiliate_location_feed_relationship_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/affiliate_location_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/age_range_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/app_campaign_app_store.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/app_campaign_bidding_strategy_goal_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/app_payment_model_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/app_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/app_store.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/app_url_operating_system_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/asset_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/attribution_model.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/bid_modifier_source.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/bidding_source.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/bidding_strategy_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/bidding_strategy_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/billing_setup_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/brand_safety_suitability.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/budget_delivery_method.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/budget_period.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/budget_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/budget_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/call_conversion_reporting_state.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/call_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/callout_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/campaign_criterion_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/campaign_draft_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/campaign_experiment_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/campaign_experiment_traffic_split_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/campaign_experiment_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/campaign_serving_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/campaign_shared_set_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/campaign_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/change_status_operation.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/change_status_resource_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/click_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/content_label_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/conversion_action_category.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/conversion_action_counting_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/conversion_action_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/conversion_action_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/conversion_adjustment_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/conversion_attribution_event_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/conversion_lag_bucket.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/conversion_or_adjustment_lag_bucket.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/criterion_category_channel_availability_mode.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/criterion_category_locale_availability_mode.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/criterion_system_serving_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/criterion_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/custom_interest_member_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/custom_interest_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/custom_interest_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/custom_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/customer_match_upload_key_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/customer_pay_per_conversion_eligibility_failure_reason.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/data_driven_model_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/day_of_week.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/device.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/display_ad_format_setting.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/display_upload_product_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/dsa_page_feed_criterion_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/education_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/extension_setting_device.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/extension_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/external_conversion_source.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/feed_attribute_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/feed_item_quality_approval_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/feed_item_quality_disapproval_reason.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/feed_item_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/feed_item_target_device.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/feed_item_target_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/feed_item_validation_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/feed_link_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/feed_mapping_criterion_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/feed_mapping_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/feed_origin.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/feed_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/flight_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/frequency_cap_event_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/frequency_cap_level.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/frequency_cap_time_unit.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/gender_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/geo_target_constant_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/geo_targeting_restriction.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/geo_targeting_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/google_ads_field_category.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/google_ads_field_data_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/hotel_date_selection_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/hotel_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/hotel_rate_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/income_range_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/interaction_event_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/interaction_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/job_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/keyword_match_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/keyword_plan_competition_level.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/keyword_plan_forecast_interval.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/keyword_plan_network.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/label_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/legacy_app_install_ad_app_store.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/listing_custom_attribute_index.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/listing_group_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/local_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/location_extension_targeting_criterion_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/location_group_radius_units.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/location_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/manager_link_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/matching_function_context_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/matching_function_operator.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/media_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/merchant_center_link_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/message_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/mime_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/minute_of_hour.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/mobile_device_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/month_of_year.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/mutate_job_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/negative_geo_target_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/operating_system_version_operator_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/page_one_promoted_strategy_goal.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/parental_status_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/payment_mode.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/placeholder_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/placement_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/policy_approval_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/policy_review_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/policy_topic_entry_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/policy_topic_evidence_destination_mismatch_url_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/policy_topic_evidence_destination_not_working_device.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/positive_geo_target_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/preferred_content_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/price_extension_price_qualifier.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/price_extension_price_unit.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/price_extension_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/price_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/product_bidding_category_level.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/product_bidding_category_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/product_channel.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/product_channel_exclusivity.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/product_condition.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/product_type_level.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/promotion_extension_discount_modifier.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/promotion_extension_occasion.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/promotion_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/proximity_radius_units.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/quality_score_bucket.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/real_estate_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/recommendation_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/search_engine_results_page_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/search_term_match_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/search_term_targeting_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/served_asset_field_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/shared_set_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/shared_set_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/simulation_modification_method.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/simulation_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/sitelink_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/slot.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/spending_limit_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/structured_snippet_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/system_managed_entity_source.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/target_cpa_opt_in_recommendation_goal.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/target_impression_share_location.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/targeting_dimension.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/time_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/tracking_code_page_format.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/tracking_code_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/travel_placeholder_field.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/user_interest_taxonomy_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/user_list_access_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/user_list_closing_reason.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/user_list_combined_rule_operator.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/user_list_crm_data_source_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/user_list_date_rule_item_operator.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/user_list_logical_rule_operator.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/user_list_membership_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/user_list_number_rule_item_operator.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/user_list_prepopulation_status.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/user_list_rule_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/user_list_size_range.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/user_list_string_rule_item_operator.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/user_list_type.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/vanity_pharma_display_url_mode.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/vanity_pharma_text.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/webpage_condition_operand.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/enums/webpage_condition_operator.proto,@go_googleapis//google/ads/googleads/v1/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/enums,@go_googleapis//google/ads/googleads/v1/enums:enums_go_proto -google/ads/googleads/v1/errors/account_budget_proposal_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/ad_customizer_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/ad_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/ad_group_ad_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/ad_group_bid_modifier_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/ad_group_criterion_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/ad_group_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/ad_group_feed_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/ad_parameter_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/ad_sharing_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/adx_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/asset_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/authentication_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/authorization_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/bidding_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/bidding_strategy_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/billing_setup_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/campaign_budget_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/campaign_criterion_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/campaign_draft_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/campaign_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/campaign_experiment_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/campaign_feed_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/campaign_shared_set_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/change_status_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/collection_size_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/context_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/conversion_action_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/conversion_adjustment_upload_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/conversion_upload_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/country_code_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/criterion_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/custom_interest_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/customer_client_link_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/customer_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/customer_feed_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/customer_manager_link_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/database_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/date_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/date_range_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/distinct_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/enum_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/errors.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/extension_feed_item_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/extension_setting_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/feed_attribute_reference_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/feed_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/feed_item_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/feed_item_target_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/feed_item_validation_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/feed_mapping_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/field_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/field_mask_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/function_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/function_parsing_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/geo_target_constant_suggestion_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/header_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/id_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/image_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/internal_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/keyword_plan_ad_group_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/keyword_plan_campaign_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/keyword_plan_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/keyword_plan_idea_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/keyword_plan_keyword_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/keyword_plan_negative_keyword_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/label_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/language_code_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/list_operation_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/manager_link_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/media_bundle_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/media_file_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/media_upload_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/multiplier_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/mutate_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/mutate_job_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/new_resource_creation_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/not_empty_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/not_whitelisted_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/null_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/operation_access_denied_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/operator_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/partial_failure_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/policy_finding_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/policy_validation_parameter_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/policy_violation_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/query_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/quota_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/range_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/recommendation_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/region_code_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/request_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/resource_access_denied_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/resource_count_limit_exceeded_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/setting_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/shared_criterion_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/shared_set_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/size_limit_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/string_format_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/string_length_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/url_field_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/user_list_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/errors/youtube_video_registration_error.proto,@go_googleapis//google/ads/googleads/v1/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/errors,@go_googleapis//google/ads/googleads/v1/errors:errors_go_proto -google/ads/googleads/v1/resources/account_budget.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/account_budget_proposal.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/ad.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/ad_group.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/ad_group_ad.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/ad_group_ad_label.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/ad_group_audience_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/ad_group_bid_modifier.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/ad_group_criterion.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/ad_group_criterion_label.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/ad_group_criterion_simulation.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/ad_group_extension_setting.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/ad_group_feed.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/ad_group_label.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/ad_group_simulation.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/ad_parameter.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/ad_schedule_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/age_range_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/asset.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/bidding_strategy.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/billing_setup.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/campaign.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/campaign_audience_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/campaign_bid_modifier.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/campaign_budget.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/campaign_criterion.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/campaign_criterion_simulation.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/campaign_draft.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/campaign_experiment.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/campaign_extension_setting.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/campaign_feed.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/campaign_label.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/campaign_shared_set.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/carrier_constant.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/change_status.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/click_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/conversion_action.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/custom_interest.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/customer.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/customer_client.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/customer_client_link.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/customer_extension_setting.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/customer_feed.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/customer_label.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/customer_manager_link.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/customer_negative_criterion.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/detail_placement_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/display_keyword_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/domain_category.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/dynamic_search_ads_search_term_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/expanded_landing_page_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/extension_feed_item.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/feed.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/feed_item.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/feed_item_target.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/feed_mapping.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/feed_placeholder_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/gender_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/geo_target_constant.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/geographic_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/google_ads_field.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/group_placement_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/hotel_group_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/hotel_performance_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/keyword_plan.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/keyword_plan_ad_group.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/keyword_plan_campaign.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/keyword_plan_keyword.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/keyword_plan_negative_keyword.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/keyword_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/label.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/landing_page_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/language_constant.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/location_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/managed_placement_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/media_file.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/merchant_center_link.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/mobile_app_category_constant.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/mobile_device_constant.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/mutate_job.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/operating_system_version_constant.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/paid_organic_search_term_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/parental_status_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/payments_account.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/product_bidding_category_constant.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/product_group_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/recommendation.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/remarketing_action.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/search_term_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/shared_criterion.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/shared_set.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/shopping_performance_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/topic_constant.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/topic_view.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/user_interest.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/user_list.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/resources/video.proto,@go_googleapis//google/ads/googleads/v1/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/resources,@go_googleapis//google/ads/googleads/v1/resources:resources_go_proto -google/ads/googleads/v1/services/account_budget_proposal_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/account_budget_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/ad_group_ad_label_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/ad_group_ad_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/ad_group_audience_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/ad_group_bid_modifier_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/ad_group_criterion_label_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/ad_group_criterion_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/ad_group_criterion_simulation_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/ad_group_extension_setting_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/ad_group_feed_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/ad_group_label_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/ad_group_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/ad_group_simulation_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/ad_parameter_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/ad_schedule_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/age_range_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/asset_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/bidding_strategy_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/billing_setup_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/campaign_audience_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/campaign_bid_modifier_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/campaign_budget_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/campaign_criterion_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/campaign_criterion_simulation_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/campaign_draft_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/campaign_experiment_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/campaign_extension_setting_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/campaign_feed_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/campaign_label_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/campaign_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/campaign_shared_set_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/carrier_constant_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/change_status_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/click_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/conversion_action_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/conversion_adjustment_upload_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/conversion_upload_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/custom_interest_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/customer_client_link_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/customer_client_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/customer_extension_setting_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/customer_feed_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/customer_label_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/customer_manager_link_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/customer_negative_criterion_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/customer_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/detail_placement_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/display_keyword_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/domain_category_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/dynamic_search_ads_search_term_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/expanded_landing_page_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/extension_feed_item_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/feed_item_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/feed_item_target_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/feed_mapping_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/feed_placeholder_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/feed_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/gender_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/geo_target_constant_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/geographic_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/google_ads_field_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/google_ads_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/group_placement_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/hotel_group_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/hotel_performance_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/keyword_plan_ad_group_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/keyword_plan_campaign_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/keyword_plan_idea_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/keyword_plan_keyword_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/keyword_plan_negative_keyword_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/keyword_plan_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/keyword_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/label_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/landing_page_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/language_constant_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/location_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/managed_placement_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/media_file_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/merchant_center_link_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/mobile_app_category_constant_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/mobile_device_constant_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/mutate_job_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/operating_system_version_constant_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/paid_organic_search_term_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/parental_status_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/payments_account_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/product_bidding_category_constant_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/product_group_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/recommendation_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/remarketing_action_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/search_term_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/shared_criterion_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/shared_set_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/shopping_performance_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/topic_constant_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/topic_view_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/user_interest_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/user_list_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v1/services/video_service.proto,@go_googleapis//google/ads/googleads/v1/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v1/services,@go_googleapis//google/ads/googleads/v1/services:services_go_proto -google/ads/googleads/v2/common/ad_asset.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/ad_type_infos.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/asset_types.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/bidding.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/click_location.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/criteria.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/criterion_category_availability.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/custom_parameter.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/dates.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/explorer_auto_optimizer_setting.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/extensions.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/feed_common.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/final_app_url.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/frequency_cap.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/keyword_plan_common.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/matching_function.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/metrics.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/policy.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/real_time_bidding_setting.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/segments.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/simulation.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/tag_snippet.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/targeting_setting.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/text_label.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/url_collection.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/user_lists.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/common/value.proto,@go_googleapis//google/ads/googleads/v2/common:common_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/common,@go_googleapis//google/ads/googleads/v2/common:common_go_proto -google/ads/googleads/v2/enums/access_reason.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/access_role.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/account_budget_proposal_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/account_budget_proposal_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/account_budget_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/ad_customizer_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/ad_group_ad_rotation_mode.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/ad_group_ad_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/ad_group_criterion_approval_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/ad_group_criterion_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/ad_group_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/ad_group_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/ad_network_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/ad_serving_optimization_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/ad_strength.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/ad_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/advertising_channel_sub_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/advertising_channel_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/affiliate_location_feed_relationship_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/affiliate_location_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/age_range_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/app_campaign_app_store.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/app_campaign_bidding_strategy_goal_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/app_payment_model_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/app_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/app_store.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/app_url_operating_system_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/asset_field_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/asset_performance_label.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/asset_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/attribution_model.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/bid_modifier_source.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/bidding_source.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/bidding_strategy_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/bidding_strategy_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/billing_setup_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/brand_safety_suitability.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/budget_delivery_method.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/budget_period.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/budget_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/budget_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/call_conversion_reporting_state.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/call_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/callout_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/campaign_criterion_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/campaign_draft_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/campaign_experiment_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/campaign_experiment_traffic_split_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/campaign_experiment_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/campaign_serving_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/campaign_shared_set_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/campaign_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/change_status_operation.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/change_status_resource_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/click_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/content_label_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/conversion_action_category.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/conversion_action_counting_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/conversion_action_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/conversion_action_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/conversion_adjustment_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/conversion_attribution_event_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/conversion_lag_bucket.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/conversion_or_adjustment_lag_bucket.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/criterion_category_channel_availability_mode.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/criterion_category_locale_availability_mode.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/criterion_system_serving_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/criterion_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/custom_interest_member_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/custom_interest_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/custom_interest_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/custom_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/customer_match_upload_key_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/customer_pay_per_conversion_eligibility_failure_reason.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/data_driven_model_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/day_of_week.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/device.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/display_ad_format_setting.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/display_upload_product_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/distance_bucket.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/dsa_page_feed_criterion_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/education_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/extension_setting_device.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/extension_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/external_conversion_source.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/feed_attribute_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/feed_item_quality_approval_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/feed_item_quality_disapproval_reason.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/feed_item_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/feed_item_target_device.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/feed_item_target_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/feed_item_validation_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/feed_link_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/feed_mapping_criterion_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/feed_mapping_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/feed_origin.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/feed_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/flight_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/frequency_cap_event_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/frequency_cap_level.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/frequency_cap_time_unit.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/gender_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/geo_target_constant_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/geo_targeting_restriction.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/geo_targeting_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/google_ads_field_category.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/google_ads_field_data_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/hotel_date_selection_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/hotel_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/hotel_price_bucket.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/hotel_rate_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/income_range_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/interaction_event_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/interaction_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/invoice_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/job_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/keyword_match_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/keyword_plan_competition_level.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/keyword_plan_forecast_interval.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/keyword_plan_network.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/label_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/legacy_app_install_ad_app_store.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/listing_custom_attribute_index.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/listing_group_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/local_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/location_extension_targeting_criterion_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/location_group_radius_units.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/location_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/manager_link_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/matching_function_context_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/matching_function_operator.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/media_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/merchant_center_link_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/message_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/mime_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/minute_of_hour.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/mobile_device_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/month_of_year.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/mutate_job_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/negative_geo_target_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/operating_system_version_operator_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/page_one_promoted_strategy_goal.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/parental_status_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/payment_mode.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/placeholder_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/placement_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/policy_approval_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/policy_review_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/policy_topic_entry_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/policy_topic_evidence_destination_mismatch_url_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/policy_topic_evidence_destination_not_working_device.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/policy_topic_evidence_destination_not_working_dns_error_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/positive_geo_target_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/preferred_content_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/price_extension_price_qualifier.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/price_extension_price_unit.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/price_extension_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/price_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/product_bidding_category_level.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/product_bidding_category_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/product_channel.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/product_channel_exclusivity.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/product_condition.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/product_type_level.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/promotion_extension_discount_modifier.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/promotion_extension_occasion.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/promotion_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/proximity_radius_units.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/quality_score_bucket.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/reach_plan_ad_length.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/reach_plan_age_range.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/real_estate_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/recommendation_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/search_engine_results_page_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/search_term_match_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/search_term_targeting_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/served_asset_field_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/shared_set_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/shared_set_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/simulation_modification_method.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/simulation_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/sitelink_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/slot.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/spending_limit_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/structured_snippet_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/system_managed_entity_source.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/target_cpa_opt_in_recommendation_goal.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/target_impression_share_location.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/targeting_dimension.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/time_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/tracking_code_page_format.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/tracking_code_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/travel_placeholder_field.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/user_interest_taxonomy_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/user_list_access_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/user_list_closing_reason.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/user_list_combined_rule_operator.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/user_list_crm_data_source_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/user_list_date_rule_item_operator.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/user_list_logical_rule_operator.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/user_list_membership_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/user_list_number_rule_item_operator.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/user_list_prepopulation_status.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/user_list_rule_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/user_list_size_range.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/user_list_string_rule_item_operator.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/user_list_type.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/vanity_pharma_display_url_mode.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/vanity_pharma_text.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/webpage_condition_operand.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/enums/webpage_condition_operator.proto,@go_googleapis//google/ads/googleads/v2/enums:enums_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/enums,@go_googleapis//google/ads/googleads/v2/enums:enums_go_proto -google/ads/googleads/v2/errors/access_invitation_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/account_budget_proposal_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/ad_customizer_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/ad_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/ad_group_ad_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/ad_group_bid_modifier_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/ad_group_criterion_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/ad_group_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/ad_group_feed_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/ad_parameter_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/ad_sharing_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/adx_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/asset_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/authentication_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/authorization_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/bidding_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/bidding_strategy_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/billing_setup_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/campaign_budget_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/campaign_criterion_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/campaign_draft_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/campaign_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/campaign_experiment_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/campaign_feed_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/campaign_shared_set_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/change_status_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/collection_size_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/context_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/conversion_action_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/conversion_adjustment_upload_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/conversion_upload_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/country_code_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/criterion_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/currency_code_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/custom_interest_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/customer_client_link_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/customer_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/customer_feed_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/customer_manager_link_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/database_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/date_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/date_range_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/distinct_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/enum_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/errors.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/extension_feed_item_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/extension_setting_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/feed_attribute_reference_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/feed_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/feed_item_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/feed_item_target_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/feed_item_validation_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/feed_mapping_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/field_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/field_mask_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/function_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/function_parsing_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/geo_target_constant_suggestion_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/header_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/id_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/image_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/internal_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/invoice_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/keyword_plan_ad_group_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/keyword_plan_campaign_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/keyword_plan_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/keyword_plan_idea_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/keyword_plan_keyword_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/keyword_plan_negative_keyword_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/label_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/language_code_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/list_operation_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/manager_link_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/media_bundle_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/media_file_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/media_upload_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/multiplier_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/mutate_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/mutate_job_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/new_resource_creation_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/not_empty_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/not_whitelisted_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/null_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/operation_access_denied_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/operator_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/partial_failure_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/policy_finding_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/policy_validation_parameter_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/policy_violation_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/query_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/quota_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/range_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/reach_plan_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/recommendation_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/region_code_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/request_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/resource_access_denied_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/resource_count_limit_exceeded_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/setting_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/shared_criterion_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/shared_set_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/size_limit_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/string_format_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/string_length_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/url_field_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/user_list_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/errors/youtube_video_registration_error.proto,@go_googleapis//google/ads/googleads/v2/errors:errors_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/errors,@go_googleapis//google/ads/googleads/v2/errors:errors_go_proto -google/ads/googleads/v2/resources/account_budget.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/account_budget_proposal.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/ad.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/ad_group.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/ad_group_ad.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/ad_group_ad_asset_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/ad_group_ad_label.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/ad_group_audience_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/ad_group_bid_modifier.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/ad_group_criterion.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/ad_group_criterion_label.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/ad_group_criterion_simulation.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/ad_group_extension_setting.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/ad_group_feed.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/ad_group_label.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/ad_group_simulation.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/ad_parameter.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/ad_schedule_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/age_range_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/asset.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/bidding_strategy.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/billing_setup.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/campaign.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/campaign_audience_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/campaign_bid_modifier.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/campaign_budget.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/campaign_criterion.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/campaign_criterion_simulation.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/campaign_draft.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/campaign_experiment.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/campaign_extension_setting.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/campaign_feed.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/campaign_label.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/campaign_shared_set.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/carrier_constant.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/change_status.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/click_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/conversion_action.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/custom_interest.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/customer.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/customer_client.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/customer_client_link.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/customer_extension_setting.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/customer_feed.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/customer_label.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/customer_manager_link.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/customer_negative_criterion.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/detail_placement_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/display_keyword_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/distance_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/domain_category.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/dynamic_search_ads_search_term_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/expanded_landing_page_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/extension_feed_item.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/feed.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/feed_item.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/feed_item_target.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/feed_mapping.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/feed_placeholder_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/gender_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/geo_target_constant.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/geographic_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/google_ads_field.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/group_placement_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/hotel_group_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/hotel_performance_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/invoice.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/keyword_plan.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/keyword_plan_ad_group.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/keyword_plan_campaign.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/keyword_plan_keyword.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/keyword_plan_negative_keyword.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/keyword_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/label.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/landing_page_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/language_constant.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/location_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/managed_placement_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/media_file.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/merchant_center_link.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/mobile_app_category_constant.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/mobile_device_constant.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/mutate_job.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/operating_system_version_constant.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/paid_organic_search_term_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/parental_status_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/payments_account.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/product_bidding_category_constant.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/product_group_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/recommendation.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/remarketing_action.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/search_term_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/shared_criterion.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/shared_set.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/shopping_performance_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/topic_constant.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/topic_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/user_interest.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/user_list.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/user_location_view.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/resources/video.proto,@go_googleapis//google/ads/googleads/v2/resources:resources_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/resources,@go_googleapis//google/ads/googleads/v2/resources:resources_go_proto -google/ads/googleads/v2/services/account_budget_proposal_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/account_budget_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/ad_group_ad_asset_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/ad_group_ad_label_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/ad_group_ad_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/ad_group_audience_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/ad_group_bid_modifier_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/ad_group_criterion_label_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/ad_group_criterion_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/ad_group_criterion_simulation_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/ad_group_extension_setting_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/ad_group_feed_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/ad_group_label_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/ad_group_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/ad_group_simulation_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/ad_parameter_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/ad_schedule_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/ad_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/age_range_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/asset_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/bidding_strategy_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/billing_setup_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/campaign_audience_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/campaign_bid_modifier_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/campaign_budget_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/campaign_criterion_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/campaign_criterion_simulation_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/campaign_draft_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/campaign_experiment_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/campaign_extension_setting_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/campaign_feed_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/campaign_label_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/campaign_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/campaign_shared_set_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/carrier_constant_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/change_status_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/click_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/conversion_action_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/conversion_adjustment_upload_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/conversion_upload_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/custom_interest_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/customer_client_link_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/customer_client_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/customer_extension_setting_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/customer_feed_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/customer_label_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/customer_manager_link_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/customer_negative_criterion_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/customer_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/detail_placement_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/display_keyword_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/distance_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/domain_category_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/dynamic_search_ads_search_term_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/expanded_landing_page_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/extension_feed_item_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/feed_item_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/feed_item_target_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/feed_mapping_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/feed_placeholder_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/feed_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/gender_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/geo_target_constant_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/geographic_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/google_ads_field_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/google_ads_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/group_placement_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/hotel_group_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/hotel_performance_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/invoice_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/keyword_plan_ad_group_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/keyword_plan_campaign_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/keyword_plan_idea_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/keyword_plan_keyword_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/keyword_plan_negative_keyword_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/keyword_plan_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/keyword_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/label_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/landing_page_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/language_constant_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/location_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/managed_placement_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/media_file_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/merchant_center_link_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/mobile_app_category_constant_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/mobile_device_constant_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/mutate_job_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/operating_system_version_constant_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/paid_organic_search_term_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/parental_status_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/payments_account_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/product_bidding_category_constant_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/product_group_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/reach_plan_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/recommendation_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/remarketing_action_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/search_term_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/shared_criterion_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/shared_set_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/shopping_performance_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/topic_constant_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/topic_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/user_interest_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/user_list_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/user_location_view_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/ads/googleads/v2/services/video_service.proto,@go_googleapis//google/ads/googleads/v2/services:services_proto,google.golang.org/genproto/googleapis/ads/googleads/v2/services,@go_googleapis//google/ads/googleads/v2/services:services_go_proto -google/api/annotations.proto,@go_googleapis//google/api:annotations_proto,google.golang.org/genproto/googleapis/api/annotations,@go_googleapis//google/api:annotations_go_proto -google/api/auth.proto,@go_googleapis//google/api:serviceconfig_proto,google.golang.org/genproto/googleapis/api/serviceconfig,@go_googleapis//google/api:serviceconfig_go_proto -google/api/backend.proto,@go_googleapis//google/api:serviceconfig_proto,google.golang.org/genproto/googleapis/api/serviceconfig,@go_googleapis//google/api:serviceconfig_go_proto -google/api/billing.proto,@go_googleapis//google/api:serviceconfig_proto,google.golang.org/genproto/googleapis/api/serviceconfig,@go_googleapis//google/api:serviceconfig_go_proto -google/api/client.proto,@go_googleapis//google/api:annotations_proto,google.golang.org/genproto/googleapis/api/annotations,@go_googleapis//google/api:annotations_go_proto -google/api/config_change.proto,@go_googleapis//google/api:configchange_proto,google.golang.org/genproto/googleapis/api/configchange,@go_googleapis//google/api:configchange_go_proto -google/api/consumer.proto,@go_googleapis//google/api:serviceconfig_proto,google.golang.org/genproto/googleapis/api/serviceconfig,@go_googleapis//google/api:serviceconfig_go_proto -google/api/context.proto,@go_googleapis//google/api:serviceconfig_proto,google.golang.org/genproto/googleapis/api/serviceconfig,@go_googleapis//google/api:serviceconfig_go_proto -google/api/control.proto,@go_googleapis//google/api:serviceconfig_proto,google.golang.org/genproto/googleapis/api/serviceconfig,@go_googleapis//google/api:serviceconfig_go_proto -google/api/distribution.proto,@go_googleapis//google/api:distribution_proto,google.golang.org/genproto/googleapis/api/distribution,@go_googleapis//google/api:distribution_go_proto -google/api/documentation.proto,@go_googleapis//google/api:serviceconfig_proto,google.golang.org/genproto/googleapis/api/serviceconfig,@go_googleapis//google/api:serviceconfig_go_proto -google/api/endpoint.proto,@go_googleapis//google/api:serviceconfig_proto,google.golang.org/genproto/googleapis/api/serviceconfig,@go_googleapis//google/api:serviceconfig_go_proto -google/api/expr/v1alpha1/cel_service.proto,@go_googleapis//google/api/expr/v1alpha1:expr_proto,google.golang.org/genproto/googleapis/api/expr/v1alpha1,@go_googleapis//google/api/expr/v1alpha1:expr_go_proto -google/api/expr/v1alpha1/checked.proto,@go_googleapis//google/api/expr/v1alpha1:expr_proto,google.golang.org/genproto/googleapis/api/expr/v1alpha1,@go_googleapis//google/api/expr/v1alpha1:expr_go_proto -google/api/expr/v1alpha1/conformance_service.proto,@go_googleapis//google/api/expr/v1alpha1:expr_proto,google.golang.org/genproto/googleapis/api/expr/v1alpha1,@go_googleapis//google/api/expr/v1alpha1:expr_go_proto -google/api/expr/v1alpha1/eval.proto,@go_googleapis//google/api/expr/v1alpha1:expr_proto,google.golang.org/genproto/googleapis/api/expr/v1alpha1,@go_googleapis//google/api/expr/v1alpha1:expr_go_proto -google/api/expr/v1alpha1/explain.proto,@go_googleapis//google/api/expr/v1alpha1:expr_proto,google.golang.org/genproto/googleapis/api/expr/v1alpha1,@go_googleapis//google/api/expr/v1alpha1:expr_go_proto -google/api/expr/v1alpha1/syntax.proto,@go_googleapis//google/api/expr/v1alpha1:expr_proto,google.golang.org/genproto/googleapis/api/expr/v1alpha1,@go_googleapis//google/api/expr/v1alpha1:expr_go_proto -google/api/expr/v1alpha1/value.proto,@go_googleapis//google/api/expr/v1alpha1:expr_proto,google.golang.org/genproto/googleapis/api/expr/v1alpha1,@go_googleapis//google/api/expr/v1alpha1:expr_go_proto -google/api/expr/v1beta1/decl.proto,@go_googleapis//google/api/expr/v1beta1:expr_proto,google.golang.org/genproto/googleapis/api/expr/v1beta1,@go_googleapis//google/api/expr/v1beta1:expr_go_proto -google/api/expr/v1beta1/eval.proto,@go_googleapis//google/api/expr/v1beta1:expr_proto,google.golang.org/genproto/googleapis/api/expr/v1beta1,@go_googleapis//google/api/expr/v1beta1:expr_go_proto -google/api/expr/v1beta1/expr.proto,@go_googleapis//google/api/expr/v1beta1:expr_proto,google.golang.org/genproto/googleapis/api/expr/v1beta1,@go_googleapis//google/api/expr/v1beta1:expr_go_proto -google/api/expr/v1beta1/source.proto,@go_googleapis//google/api/expr/v1beta1:expr_proto,google.golang.org/genproto/googleapis/api/expr/v1beta1,@go_googleapis//google/api/expr/v1beta1:expr_go_proto -google/api/expr/v1beta1/value.proto,@go_googleapis//google/api/expr/v1beta1:expr_proto,google.golang.org/genproto/googleapis/api/expr/v1beta1,@go_googleapis//google/api/expr/v1beta1:expr_go_proto -google/api/field_behavior.proto,@go_googleapis//google/api:annotations_proto,google.golang.org/genproto/googleapis/api/annotations,@go_googleapis//google/api:annotations_go_proto -google/api/http.proto,@go_googleapis//google/api:annotations_proto,google.golang.org/genproto/googleapis/api/annotations,@go_googleapis//google/api:annotations_go_proto -google/api/httpbody.proto,@go_googleapis//google/api:httpbody_proto,google.golang.org/genproto/googleapis/api/httpbody,@go_googleapis//google/api:httpbody_go_proto -google/api/label.proto,@go_googleapis//google/api:label_proto,google.golang.org/genproto/googleapis/api/label,@go_googleapis//google/api:label_go_proto -google/api/launch_stage.proto,@go_googleapis//google/api:api_proto,google.golang.org/genproto/googleapis/api,@go_googleapis//google/api:api_go_proto -google/api/log.proto,@go_googleapis//google/api:serviceconfig_proto,google.golang.org/genproto/googleapis/api/serviceconfig,@go_googleapis//google/api:serviceconfig_go_proto -google/api/logging.proto,@go_googleapis//google/api:serviceconfig_proto,google.golang.org/genproto/googleapis/api/serviceconfig,@go_googleapis//google/api:serviceconfig_go_proto -google/api/metric.proto,@go_googleapis//google/api:metric_proto,google.golang.org/genproto/googleapis/api/metric,@go_googleapis//google/api:metric_go_proto -google/api/monitored_resource.proto,@go_googleapis//google/api:monitoredres_proto,google.golang.org/genproto/googleapis/api/monitoredres,@go_googleapis//google/api:monitoredres_go_proto -google/api/monitoring.proto,@go_googleapis//google/api:serviceconfig_proto,google.golang.org/genproto/googleapis/api/serviceconfig,@go_googleapis//google/api:serviceconfig_go_proto -google/api/quota.proto,@go_googleapis//google/api:serviceconfig_proto,google.golang.org/genproto/googleapis/api/serviceconfig,@go_googleapis//google/api:serviceconfig_go_proto -google/api/resource.proto,@go_googleapis//google/api:annotations_proto,google.golang.org/genproto/googleapis/api/annotations,@go_googleapis//google/api:annotations_go_proto -google/api/service.proto,@go_googleapis//google/api:serviceconfig_proto,google.golang.org/genproto/googleapis/api/serviceconfig,@go_googleapis//google/api:serviceconfig_go_proto -google/api/servicecontrol/v1/check_error.proto,@go_googleapis//google/api/servicecontrol/v1:servicecontrol_proto,google.golang.org/genproto/googleapis/api/servicecontrol/v1,@go_googleapis//google/api/servicecontrol/v1:servicecontrol_go_proto -google/api/servicecontrol/v1/distribution.proto,@go_googleapis//google/api/servicecontrol/v1:servicecontrol_proto,google.golang.org/genproto/googleapis/api/servicecontrol/v1,@go_googleapis//google/api/servicecontrol/v1:servicecontrol_go_proto -google/api/servicecontrol/v1/log_entry.proto,@go_googleapis//google/api/servicecontrol/v1:servicecontrol_proto,google.golang.org/genproto/googleapis/api/servicecontrol/v1,@go_googleapis//google/api/servicecontrol/v1:servicecontrol_go_proto -google/api/servicecontrol/v1/metric_value.proto,@go_googleapis//google/api/servicecontrol/v1:servicecontrol_proto,google.golang.org/genproto/googleapis/api/servicecontrol/v1,@go_googleapis//google/api/servicecontrol/v1:servicecontrol_go_proto -google/api/servicecontrol/v1/operation.proto,@go_googleapis//google/api/servicecontrol/v1:servicecontrol_proto,google.golang.org/genproto/googleapis/api/servicecontrol/v1,@go_googleapis//google/api/servicecontrol/v1:servicecontrol_go_proto -google/api/servicecontrol/v1/quota_controller.proto,@go_googleapis//google/api/servicecontrol/v1:servicecontrol_proto,google.golang.org/genproto/googleapis/api/servicecontrol/v1,@go_googleapis//google/api/servicecontrol/v1:servicecontrol_go_proto -google/api/servicecontrol/v1/service_controller.proto,@go_googleapis//google/api/servicecontrol/v1:servicecontrol_proto,google.golang.org/genproto/googleapis/api/servicecontrol/v1,@go_googleapis//google/api/servicecontrol/v1:servicecontrol_go_proto -google/api/servicemanagement/v1/resources.proto,@go_googleapis//google/api/servicemanagement/v1:servicemanagement_proto,google.golang.org/genproto/googleapis/api/servicemanagement/v1,@go_googleapis//google/api/servicemanagement/v1:servicemanagement_go_proto -google/api/servicemanagement/v1/servicemanager.proto,@go_googleapis//google/api/servicemanagement/v1:servicemanagement_proto,google.golang.org/genproto/googleapis/api/servicemanagement/v1,@go_googleapis//google/api/servicemanagement/v1:servicemanagement_go_proto -google/api/source_info.proto,@go_googleapis//google/api:serviceconfig_proto,google.golang.org/genproto/googleapis/api/serviceconfig,@go_googleapis//google/api:serviceconfig_go_proto -google/api/system_parameter.proto,@go_googleapis//google/api:serviceconfig_proto,google.golang.org/genproto/googleapis/api/serviceconfig,@go_googleapis//google/api:serviceconfig_go_proto -google/api/usage.proto,@go_googleapis//google/api:serviceconfig_proto,google.golang.org/genproto/googleapis/api/serviceconfig,@go_googleapis//google/api:serviceconfig_go_proto -google/appengine/legacy/audit_data.proto,@go_googleapis//google/appengine/legacy:legacy_proto,google.golang.org/genproto/googleapis/appengine/legacy,@go_googleapis//google/appengine/legacy:legacy_go_proto -google/appengine/logging/v1/request_log.proto,@go_googleapis//google/appengine/logging/v1:logging_proto,google.golang.org/genproto/googleapis/appengine/logging/v1,@go_googleapis//google/appengine/logging/v1:logging_go_proto -google/appengine/v1/app_yaml.proto,@go_googleapis//google/appengine/v1:appengine_proto,google.golang.org/genproto/googleapis/appengine/v1,@go_googleapis//google/appengine/v1:appengine_go_proto -google/appengine/v1/appengine.proto,@go_googleapis//google/appengine/v1:appengine_proto,google.golang.org/genproto/googleapis/appengine/v1,@go_googleapis//google/appengine/v1:appengine_go_proto -google/appengine/v1/application.proto,@go_googleapis//google/appengine/v1:appengine_proto,google.golang.org/genproto/googleapis/appengine/v1,@go_googleapis//google/appengine/v1:appengine_go_proto -google/appengine/v1/audit_data.proto,@go_googleapis//google/appengine/v1:appengine_proto,google.golang.org/genproto/googleapis/appengine/v1,@go_googleapis//google/appengine/v1:appengine_go_proto -google/appengine/v1/deploy.proto,@go_googleapis//google/appengine/v1:appengine_proto,google.golang.org/genproto/googleapis/appengine/v1,@go_googleapis//google/appengine/v1:appengine_go_proto -google/appengine/v1/instance.proto,@go_googleapis//google/appengine/v1:appengine_proto,google.golang.org/genproto/googleapis/appengine/v1,@go_googleapis//google/appengine/v1:appengine_go_proto -google/appengine/v1/location.proto,@go_googleapis//google/appengine/v1:appengine_proto,google.golang.org/genproto/googleapis/appengine/v1,@go_googleapis//google/appengine/v1:appengine_go_proto -google/appengine/v1/operation.proto,@go_googleapis//google/appengine/v1:appengine_proto,google.golang.org/genproto/googleapis/appengine/v1,@go_googleapis//google/appengine/v1:appengine_go_proto -google/appengine/v1/service.proto,@go_googleapis//google/appengine/v1:appengine_proto,google.golang.org/genproto/googleapis/appengine/v1,@go_googleapis//google/appengine/v1:appengine_go_proto -google/appengine/v1/version.proto,@go_googleapis//google/appengine/v1:appengine_proto,google.golang.org/genproto/googleapis/appengine/v1,@go_googleapis//google/appengine/v1:appengine_go_proto -google/assistant/embedded/v1alpha1/embedded_assistant.proto,@go_googleapis//google/assistant/embedded/v1alpha1:embedded_proto,google.golang.org/genproto/googleapis/assistant/embedded/v1alpha1,@go_googleapis//google/assistant/embedded/v1alpha1:embedded_go_proto -google/assistant/embedded/v1alpha2/embedded_assistant.proto,@go_googleapis//google/assistant/embedded/v1alpha2:embedded_proto,google.golang.org/genproto/googleapis/assistant/embedded/v1alpha2,@go_googleapis//google/assistant/embedded/v1alpha2:embedded_go_proto -google/bigtable/admin/cluster/v1/bigtable_cluster_data.proto,@go_googleapis//google/bigtable/admin/cluster/v1:cluster_proto,google.golang.org/genproto/googleapis/bigtable/admin/cluster/v1,@go_googleapis//google/bigtable/admin/cluster/v1:cluster_go_proto -google/bigtable/admin/cluster/v1/bigtable_cluster_service.proto,@go_googleapis//google/bigtable/admin/cluster/v1:cluster_proto,google.golang.org/genproto/googleapis/bigtable/admin/cluster/v1,@go_googleapis//google/bigtable/admin/cluster/v1:cluster_go_proto -google/bigtable/admin/cluster/v1/bigtable_cluster_service_messages.proto,@go_googleapis//google/bigtable/admin/cluster/v1:cluster_proto,google.golang.org/genproto/googleapis/bigtable/admin/cluster/v1,@go_googleapis//google/bigtable/admin/cluster/v1:cluster_go_proto -google/bigtable/admin/table/v1/bigtable_table_data.proto,@go_googleapis//google/bigtable/admin/table/v1:table_proto,google.golang.org/genproto/googleapis/bigtable/admin/table/v1,@go_googleapis//google/bigtable/admin/table/v1:table_go_proto -google/bigtable/admin/table/v1/bigtable_table_service.proto,@go_googleapis//google/bigtable/admin/table/v1:table_proto,google.golang.org/genproto/googleapis/bigtable/admin/table/v1,@go_googleapis//google/bigtable/admin/table/v1:table_go_proto -google/bigtable/admin/table/v1/bigtable_table_service_messages.proto,@go_googleapis//google/bigtable/admin/table/v1:table_proto,google.golang.org/genproto/googleapis/bigtable/admin/table/v1,@go_googleapis//google/bigtable/admin/table/v1:table_go_proto -google/bigtable/admin/v2/bigtable_instance_admin.proto,@go_googleapis//google/bigtable/admin/v2:admin_proto,google.golang.org/genproto/googleapis/bigtable/admin/v2,@go_googleapis//google/bigtable/admin/v2:admin_go_proto -google/bigtable/admin/v2/bigtable_table_admin.proto,@go_googleapis//google/bigtable/admin/v2:admin_proto,google.golang.org/genproto/googleapis/bigtable/admin/v2,@go_googleapis//google/bigtable/admin/v2:admin_go_proto -google/bigtable/admin/v2/common.proto,@go_googleapis//google/bigtable/admin/v2:admin_proto,google.golang.org/genproto/googleapis/bigtable/admin/v2,@go_googleapis//google/bigtable/admin/v2:admin_go_proto -google/bigtable/admin/v2/instance.proto,@go_googleapis//google/bigtable/admin/v2:admin_proto,google.golang.org/genproto/googleapis/bigtable/admin/v2,@go_googleapis//google/bigtable/admin/v2:admin_go_proto -google/bigtable/admin/v2/table.proto,@go_googleapis//google/bigtable/admin/v2:admin_proto,google.golang.org/genproto/googleapis/bigtable/admin/v2,@go_googleapis//google/bigtable/admin/v2:admin_go_proto -google/bigtable/v1/bigtable_data.proto,@go_googleapis//google/bigtable/v1:bigtable_proto,google.golang.org/genproto/googleapis/bigtable/v1,@go_googleapis//google/bigtable/v1:bigtable_go_proto -google/bigtable/v1/bigtable_service.proto,@go_googleapis//google/bigtable/v1:bigtable_proto,google.golang.org/genproto/googleapis/bigtable/v1,@go_googleapis//google/bigtable/v1:bigtable_go_proto -google/bigtable/v1/bigtable_service_messages.proto,@go_googleapis//google/bigtable/v1:bigtable_proto,google.golang.org/genproto/googleapis/bigtable/v1,@go_googleapis//google/bigtable/v1:bigtable_go_proto -google/bigtable/v2/bigtable.proto,@go_googleapis//google/bigtable/v2:bigtable_proto,google.golang.org/genproto/googleapis/bigtable/v2,@go_googleapis//google/bigtable/v2:bigtable_go_proto -google/bigtable/v2/data.proto,@go_googleapis//google/bigtable/v2:bigtable_proto,google.golang.org/genproto/googleapis/bigtable/v2,@go_googleapis//google/bigtable/v2:bigtable_go_proto -google/bytestream/bytestream.proto,@go_googleapis//google/bytestream:bytestream_proto,google.golang.org/genproto/googleapis/bytestream,@go_googleapis//google/bytestream:bytestream_go_proto -google/cloud/asset/v1/asset_service.proto,@go_googleapis//google/cloud/asset/v1:asset_proto,google.golang.org/genproto/googleapis/cloud/asset/v1,@go_googleapis//google/cloud/asset/v1:asset_go_proto -google/cloud/asset/v1/assets.proto,@go_googleapis//google/cloud/asset/v1:asset_proto,google.golang.org/genproto/googleapis/cloud/asset/v1,@go_googleapis//google/cloud/asset/v1:asset_go_proto -google/cloud/asset/v1beta1/asset_service.proto,@go_googleapis//google/cloud/asset/v1beta1:asset_proto,google.golang.org/genproto/googleapis/cloud/asset/v1beta1,@go_googleapis//google/cloud/asset/v1beta1:asset_go_proto -google/cloud/asset/v1beta1/assets.proto,@go_googleapis//google/cloud/asset/v1beta1:asset_proto,google.golang.org/genproto/googleapis/cloud/asset/v1beta1,@go_googleapis//google/cloud/asset/v1beta1:asset_go_proto -google/cloud/asset/v1p2beta1/asset_service.proto,@go_googleapis//google/cloud/asset/v1p2beta1:asset_proto,google.golang.org/genproto/googleapis/cloud/asset/v1p2beta1,@go_googleapis//google/cloud/asset/v1p2beta1:asset_go_proto -google/cloud/asset/v1p2beta1/assets.proto,@go_googleapis//google/cloud/asset/v1p2beta1:asset_proto,google.golang.org/genproto/googleapis/cloud/asset/v1p2beta1,@go_googleapis//google/cloud/asset/v1p2beta1:asset_go_proto -google/cloud/audit/audit_log.proto,@go_googleapis//google/cloud/audit:audit_proto,google.golang.org/genproto/googleapis/cloud/audit,@go_googleapis//google/cloud/audit:audit_go_proto -google/cloud/automl/v1/annotation_payload.proto,@go_googleapis//google/cloud/automl/v1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1,@go_googleapis//google/cloud/automl/v1:automl_go_proto -google/cloud/automl/v1/data_items.proto,@go_googleapis//google/cloud/automl/v1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1,@go_googleapis//google/cloud/automl/v1:automl_go_proto -google/cloud/automl/v1/dataset.proto,@go_googleapis//google/cloud/automl/v1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1,@go_googleapis//google/cloud/automl/v1:automl_go_proto -google/cloud/automl/v1/io.proto,@go_googleapis//google/cloud/automl/v1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1,@go_googleapis//google/cloud/automl/v1:automl_go_proto -google/cloud/automl/v1/model.proto,@go_googleapis//google/cloud/automl/v1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1,@go_googleapis//google/cloud/automl/v1:automl_go_proto -google/cloud/automl/v1/model_evaluation.proto,@go_googleapis//google/cloud/automl/v1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1,@go_googleapis//google/cloud/automl/v1:automl_go_proto -google/cloud/automl/v1/operations.proto,@go_googleapis//google/cloud/automl/v1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1,@go_googleapis//google/cloud/automl/v1:automl_go_proto -google/cloud/automl/v1/prediction_service.proto,@go_googleapis//google/cloud/automl/v1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1,@go_googleapis//google/cloud/automl/v1:automl_go_proto -google/cloud/automl/v1/service.proto,@go_googleapis//google/cloud/automl/v1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1,@go_googleapis//google/cloud/automl/v1:automl_go_proto -google/cloud/automl/v1/translation.proto,@go_googleapis//google/cloud/automl/v1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1,@go_googleapis//google/cloud/automl/v1:automl_go_proto -google/cloud/automl/v1beta1/annotation_payload.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/annotation_spec.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/classification.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/column_spec.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/data_items.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/data_stats.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/data_types.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/dataset.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/detection.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/geometry.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/image.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/io.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/model.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/model_evaluation.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/operations.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/prediction_service.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/ranges.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/regression.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/service.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/table_spec.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/tables.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/temporal.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/text.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/text_extraction.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/text_segment.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/text_sentiment.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/translation.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/automl/v1beta1/video.proto,@go_googleapis//google/cloud/automl/v1beta1:automl_proto,google.golang.org/genproto/googleapis/cloud/automl/v1beta1,@go_googleapis//google/cloud/automl/v1beta1:automl_go_proto -google/cloud/bigquery/datatransfer/v1/datasource.proto,@go_googleapis//google/cloud/bigquery/datatransfer/v1:datatransfer_proto,google.golang.org/genproto/googleapis/cloud/bigquery/datatransfer/v1,@go_googleapis//google/cloud/bigquery/datatransfer/v1:datatransfer_go_proto -google/cloud/bigquery/datatransfer/v1/datatransfer.proto,@go_googleapis//google/cloud/bigquery/datatransfer/v1:datatransfer_proto,google.golang.org/genproto/googleapis/cloud/bigquery/datatransfer/v1,@go_googleapis//google/cloud/bigquery/datatransfer/v1:datatransfer_go_proto -google/cloud/bigquery/datatransfer/v1/transfer.proto,@go_googleapis//google/cloud/bigquery/datatransfer/v1:datatransfer_proto,google.golang.org/genproto/googleapis/cloud/bigquery/datatransfer/v1,@go_googleapis//google/cloud/bigquery/datatransfer/v1:datatransfer_go_proto -google/cloud/bigquery/logging/v1/audit_data.proto,@go_googleapis//google/cloud/bigquery/logging/v1:logging_proto,google.golang.org/genproto/googleapis/cloud/bigquery/logging/v1,@go_googleapis//google/cloud/bigquery/logging/v1:logging_go_proto -google/cloud/bigquery/storage/v1beta1/arrow.proto,@go_googleapis//google/cloud/bigquery/storage/v1beta1:storage_proto,google.golang.org/genproto/googleapis/cloud/bigquery/storage/v1beta1,@go_googleapis//google/cloud/bigquery/storage/v1beta1:storage_go_proto -google/cloud/bigquery/storage/v1beta1/avro.proto,@go_googleapis//google/cloud/bigquery/storage/v1beta1:storage_proto,google.golang.org/genproto/googleapis/cloud/bigquery/storage/v1beta1,@go_googleapis//google/cloud/bigquery/storage/v1beta1:storage_go_proto -google/cloud/bigquery/storage/v1beta1/read_options.proto,@go_googleapis//google/cloud/bigquery/storage/v1beta1:storage_proto,google.golang.org/genproto/googleapis/cloud/bigquery/storage/v1beta1,@go_googleapis//google/cloud/bigquery/storage/v1beta1:storage_go_proto -google/cloud/bigquery/storage/v1beta1/storage.proto,@go_googleapis//google/cloud/bigquery/storage/v1beta1:storage_proto,google.golang.org/genproto/googleapis/cloud/bigquery/storage/v1beta1,@go_googleapis//google/cloud/bigquery/storage/v1beta1:storage_go_proto -google/cloud/bigquery/storage/v1beta1/table_reference.proto,@go_googleapis//google/cloud/bigquery/storage/v1beta1:storage_proto,google.golang.org/genproto/googleapis/cloud/bigquery/storage/v1beta1,@go_googleapis//google/cloud/bigquery/storage/v1beta1:storage_go_proto -google/cloud/bigquery/v2/encryption_config.proto,@go_googleapis//google/cloud/bigquery/v2:bigquery_proto,google.golang.org/genproto/googleapis/cloud/bigquery/v2,@go_googleapis//google/cloud/bigquery/v2:bigquery_go_proto -google/cloud/bigquery/v2/model.proto,@go_googleapis//google/cloud/bigquery/v2:bigquery_proto,google.golang.org/genproto/googleapis/cloud/bigquery/v2,@go_googleapis//google/cloud/bigquery/v2:bigquery_go_proto -google/cloud/bigquery/v2/model_reference.proto,@go_googleapis//google/cloud/bigquery/v2:bigquery_proto,google.golang.org/genproto/googleapis/cloud/bigquery/v2,@go_googleapis//google/cloud/bigquery/v2:bigquery_go_proto -google/cloud/bigquery/v2/standard_sql.proto,@go_googleapis//google/cloud/bigquery/v2:bigquery_proto,google.golang.org/genproto/googleapis/cloud/bigquery/v2,@go_googleapis//google/cloud/bigquery/v2:bigquery_go_proto -google/cloud/billing/v1/cloud_billing.proto,@go_googleapis//google/cloud/billing/v1:billing_proto,google.golang.org/genproto/googleapis/cloud/billing/v1,@go_googleapis//google/cloud/billing/v1:billing_go_proto -google/cloud/binaryauthorization/v1beta1/resources.proto,@go_googleapis//google/cloud/binaryauthorization/v1beta1:binaryauthorization_proto,google.golang.org/genproto/googleapis/cloud/binaryauthorization/v1beta1,@go_googleapis//google/cloud/binaryauthorization/v1beta1:binaryauthorization_go_proto -google/cloud/binaryauthorization/v1beta1/service.proto,@go_googleapis//google/cloud/binaryauthorization/v1beta1:binaryauthorization_proto,google.golang.org/genproto/googleapis/cloud/binaryauthorization/v1beta1,@go_googleapis//google/cloud/binaryauthorization/v1beta1:binaryauthorization_go_proto -google/cloud/datacatalog/v1beta1/datacatalog.proto,@go_googleapis//google/cloud/datacatalog/v1beta1:datacatalog_proto,google.golang.org/genproto/googleapis/cloud/datacatalog/v1beta1,@go_googleapis//google/cloud/datacatalog/v1beta1:datacatalog_go_proto -google/cloud/datacatalog/v1beta1/gcs_fileset_spec.proto,@go_googleapis//google/cloud/datacatalog/v1beta1:datacatalog_proto,google.golang.org/genproto/googleapis/cloud/datacatalog/v1beta1,@go_googleapis//google/cloud/datacatalog/v1beta1:datacatalog_go_proto -google/cloud/datacatalog/v1beta1/schema.proto,@go_googleapis//google/cloud/datacatalog/v1beta1:datacatalog_proto,google.golang.org/genproto/googleapis/cloud/datacatalog/v1beta1,@go_googleapis//google/cloud/datacatalog/v1beta1:datacatalog_go_proto -google/cloud/datacatalog/v1beta1/search.proto,@go_googleapis//google/cloud/datacatalog/v1beta1:datacatalog_proto,google.golang.org/genproto/googleapis/cloud/datacatalog/v1beta1,@go_googleapis//google/cloud/datacatalog/v1beta1:datacatalog_go_proto -google/cloud/datacatalog/v1beta1/table_spec.proto,@go_googleapis//google/cloud/datacatalog/v1beta1:datacatalog_proto,google.golang.org/genproto/googleapis/cloud/datacatalog/v1beta1,@go_googleapis//google/cloud/datacatalog/v1beta1:datacatalog_go_proto -google/cloud/datacatalog/v1beta1/tags.proto,@go_googleapis//google/cloud/datacatalog/v1beta1:datacatalog_proto,google.golang.org/genproto/googleapis/cloud/datacatalog/v1beta1,@go_googleapis//google/cloud/datacatalog/v1beta1:datacatalog_go_proto -google/cloud/datacatalog/v1beta1/timestamps.proto,@go_googleapis//google/cloud/datacatalog/v1beta1:datacatalog_proto,google.golang.org/genproto/googleapis/cloud/datacatalog/v1beta1,@go_googleapis//google/cloud/datacatalog/v1beta1:datacatalog_go_proto -google/cloud/datalabeling/v1beta1/annotation.proto,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_proto,google.golang.org/genproto/googleapis/cloud/datalabeling/v1beta1,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_go_proto -google/cloud/datalabeling/v1beta1/annotation_spec_set.proto,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_proto,google.golang.org/genproto/googleapis/cloud/datalabeling/v1beta1,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_go_proto -google/cloud/datalabeling/v1beta1/data_labeling_service.proto,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_proto,google.golang.org/genproto/googleapis/cloud/datalabeling/v1beta1,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_go_proto -google/cloud/datalabeling/v1beta1/data_payloads.proto,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_proto,google.golang.org/genproto/googleapis/cloud/datalabeling/v1beta1,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_go_proto -google/cloud/datalabeling/v1beta1/dataset.proto,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_proto,google.golang.org/genproto/googleapis/cloud/datalabeling/v1beta1,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_go_proto -google/cloud/datalabeling/v1beta1/evaluation.proto,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_proto,google.golang.org/genproto/googleapis/cloud/datalabeling/v1beta1,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_go_proto -google/cloud/datalabeling/v1beta1/evaluation_job.proto,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_proto,google.golang.org/genproto/googleapis/cloud/datalabeling/v1beta1,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_go_proto -google/cloud/datalabeling/v1beta1/human_annotation_config.proto,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_proto,google.golang.org/genproto/googleapis/cloud/datalabeling/v1beta1,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_go_proto -google/cloud/datalabeling/v1beta1/instruction.proto,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_proto,google.golang.org/genproto/googleapis/cloud/datalabeling/v1beta1,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_go_proto -google/cloud/datalabeling/v1beta1/operations.proto,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_proto,google.golang.org/genproto/googleapis/cloud/datalabeling/v1beta1,@go_googleapis//google/cloud/datalabeling/v1beta1:datalabeling_go_proto -google/cloud/dataproc/v1/autoscaling_policies.proto,@go_googleapis//google/cloud/dataproc/v1:dataproc_proto,google.golang.org/genproto/googleapis/cloud/dataproc/v1,@go_googleapis//google/cloud/dataproc/v1:dataproc_go_proto -google/cloud/dataproc/v1/clusters.proto,@go_googleapis//google/cloud/dataproc/v1:dataproc_proto,google.golang.org/genproto/googleapis/cloud/dataproc/v1,@go_googleapis//google/cloud/dataproc/v1:dataproc_go_proto -google/cloud/dataproc/v1/jobs.proto,@go_googleapis//google/cloud/dataproc/v1:dataproc_proto,google.golang.org/genproto/googleapis/cloud/dataproc/v1,@go_googleapis//google/cloud/dataproc/v1:dataproc_go_proto -google/cloud/dataproc/v1/operations.proto,@go_googleapis//google/cloud/dataproc/v1:dataproc_proto,google.golang.org/genproto/googleapis/cloud/dataproc/v1,@go_googleapis//google/cloud/dataproc/v1:dataproc_go_proto -google/cloud/dataproc/v1/shared.proto,@go_googleapis//google/cloud/dataproc/v1:dataproc_proto,google.golang.org/genproto/googleapis/cloud/dataproc/v1,@go_googleapis//google/cloud/dataproc/v1:dataproc_go_proto -google/cloud/dataproc/v1/workflow_templates.proto,@go_googleapis//google/cloud/dataproc/v1:dataproc_proto,google.golang.org/genproto/googleapis/cloud/dataproc/v1,@go_googleapis//google/cloud/dataproc/v1:dataproc_go_proto -google/cloud/dataproc/v1beta2/autoscaling_policies.proto,@go_googleapis//google/cloud/dataproc/v1beta2:dataproc_proto,google.golang.org/genproto/googleapis/cloud/dataproc/v1beta2,@go_googleapis//google/cloud/dataproc/v1beta2:dataproc_go_proto -google/cloud/dataproc/v1beta2/clusters.proto,@go_googleapis//google/cloud/dataproc/v1beta2:dataproc_proto,google.golang.org/genproto/googleapis/cloud/dataproc/v1beta2,@go_googleapis//google/cloud/dataproc/v1beta2:dataproc_go_proto -google/cloud/dataproc/v1beta2/jobs.proto,@go_googleapis//google/cloud/dataproc/v1beta2:dataproc_proto,google.golang.org/genproto/googleapis/cloud/dataproc/v1beta2,@go_googleapis//google/cloud/dataproc/v1beta2:dataproc_go_proto -google/cloud/dataproc/v1beta2/operations.proto,@go_googleapis//google/cloud/dataproc/v1beta2:dataproc_proto,google.golang.org/genproto/googleapis/cloud/dataproc/v1beta2,@go_googleapis//google/cloud/dataproc/v1beta2:dataproc_go_proto -google/cloud/dataproc/v1beta2/shared.proto,@go_googleapis//google/cloud/dataproc/v1beta2:dataproc_proto,google.golang.org/genproto/googleapis/cloud/dataproc/v1beta2,@go_googleapis//google/cloud/dataproc/v1beta2:dataproc_go_proto -google/cloud/dataproc/v1beta2/workflow_templates.proto,@go_googleapis//google/cloud/dataproc/v1beta2:dataproc_proto,google.golang.org/genproto/googleapis/cloud/dataproc/v1beta2,@go_googleapis//google/cloud/dataproc/v1beta2:dataproc_go_proto -google/cloud/dialogflow/v2/agent.proto,@go_googleapis//google/cloud/dialogflow/v2:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2,@go_googleapis//google/cloud/dialogflow/v2:dialogflow_go_proto -google/cloud/dialogflow/v2/audio_config.proto,@go_googleapis//google/cloud/dialogflow/v2:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2,@go_googleapis//google/cloud/dialogflow/v2:dialogflow_go_proto -google/cloud/dialogflow/v2/context.proto,@go_googleapis//google/cloud/dialogflow/v2:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2,@go_googleapis//google/cloud/dialogflow/v2:dialogflow_go_proto -google/cloud/dialogflow/v2/entity_type.proto,@go_googleapis//google/cloud/dialogflow/v2:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2,@go_googleapis//google/cloud/dialogflow/v2:dialogflow_go_proto -google/cloud/dialogflow/v2/intent.proto,@go_googleapis//google/cloud/dialogflow/v2:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2,@go_googleapis//google/cloud/dialogflow/v2:dialogflow_go_proto -google/cloud/dialogflow/v2/session.proto,@go_googleapis//google/cloud/dialogflow/v2:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2,@go_googleapis//google/cloud/dialogflow/v2:dialogflow_go_proto -google/cloud/dialogflow/v2/session_entity_type.proto,@go_googleapis//google/cloud/dialogflow/v2:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2,@go_googleapis//google/cloud/dialogflow/v2:dialogflow_go_proto -google/cloud/dialogflow/v2/webhook.proto,@go_googleapis//google/cloud/dialogflow/v2:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2,@go_googleapis//google/cloud/dialogflow/v2:dialogflow_go_proto -google/cloud/dialogflow/v2beta1/agent.proto,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2beta1,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_go_proto -google/cloud/dialogflow/v2beta1/audio_config.proto,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2beta1,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_go_proto -google/cloud/dialogflow/v2beta1/context.proto,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2beta1,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_go_proto -google/cloud/dialogflow/v2beta1/document.proto,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2beta1,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_go_proto -google/cloud/dialogflow/v2beta1/entity_type.proto,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2beta1,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_go_proto -google/cloud/dialogflow/v2beta1/gcs.proto,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2beta1,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_go_proto -google/cloud/dialogflow/v2beta1/intent.proto,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2beta1,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_go_proto -google/cloud/dialogflow/v2beta1/knowledge_base.proto,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2beta1,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_go_proto -google/cloud/dialogflow/v2beta1/session.proto,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2beta1,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_go_proto -google/cloud/dialogflow/v2beta1/session_entity_type.proto,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2beta1,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_go_proto -google/cloud/dialogflow/v2beta1/validation_result.proto,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2beta1,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_go_proto -google/cloud/dialogflow/v2beta1/webhook.proto,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_proto,google.golang.org/genproto/googleapis/cloud/dialogflow/v2beta1,@go_googleapis//google/cloud/dialogflow/v2beta1:dialogflow_go_proto -google/cloud/document/v1beta1/document.proto,@go_googleapis//google/cloud/document/v1beta1:document_proto,google.golang.org/genproto/googleapis/cloud/document/v1beta1,@go_googleapis//google/cloud/document/v1beta1:document_go_proto -google/cloud/document/v1beta1/document_understanding.proto,@go_googleapis//google/cloud/document/v1beta1:document_proto,google.golang.org/genproto/googleapis/cloud/document/v1beta1,@go_googleapis//google/cloud/document/v1beta1:document_go_proto -google/cloud/document/v1beta1/geometry.proto,@go_googleapis//google/cloud/document/v1beta1:document_proto,google.golang.org/genproto/googleapis/cloud/document/v1beta1,@go_googleapis//google/cloud/document/v1beta1:document_go_proto -google/cloud/functions/v1beta2/functions.proto,@go_googleapis//google/cloud/functions/v1beta2:functions_proto,google.golang.org/genproto/googleapis/cloud/functions/v1beta2,@go_googleapis//google/cloud/functions/v1beta2:functions_go_proto -google/cloud/functions/v1beta2/operations.proto,@go_googleapis//google/cloud/functions/v1beta2:functions_proto,google.golang.org/genproto/googleapis/cloud/functions/v1beta2,@go_googleapis//google/cloud/functions/v1beta2:functions_go_proto -google/cloud/iot/v1/device_manager.proto,@go_googleapis//google/cloud/iot/v1:iot_proto,google.golang.org/genproto/googleapis/cloud/iot/v1,@go_googleapis//google/cloud/iot/v1:iot_go_proto -google/cloud/iot/v1/resources.proto,@go_googleapis//google/cloud/iot/v1:iot_proto,google.golang.org/genproto/googleapis/cloud/iot/v1,@go_googleapis//google/cloud/iot/v1:iot_go_proto -google/cloud/irm/v1alpha2/incidents.proto,@go_googleapis//google/cloud/irm/v1alpha2:irm_proto,google.golang.org/genproto/googleapis/cloud/irm/v1alpha2,@go_googleapis//google/cloud/irm/v1alpha2:irm_go_proto -google/cloud/irm/v1alpha2/incidents_service.proto,@go_googleapis//google/cloud/irm/v1alpha2:irm_proto,google.golang.org/genproto/googleapis/cloud/irm/v1alpha2,@go_googleapis//google/cloud/irm/v1alpha2:irm_go_proto -google/cloud/kms/v1/resources.proto,@go_googleapis//google/cloud/kms/v1:kms_proto,google.golang.org/genproto/googleapis/cloud/kms/v1,@go_googleapis//google/cloud/kms/v1:kms_go_proto -google/cloud/kms/v1/service.proto,@go_googleapis//google/cloud/kms/v1:kms_proto,google.golang.org/genproto/googleapis/cloud/kms/v1,@go_googleapis//google/cloud/kms/v1:kms_go_proto -google/cloud/language/v1/language_service.proto,@go_googleapis//google/cloud/language/v1:language_proto,google.golang.org/genproto/googleapis/cloud/language/v1,@go_googleapis//google/cloud/language/v1:language_go_proto -google/cloud/language/v1beta1/language_service.proto,@go_googleapis//google/cloud/language/v1beta1:language_proto,google.golang.org/genproto/googleapis/cloud/language/v1beta1,@go_googleapis//google/cloud/language/v1beta1:language_go_proto -google/cloud/language/v1beta2/language_service.proto,@go_googleapis//google/cloud/language/v1beta2:language_proto,google.golang.org/genproto/googleapis/cloud/language/v1beta2,@go_googleapis//google/cloud/language/v1beta2:language_go_proto -google/cloud/location/locations.proto,@go_googleapis//google/cloud/location:location_proto,google.golang.org/genproto/googleapis/cloud/location,@go_googleapis//google/cloud/location:location_go_proto -google/cloud/ml/v1/job_service.proto,@go_googleapis//google/cloud/ml/v1:ml_proto,google.golang.org/genproto/googleapis/cloud/ml/v1,@go_googleapis//google/cloud/ml/v1:ml_go_proto -google/cloud/ml/v1/model_service.proto,@go_googleapis//google/cloud/ml/v1:ml_proto,google.golang.org/genproto/googleapis/cloud/ml/v1,@go_googleapis//google/cloud/ml/v1:ml_go_proto -google/cloud/ml/v1/operation_metadata.proto,@go_googleapis//google/cloud/ml/v1:ml_proto,google.golang.org/genproto/googleapis/cloud/ml/v1,@go_googleapis//google/cloud/ml/v1:ml_go_proto -google/cloud/ml/v1/prediction_service.proto,@go_googleapis//google/cloud/ml/v1:ml_proto,google.golang.org/genproto/googleapis/cloud/ml/v1,@go_googleapis//google/cloud/ml/v1:ml_go_proto -google/cloud/ml/v1/project_service.proto,@go_googleapis//google/cloud/ml/v1:ml_proto,google.golang.org/genproto/googleapis/cloud/ml/v1,@go_googleapis//google/cloud/ml/v1:ml_go_proto -google/cloud/oslogin/common/common.proto,@go_googleapis//google/cloud/oslogin/common:common_proto,google.golang.org/genproto/googleapis/cloud/oslogin/common,@go_googleapis//google/cloud/oslogin/common:common_go_proto -google/cloud/oslogin/v1/oslogin.proto,@go_googleapis//google/cloud/oslogin/v1:oslogin_proto,google.golang.org/genproto/googleapis/cloud/oslogin/v1,@go_googleapis//google/cloud/oslogin/v1:oslogin_go_proto -google/cloud/oslogin/v1alpha/oslogin.proto,@go_googleapis//google/cloud/oslogin/v1alpha:oslogin_proto,google.golang.org/genproto/googleapis/cloud/oslogin/v1alpha,@go_googleapis//google/cloud/oslogin/v1alpha:oslogin_go_proto -google/cloud/oslogin/v1beta/oslogin.proto,@go_googleapis//google/cloud/oslogin/v1beta:oslogin_proto,google.golang.org/genproto/googleapis/cloud/oslogin/v1beta,@go_googleapis//google/cloud/oslogin/v1beta:oslogin_go_proto -google/cloud/phishingprotection/v1beta1/phishingprotection.proto,@go_googleapis//google/cloud/phishingprotection/v1beta1:phishingprotection_proto,google.golang.org/genproto/googleapis/cloud/phishingprotection/v1beta1,@go_googleapis//google/cloud/phishingprotection/v1beta1:phishingprotection_go_proto -google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto,@go_googleapis//google/cloud/recaptchaenterprise/v1beta1:recaptchaenterprise_proto,google.golang.org/genproto/googleapis/cloud/recaptchaenterprise/v1beta1,@go_googleapis//google/cloud/recaptchaenterprise/v1beta1:recaptchaenterprise_go_proto -google/cloud/recommender/v1beta1/recommendation.proto,@go_googleapis//google/cloud/recommender/v1beta1:recommender_proto,google.golang.org/genproto/googleapis/cloud/recommender/v1beta1,@go_googleapis//google/cloud/recommender/v1beta1:recommender_go_proto -google/cloud/recommender/v1beta1/recommender_service.proto,@go_googleapis//google/cloud/recommender/v1beta1:recommender_proto,google.golang.org/genproto/googleapis/cloud/recommender/v1beta1,@go_googleapis//google/cloud/recommender/v1beta1:recommender_go_proto -google/cloud/redis/v1/cloud_redis.proto,@go_googleapis//google/cloud/redis/v1:redis_proto,google.golang.org/genproto/googleapis/cloud/redis/v1,@go_googleapis//google/cloud/redis/v1:redis_go_proto -google/cloud/redis/v1beta1/cloud_redis.proto,@go_googleapis//google/cloud/redis/v1beta1:redis_proto,google.golang.org/genproto/googleapis/cloud/redis/v1beta1,@go_googleapis//google/cloud/redis/v1beta1:redis_go_proto -google/cloud/resourcemanager/v2/folders.proto,@go_googleapis//google/cloud/resourcemanager/v2:resourcemanager_proto,google.golang.org/genproto/googleapis/cloud/resourcemanager/v2,@go_googleapis//google/cloud/resourcemanager/v2:resourcemanager_go_proto -google/cloud/runtimeconfig/v1beta1/resources.proto,@go_googleapis//google/cloud/runtimeconfig/v1beta1:runtimeconfig_proto,google.golang.org/genproto/googleapis/cloud/runtimeconfig/v1beta1,@go_googleapis//google/cloud/runtimeconfig/v1beta1:runtimeconfig_go_proto -google/cloud/runtimeconfig/v1beta1/runtimeconfig.proto,@go_googleapis//google/cloud/runtimeconfig/v1beta1:runtimeconfig_proto,google.golang.org/genproto/googleapis/cloud/runtimeconfig/v1beta1,@go_googleapis//google/cloud/runtimeconfig/v1beta1:runtimeconfig_go_proto -google/cloud/scheduler/v1/cloudscheduler.proto,@go_googleapis//google/cloud/scheduler/v1:scheduler_proto,google.golang.org/genproto/googleapis/cloud/scheduler/v1,@go_googleapis//google/cloud/scheduler/v1:scheduler_go_proto -google/cloud/scheduler/v1/job.proto,@go_googleapis//google/cloud/scheduler/v1:scheduler_proto,google.golang.org/genproto/googleapis/cloud/scheduler/v1,@go_googleapis//google/cloud/scheduler/v1:scheduler_go_proto -google/cloud/scheduler/v1/target.proto,@go_googleapis//google/cloud/scheduler/v1:scheduler_proto,google.golang.org/genproto/googleapis/cloud/scheduler/v1,@go_googleapis//google/cloud/scheduler/v1:scheduler_go_proto -google/cloud/scheduler/v1beta1/cloudscheduler.proto,@go_googleapis//google/cloud/scheduler/v1beta1:scheduler_proto,google.golang.org/genproto/googleapis/cloud/scheduler/v1beta1,@go_googleapis//google/cloud/scheduler/v1beta1:scheduler_go_proto -google/cloud/scheduler/v1beta1/job.proto,@go_googleapis//google/cloud/scheduler/v1beta1:scheduler_proto,google.golang.org/genproto/googleapis/cloud/scheduler/v1beta1,@go_googleapis//google/cloud/scheduler/v1beta1:scheduler_go_proto -google/cloud/scheduler/v1beta1/target.proto,@go_googleapis//google/cloud/scheduler/v1beta1:scheduler_proto,google.golang.org/genproto/googleapis/cloud/scheduler/v1beta1,@go_googleapis//google/cloud/scheduler/v1beta1:scheduler_go_proto -google/cloud/securitycenter/v1/asset.proto,@go_googleapis//google/cloud/securitycenter/v1:securitycenter_proto,google.golang.org/genproto/googleapis/cloud/securitycenter/v1,@go_googleapis//google/cloud/securitycenter/v1:securitycenter_go_proto -google/cloud/securitycenter/v1/finding.proto,@go_googleapis//google/cloud/securitycenter/v1:securitycenter_proto,google.golang.org/genproto/googleapis/cloud/securitycenter/v1,@go_googleapis//google/cloud/securitycenter/v1:securitycenter_go_proto -google/cloud/securitycenter/v1/organization_settings.proto,@go_googleapis//google/cloud/securitycenter/v1:securitycenter_proto,google.golang.org/genproto/googleapis/cloud/securitycenter/v1,@go_googleapis//google/cloud/securitycenter/v1:securitycenter_go_proto -google/cloud/securitycenter/v1/run_asset_discovery_response.proto,@go_googleapis//google/cloud/securitycenter/v1:securitycenter_proto,google.golang.org/genproto/googleapis/cloud/securitycenter/v1,@go_googleapis//google/cloud/securitycenter/v1:securitycenter_go_proto -google/cloud/securitycenter/v1/security_marks.proto,@go_googleapis//google/cloud/securitycenter/v1:securitycenter_proto,google.golang.org/genproto/googleapis/cloud/securitycenter/v1,@go_googleapis//google/cloud/securitycenter/v1:securitycenter_go_proto -google/cloud/securitycenter/v1/securitycenter_service.proto,@go_googleapis//google/cloud/securitycenter/v1:securitycenter_proto,google.golang.org/genproto/googleapis/cloud/securitycenter/v1,@go_googleapis//google/cloud/securitycenter/v1:securitycenter_go_proto -google/cloud/securitycenter/v1/source.proto,@go_googleapis//google/cloud/securitycenter/v1:securitycenter_proto,google.golang.org/genproto/googleapis/cloud/securitycenter/v1,@go_googleapis//google/cloud/securitycenter/v1:securitycenter_go_proto -google/cloud/securitycenter/v1beta1/asset.proto,@go_googleapis//google/cloud/securitycenter/v1beta1:securitycenter_proto,google.golang.org/genproto/googleapis/cloud/securitycenter/v1beta1,@go_googleapis//google/cloud/securitycenter/v1beta1:securitycenter_go_proto -google/cloud/securitycenter/v1beta1/finding.proto,@go_googleapis//google/cloud/securitycenter/v1beta1:securitycenter_proto,google.golang.org/genproto/googleapis/cloud/securitycenter/v1beta1,@go_googleapis//google/cloud/securitycenter/v1beta1:securitycenter_go_proto -google/cloud/securitycenter/v1beta1/organization_settings.proto,@go_googleapis//google/cloud/securitycenter/v1beta1:securitycenter_proto,google.golang.org/genproto/googleapis/cloud/securitycenter/v1beta1,@go_googleapis//google/cloud/securitycenter/v1beta1:securitycenter_go_proto -google/cloud/securitycenter/v1beta1/security_marks.proto,@go_googleapis//google/cloud/securitycenter/v1beta1:securitycenter_proto,google.golang.org/genproto/googleapis/cloud/securitycenter/v1beta1,@go_googleapis//google/cloud/securitycenter/v1beta1:securitycenter_go_proto -google/cloud/securitycenter/v1beta1/securitycenter_service.proto,@go_googleapis//google/cloud/securitycenter/v1beta1:securitycenter_proto,google.golang.org/genproto/googleapis/cloud/securitycenter/v1beta1,@go_googleapis//google/cloud/securitycenter/v1beta1:securitycenter_go_proto -google/cloud/securitycenter/v1beta1/source.proto,@go_googleapis//google/cloud/securitycenter/v1beta1:securitycenter_proto,google.golang.org/genproto/googleapis/cloud/securitycenter/v1beta1,@go_googleapis//google/cloud/securitycenter/v1beta1:securitycenter_go_proto -google/cloud/speech/v1/cloud_speech.proto,@go_googleapis//google/cloud/speech/v1:speech_proto,google.golang.org/genproto/googleapis/cloud/speech/v1,@go_googleapis//google/cloud/speech/v1:speech_go_proto -google/cloud/speech/v1p1beta1/cloud_speech.proto,@go_googleapis//google/cloud/speech/v1p1beta1:speech_proto,google.golang.org/genproto/googleapis/cloud/speech/v1p1beta1,@go_googleapis//google/cloud/speech/v1p1beta1:speech_go_proto -google/cloud/support/common.proto,@go_googleapis//google/cloud/support:common_proto,google.golang.org/genproto/googleapis/cloud/support/common,@go_googleapis//google/cloud/support:common_go_proto -google/cloud/support/v1alpha1/cloud_support.proto,@go_googleapis//google/cloud/support/v1alpha1:support_proto,google.golang.org/genproto/googleapis/cloud/support/v1alpha1,@go_googleapis//google/cloud/support/v1alpha1:support_go_proto -google/cloud/talent/v4beta1/application.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/talent/v4beta1/application_service.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/talent/v4beta1/batch.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/talent/v4beta1/common.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/talent/v4beta1/company.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/talent/v4beta1/company_service.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/talent/v4beta1/completion_service.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/talent/v4beta1/event.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/talent/v4beta1/event_service.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/talent/v4beta1/filters.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/talent/v4beta1/histogram.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/talent/v4beta1/job.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/talent/v4beta1/job_service.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/talent/v4beta1/profile.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/talent/v4beta1/profile_service.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/talent/v4beta1/tenant.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/talent/v4beta1/tenant_service.proto,@go_googleapis//google/cloud/talent/v4beta1:talent_proto,google.golang.org/genproto/googleapis/cloud/talent/v4beta1,@go_googleapis//google/cloud/talent/v4beta1:talent_go_proto -google/cloud/tasks/v2/cloudtasks.proto,@go_googleapis//google/cloud/tasks/v2:tasks_proto,google.golang.org/genproto/googleapis/cloud/tasks/v2,@go_googleapis//google/cloud/tasks/v2:tasks_go_proto -google/cloud/tasks/v2/queue.proto,@go_googleapis//google/cloud/tasks/v2:tasks_proto,google.golang.org/genproto/googleapis/cloud/tasks/v2,@go_googleapis//google/cloud/tasks/v2:tasks_go_proto -google/cloud/tasks/v2/target.proto,@go_googleapis//google/cloud/tasks/v2:tasks_proto,google.golang.org/genproto/googleapis/cloud/tasks/v2,@go_googleapis//google/cloud/tasks/v2:tasks_go_proto -google/cloud/tasks/v2/task.proto,@go_googleapis//google/cloud/tasks/v2:tasks_proto,google.golang.org/genproto/googleapis/cloud/tasks/v2,@go_googleapis//google/cloud/tasks/v2:tasks_go_proto -google/cloud/tasks/v2beta2/cloudtasks.proto,@go_googleapis//google/cloud/tasks/v2beta2:tasks_proto,google.golang.org/genproto/googleapis/cloud/tasks/v2beta2,@go_googleapis//google/cloud/tasks/v2beta2:tasks_go_proto -google/cloud/tasks/v2beta2/queue.proto,@go_googleapis//google/cloud/tasks/v2beta2:tasks_proto,google.golang.org/genproto/googleapis/cloud/tasks/v2beta2,@go_googleapis//google/cloud/tasks/v2beta2:tasks_go_proto -google/cloud/tasks/v2beta2/target.proto,@go_googleapis//google/cloud/tasks/v2beta2:tasks_proto,google.golang.org/genproto/googleapis/cloud/tasks/v2beta2,@go_googleapis//google/cloud/tasks/v2beta2:tasks_go_proto -google/cloud/tasks/v2beta2/task.proto,@go_googleapis//google/cloud/tasks/v2beta2:tasks_proto,google.golang.org/genproto/googleapis/cloud/tasks/v2beta2,@go_googleapis//google/cloud/tasks/v2beta2:tasks_go_proto -google/cloud/tasks/v2beta3/cloudtasks.proto,@go_googleapis//google/cloud/tasks/v2beta3:tasks_proto,google.golang.org/genproto/googleapis/cloud/tasks/v2beta3,@go_googleapis//google/cloud/tasks/v2beta3:tasks_go_proto -google/cloud/tasks/v2beta3/queue.proto,@go_googleapis//google/cloud/tasks/v2beta3:tasks_proto,google.golang.org/genproto/googleapis/cloud/tasks/v2beta3,@go_googleapis//google/cloud/tasks/v2beta3:tasks_go_proto -google/cloud/tasks/v2beta3/target.proto,@go_googleapis//google/cloud/tasks/v2beta3:tasks_proto,google.golang.org/genproto/googleapis/cloud/tasks/v2beta3,@go_googleapis//google/cloud/tasks/v2beta3:tasks_go_proto -google/cloud/tasks/v2beta3/task.proto,@go_googleapis//google/cloud/tasks/v2beta3:tasks_proto,google.golang.org/genproto/googleapis/cloud/tasks/v2beta3,@go_googleapis//google/cloud/tasks/v2beta3:tasks_go_proto -google/cloud/texttospeech/v1/cloud_tts.proto,@go_googleapis//google/cloud/texttospeech/v1:texttospeech_proto,google.golang.org/genproto/googleapis/cloud/texttospeech/v1,@go_googleapis//google/cloud/texttospeech/v1:texttospeech_go_proto -google/cloud/texttospeech/v1beta1/cloud_tts.proto,@go_googleapis//google/cloud/texttospeech/v1beta1:texttospeech_proto,google.golang.org/genproto/googleapis/cloud/texttospeech/v1beta1,@go_googleapis//google/cloud/texttospeech/v1beta1:texttospeech_go_proto -google/cloud/translate/v3/translation_service.proto,@go_googleapis//google/cloud/translate/v3:translate_proto,google.golang.org/genproto/googleapis/cloud/translate/v3,@go_googleapis//google/cloud/translate/v3:translate_go_proto -google/cloud/translate/v3beta1/translation_service.proto,@go_googleapis//google/cloud/translate/v3beta1:translate_proto,google.golang.org/genproto/googleapis/cloud/translate/v3beta1,@go_googleapis//google/cloud/translate/v3beta1:translate_go_proto -google/cloud/videointelligence/v1/video_intelligence.proto,@go_googleapis//google/cloud/videointelligence/v1:videointelligence_proto,google.golang.org/genproto/googleapis/cloud/videointelligence/v1,@go_googleapis//google/cloud/videointelligence/v1:videointelligence_go_proto -google/cloud/videointelligence/v1beta1/video_intelligence.proto,@go_googleapis//google/cloud/videointelligence/v1beta1:videointelligence_proto,google.golang.org/genproto/googleapis/cloud/videointelligence/v1beta1,@go_googleapis//google/cloud/videointelligence/v1beta1:videointelligence_go_proto -google/cloud/videointelligence/v1beta2/video_intelligence.proto,@go_googleapis//google/cloud/videointelligence/v1beta2:videointelligence_proto,google.golang.org/genproto/googleapis/cloud/videointelligence/v1beta2,@go_googleapis//google/cloud/videointelligence/v1beta2:videointelligence_go_proto -google/cloud/videointelligence/v1p1beta1/video_intelligence.proto,@go_googleapis//google/cloud/videointelligence/v1p1beta1:videointelligence_proto,google.golang.org/genproto/googleapis/cloud/videointelligence/v1p1beta1,@go_googleapis//google/cloud/videointelligence/v1p1beta1:videointelligence_go_proto -google/cloud/videointelligence/v1p2beta1/video_intelligence.proto,@go_googleapis//google/cloud/videointelligence/v1p2beta1:videointelligence_proto,google.golang.org/genproto/googleapis/cloud/videointelligence/v1p2beta1,@go_googleapis//google/cloud/videointelligence/v1p2beta1:videointelligence_go_proto -google/cloud/videointelligence/v1p3beta1/video_intelligence.proto,@go_googleapis//google/cloud/videointelligence/v1p3beta1:videointelligence_proto,google.golang.org/genproto/googleapis/cloud/videointelligence/v1p3beta1,@go_googleapis//google/cloud/videointelligence/v1p3beta1:videointelligence_go_proto -google/cloud/vision/v1/geometry.proto,@go_googleapis//google/cloud/vision/v1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1,@go_googleapis//google/cloud/vision/v1:vision_go_proto -google/cloud/vision/v1/image_annotator.proto,@go_googleapis//google/cloud/vision/v1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1,@go_googleapis//google/cloud/vision/v1:vision_go_proto -google/cloud/vision/v1/product_search.proto,@go_googleapis//google/cloud/vision/v1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1,@go_googleapis//google/cloud/vision/v1:vision_go_proto -google/cloud/vision/v1/product_search_service.proto,@go_googleapis//google/cloud/vision/v1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1,@go_googleapis//google/cloud/vision/v1:vision_go_proto -google/cloud/vision/v1/text_annotation.proto,@go_googleapis//google/cloud/vision/v1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1,@go_googleapis//google/cloud/vision/v1:vision_go_proto -google/cloud/vision/v1/web_detection.proto,@go_googleapis//google/cloud/vision/v1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1,@go_googleapis//google/cloud/vision/v1:vision_go_proto -google/cloud/vision/v1p1beta1/geometry.proto,@go_googleapis//google/cloud/vision/v1p1beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p1beta1,@go_googleapis//google/cloud/vision/v1p1beta1:vision_go_proto -google/cloud/vision/v1p1beta1/image_annotator.proto,@go_googleapis//google/cloud/vision/v1p1beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p1beta1,@go_googleapis//google/cloud/vision/v1p1beta1:vision_go_proto -google/cloud/vision/v1p1beta1/text_annotation.proto,@go_googleapis//google/cloud/vision/v1p1beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p1beta1,@go_googleapis//google/cloud/vision/v1p1beta1:vision_go_proto -google/cloud/vision/v1p1beta1/web_detection.proto,@go_googleapis//google/cloud/vision/v1p1beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p1beta1,@go_googleapis//google/cloud/vision/v1p1beta1:vision_go_proto -google/cloud/vision/v1p2beta1/geometry.proto,@go_googleapis//google/cloud/vision/v1p2beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p2beta1,@go_googleapis//google/cloud/vision/v1p2beta1:vision_go_proto -google/cloud/vision/v1p2beta1/image_annotator.proto,@go_googleapis//google/cloud/vision/v1p2beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p2beta1,@go_googleapis//google/cloud/vision/v1p2beta1:vision_go_proto -google/cloud/vision/v1p2beta1/text_annotation.proto,@go_googleapis//google/cloud/vision/v1p2beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p2beta1,@go_googleapis//google/cloud/vision/v1p2beta1:vision_go_proto -google/cloud/vision/v1p2beta1/web_detection.proto,@go_googleapis//google/cloud/vision/v1p2beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p2beta1,@go_googleapis//google/cloud/vision/v1p2beta1:vision_go_proto -google/cloud/vision/v1p3beta1/geometry.proto,@go_googleapis//google/cloud/vision/v1p3beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p3beta1,@go_googleapis//google/cloud/vision/v1p3beta1:vision_go_proto -google/cloud/vision/v1p3beta1/image_annotator.proto,@go_googleapis//google/cloud/vision/v1p3beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p3beta1,@go_googleapis//google/cloud/vision/v1p3beta1:vision_go_proto -google/cloud/vision/v1p3beta1/product_search.proto,@go_googleapis//google/cloud/vision/v1p3beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p3beta1,@go_googleapis//google/cloud/vision/v1p3beta1:vision_go_proto -google/cloud/vision/v1p3beta1/product_search_service.proto,@go_googleapis//google/cloud/vision/v1p3beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p3beta1,@go_googleapis//google/cloud/vision/v1p3beta1:vision_go_proto -google/cloud/vision/v1p3beta1/text_annotation.proto,@go_googleapis//google/cloud/vision/v1p3beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p3beta1,@go_googleapis//google/cloud/vision/v1p3beta1:vision_go_proto -google/cloud/vision/v1p3beta1/web_detection.proto,@go_googleapis//google/cloud/vision/v1p3beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p3beta1,@go_googleapis//google/cloud/vision/v1p3beta1:vision_go_proto -google/cloud/vision/v1p4beta1/geometry.proto,@go_googleapis//google/cloud/vision/v1p4beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p4beta1,@go_googleapis//google/cloud/vision/v1p4beta1:vision_go_proto -google/cloud/vision/v1p4beta1/image_annotator.proto,@go_googleapis//google/cloud/vision/v1p4beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p4beta1,@go_googleapis//google/cloud/vision/v1p4beta1:vision_go_proto -google/cloud/vision/v1p4beta1/product_search.proto,@go_googleapis//google/cloud/vision/v1p4beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p4beta1,@go_googleapis//google/cloud/vision/v1p4beta1:vision_go_proto -google/cloud/vision/v1p4beta1/product_search_service.proto,@go_googleapis//google/cloud/vision/v1p4beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p4beta1,@go_googleapis//google/cloud/vision/v1p4beta1:vision_go_proto -google/cloud/vision/v1p4beta1/text_annotation.proto,@go_googleapis//google/cloud/vision/v1p4beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p4beta1,@go_googleapis//google/cloud/vision/v1p4beta1:vision_go_proto -google/cloud/vision/v1p4beta1/web_detection.proto,@go_googleapis//google/cloud/vision/v1p4beta1:vision_proto,google.golang.org/genproto/googleapis/cloud/vision/v1p4beta1,@go_googleapis//google/cloud/vision/v1p4beta1:vision_go_proto -google/cloud/webrisk/v1beta1/webrisk.proto,@go_googleapis//google/cloud/webrisk/v1beta1:webrisk_proto,google.golang.org/genproto/googleapis/cloud/webrisk/v1beta1,@go_googleapis//google/cloud/webrisk/v1beta1:webrisk_go_proto -google/cloud/websecurityscanner/v1alpha/crawled_url.proto,@go_googleapis//google/cloud/websecurityscanner/v1alpha:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1alpha,@go_googleapis//google/cloud/websecurityscanner/v1alpha:websecurityscanner_go_proto -google/cloud/websecurityscanner/v1alpha/finding.proto,@go_googleapis//google/cloud/websecurityscanner/v1alpha:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1alpha,@go_googleapis//google/cloud/websecurityscanner/v1alpha:websecurityscanner_go_proto -google/cloud/websecurityscanner/v1alpha/finding_addon.proto,@go_googleapis//google/cloud/websecurityscanner/v1alpha:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1alpha,@go_googleapis//google/cloud/websecurityscanner/v1alpha:websecurityscanner_go_proto -google/cloud/websecurityscanner/v1alpha/finding_type_stats.proto,@go_googleapis//google/cloud/websecurityscanner/v1alpha:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1alpha,@go_googleapis//google/cloud/websecurityscanner/v1alpha:websecurityscanner_go_proto -google/cloud/websecurityscanner/v1alpha/scan_config.proto,@go_googleapis//google/cloud/websecurityscanner/v1alpha:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1alpha,@go_googleapis//google/cloud/websecurityscanner/v1alpha:websecurityscanner_go_proto -google/cloud/websecurityscanner/v1alpha/scan_run.proto,@go_googleapis//google/cloud/websecurityscanner/v1alpha:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1alpha,@go_googleapis//google/cloud/websecurityscanner/v1alpha:websecurityscanner_go_proto -google/cloud/websecurityscanner/v1alpha/web_security_scanner.proto,@go_googleapis//google/cloud/websecurityscanner/v1alpha:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1alpha,@go_googleapis//google/cloud/websecurityscanner/v1alpha:websecurityscanner_go_proto -google/cloud/websecurityscanner/v1beta/crawled_url.proto,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1beta,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_go_proto -google/cloud/websecurityscanner/v1beta/finding.proto,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1beta,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_go_proto -google/cloud/websecurityscanner/v1beta/finding_addon.proto,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1beta,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_go_proto -google/cloud/websecurityscanner/v1beta/finding_type_stats.proto,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1beta,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_go_proto -google/cloud/websecurityscanner/v1beta/scan_config.proto,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1beta,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_go_proto -google/cloud/websecurityscanner/v1beta/scan_config_error.proto,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1beta,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_go_proto -google/cloud/websecurityscanner/v1beta/scan_run.proto,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1beta,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_go_proto -google/cloud/websecurityscanner/v1beta/scan_run_error_trace.proto,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1beta,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_go_proto -google/cloud/websecurityscanner/v1beta/scan_run_warning_trace.proto,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1beta,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_go_proto -google/cloud/websecurityscanner/v1beta/web_security_scanner.proto,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_proto,google.golang.org/genproto/googleapis/cloud/websecurityscanner/v1beta,@go_googleapis//google/cloud/websecurityscanner/v1beta:websecurityscanner_go_proto -google/container/v1/cluster_service.proto,@go_googleapis//google/container/v1:container_proto,google.golang.org/genproto/googleapis/container/v1,@go_googleapis//google/container/v1:container_go_proto -google/container/v1alpha1/cluster_service.proto,@go_googleapis//google/container/v1alpha1:container_proto,google.golang.org/genproto/googleapis/container/v1alpha1,@go_googleapis//google/container/v1alpha1:container_go_proto -google/container/v1beta1/cluster_service.proto,@go_googleapis//google/container/v1beta1:container_proto,google.golang.org/genproto/googleapis/container/v1beta1,@go_googleapis//google/container/v1beta1:container_go_proto -google/datastore/admin/v1/datastore_admin.proto,@go_googleapis//google/datastore/admin/v1:admin_proto,google.golang.org/genproto/googleapis/datastore/admin/v1,@go_googleapis//google/datastore/admin/v1:admin_go_proto -google/datastore/admin/v1/index.proto,@go_googleapis//google/datastore/admin/v1:admin_proto,google.golang.org/genproto/googleapis/datastore/admin/v1,@go_googleapis//google/datastore/admin/v1:admin_go_proto -google/datastore/admin/v1beta1/datastore_admin.proto,@go_googleapis//google/datastore/admin/v1beta1:admin_proto,google.golang.org/genproto/googleapis/datastore/admin/v1beta1,@go_googleapis//google/datastore/admin/v1beta1:admin_go_proto -google/datastore/v1/datastore.proto,@go_googleapis//google/datastore/v1:datastore_proto,google.golang.org/genproto/googleapis/datastore/v1,@go_googleapis//google/datastore/v1:datastore_go_proto -google/datastore/v1/entity.proto,@go_googleapis//google/datastore/v1:datastore_proto,google.golang.org/genproto/googleapis/datastore/v1,@go_googleapis//google/datastore/v1:datastore_go_proto -google/datastore/v1/query.proto,@go_googleapis//google/datastore/v1:datastore_proto,google.golang.org/genproto/googleapis/datastore/v1,@go_googleapis//google/datastore/v1:datastore_go_proto -google/datastore/v1beta3/datastore.proto,@go_googleapis//google/datastore/v1beta3:datastore_proto,google.golang.org/genproto/googleapis/datastore/v1beta3,@go_googleapis//google/datastore/v1beta3:datastore_go_proto -google/datastore/v1beta3/entity.proto,@go_googleapis//google/datastore/v1beta3:datastore_proto,google.golang.org/genproto/googleapis/datastore/v1beta3,@go_googleapis//google/datastore/v1beta3:datastore_go_proto -google/datastore/v1beta3/query.proto,@go_googleapis//google/datastore/v1beta3:datastore_proto,google.golang.org/genproto/googleapis/datastore/v1beta3,@go_googleapis//google/datastore/v1beta3:datastore_go_proto -google/devtools/build/v1/build_events.proto,@go_googleapis//google/devtools/build/v1:build_proto,google.golang.org/genproto/googleapis/devtools/build/v1,@go_googleapis//google/devtools/build/v1:build_go_proto -google/devtools/build/v1/build_status.proto,@go_googleapis//google/devtools/build/v1:build_proto,google.golang.org/genproto/googleapis/devtools/build/v1,@go_googleapis//google/devtools/build/v1:build_go_proto -google/devtools/build/v1/publish_build_event.proto,@go_googleapis//google/devtools/build/v1:build_proto,google.golang.org/genproto/googleapis/devtools/build/v1,@go_googleapis//google/devtools/build/v1:build_go_proto -google/devtools/cloudbuild/v1/cloudbuild.proto,@go_googleapis//google/devtools/cloudbuild/v1:cloudbuild_proto,google.golang.org/genproto/googleapis/devtools/cloudbuild/v1,@go_googleapis//google/devtools/cloudbuild/v1:cloudbuild_go_proto -google/devtools/clouddebugger/v2/controller.proto,@go_googleapis//google/devtools/clouddebugger/v2:clouddebugger_proto,google.golang.org/genproto/googleapis/devtools/clouddebugger/v2,@go_googleapis//google/devtools/clouddebugger/v2:clouddebugger_go_proto -google/devtools/clouddebugger/v2/data.proto,@go_googleapis//google/devtools/clouddebugger/v2:clouddebugger_proto,google.golang.org/genproto/googleapis/devtools/clouddebugger/v2,@go_googleapis//google/devtools/clouddebugger/v2:clouddebugger_go_proto -google/devtools/clouddebugger/v2/debugger.proto,@go_googleapis//google/devtools/clouddebugger/v2:clouddebugger_proto,google.golang.org/genproto/googleapis/devtools/clouddebugger/v2,@go_googleapis//google/devtools/clouddebugger/v2:clouddebugger_go_proto -google/devtools/clouderrorreporting/v1beta1/common.proto,@go_googleapis//google/devtools/clouderrorreporting/v1beta1:clouderrorreporting_proto,google.golang.org/genproto/googleapis/devtools/clouderrorreporting/v1beta1,@go_googleapis//google/devtools/clouderrorreporting/v1beta1:clouderrorreporting_go_proto -google/devtools/clouderrorreporting/v1beta1/error_group_service.proto,@go_googleapis//google/devtools/clouderrorreporting/v1beta1:clouderrorreporting_proto,google.golang.org/genproto/googleapis/devtools/clouderrorreporting/v1beta1,@go_googleapis//google/devtools/clouderrorreporting/v1beta1:clouderrorreporting_go_proto -google/devtools/clouderrorreporting/v1beta1/error_stats_service.proto,@go_googleapis//google/devtools/clouderrorreporting/v1beta1:clouderrorreporting_proto,google.golang.org/genproto/googleapis/devtools/clouderrorreporting/v1beta1,@go_googleapis//google/devtools/clouderrorreporting/v1beta1:clouderrorreporting_go_proto -google/devtools/clouderrorreporting/v1beta1/report_errors_service.proto,@go_googleapis//google/devtools/clouderrorreporting/v1beta1:clouderrorreporting_proto,google.golang.org/genproto/googleapis/devtools/clouderrorreporting/v1beta1,@go_googleapis//google/devtools/clouderrorreporting/v1beta1:clouderrorreporting_go_proto -google/devtools/cloudprofiler/v2/profiler.proto,@go_googleapis//google/devtools/cloudprofiler/v2:cloudprofiler_proto,google.golang.org/genproto/googleapis/devtools/cloudprofiler/v2,@go_googleapis//google/devtools/cloudprofiler/v2:cloudprofiler_go_proto -google/devtools/cloudtrace/v1/trace.proto,@go_googleapis//google/devtools/cloudtrace/v1:cloudtrace_proto,google.golang.org/genproto/googleapis/devtools/cloudtrace/v1,@go_googleapis//google/devtools/cloudtrace/v1:cloudtrace_go_proto -google/devtools/cloudtrace/v2/trace.proto,@go_googleapis//google/devtools/cloudtrace/v2:cloudtrace_proto,google.golang.org/genproto/googleapis/devtools/cloudtrace/v2,@go_googleapis//google/devtools/cloudtrace/v2:cloudtrace_go_proto -google/devtools/cloudtrace/v2/tracing.proto,@go_googleapis//google/devtools/cloudtrace/v2:cloudtrace_proto,google.golang.org/genproto/googleapis/devtools/cloudtrace/v2,@go_googleapis//google/devtools/cloudtrace/v2:cloudtrace_go_proto -google/devtools/containeranalysis/v1/containeranalysis.proto,@go_googleapis//google/devtools/containeranalysis/v1:containeranalysis_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1,@go_googleapis//google/devtools/containeranalysis/v1:containeranalysis_go_proto -google/devtools/containeranalysis/v1alpha1/bill_of_materials.proto,@go_googleapis//google/devtools/containeranalysis/v1alpha1:containeranalysis_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1alpha1,@go_googleapis//google/devtools/containeranalysis/v1alpha1:containeranalysis_go_proto -google/devtools/containeranalysis/v1alpha1/containeranalysis.proto,@go_googleapis//google/devtools/containeranalysis/v1alpha1:containeranalysis_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1alpha1,@go_googleapis//google/devtools/containeranalysis/v1alpha1:containeranalysis_go_proto -google/devtools/containeranalysis/v1alpha1/image_basis.proto,@go_googleapis//google/devtools/containeranalysis/v1alpha1:containeranalysis_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1alpha1,@go_googleapis//google/devtools/containeranalysis/v1alpha1:containeranalysis_go_proto -google/devtools/containeranalysis/v1alpha1/package_vulnerability.proto,@go_googleapis//google/devtools/containeranalysis/v1alpha1:containeranalysis_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1alpha1,@go_googleapis//google/devtools/containeranalysis/v1alpha1:containeranalysis_go_proto -google/devtools/containeranalysis/v1alpha1/provenance.proto,@go_googleapis//google/devtools/containeranalysis/v1alpha1:containeranalysis_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1alpha1,@go_googleapis//google/devtools/containeranalysis/v1alpha1:containeranalysis_go_proto -google/devtools/containeranalysis/v1alpha1/source_context.proto,@go_googleapis//google/devtools/containeranalysis/v1alpha1:containeranalysis_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1alpha1,@go_googleapis//google/devtools/containeranalysis/v1alpha1:containeranalysis_go_proto -google/devtools/containeranalysis/v1beta1/attestation/attestation.proto,@go_googleapis//google/devtools/containeranalysis/v1beta1/attestation:attestation_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/attestation,@go_googleapis//google/devtools/containeranalysis/v1beta1/attestation:attestation_go_proto -google/devtools/containeranalysis/v1beta1/build/build.proto,@go_googleapis//google/devtools/containeranalysis/v1beta1/build:build_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/build,@go_googleapis//google/devtools/containeranalysis/v1beta1/build:build_go_proto -google/devtools/containeranalysis/v1beta1/common/common.proto,@go_googleapis//google/devtools/containeranalysis/v1beta1/common:common_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/common,@go_googleapis//google/devtools/containeranalysis/v1beta1/common:common_go_proto -google/devtools/containeranalysis/v1beta1/containeranalysis.proto,@go_googleapis//google/devtools/containeranalysis/v1beta1:containeranalysis_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1,@go_googleapis//google/devtools/containeranalysis/v1beta1:containeranalysis_go_proto -google/devtools/containeranalysis/v1beta1/deployment/deployment.proto,@go_googleapis//google/devtools/containeranalysis/v1beta1/deployment:deployment_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/deployment,@go_googleapis//google/devtools/containeranalysis/v1beta1/deployment:deployment_go_proto -google/devtools/containeranalysis/v1beta1/discovery/discovery.proto,@go_googleapis//google/devtools/containeranalysis/v1beta1/discovery:discovery_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/discovery,@go_googleapis//google/devtools/containeranalysis/v1beta1/discovery:discovery_go_proto -google/devtools/containeranalysis/v1beta1/grafeas/grafeas.proto,@go_googleapis//google/devtools/containeranalysis/v1beta1/grafeas:grafeas_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/grafeas,@go_googleapis//google/devtools/containeranalysis/v1beta1/grafeas:grafeas_go_proto -google/devtools/containeranalysis/v1beta1/image/image.proto,@go_googleapis//google/devtools/containeranalysis/v1beta1/image:image_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/image,@go_googleapis//google/devtools/containeranalysis/v1beta1/image:image_go_proto -google/devtools/containeranalysis/v1beta1/package/package.proto,@go_googleapis//google/devtools/containeranalysis/v1beta1/package:package_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/package,@go_googleapis//google/devtools/containeranalysis/v1beta1/package:package_go_proto -google/devtools/containeranalysis/v1beta1/provenance/provenance.proto,@go_googleapis//google/devtools/containeranalysis/v1beta1/provenance:provenance_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/provenance,@go_googleapis//google/devtools/containeranalysis/v1beta1/provenance:provenance_go_proto -google/devtools/containeranalysis/v1beta1/source/source.proto,@go_googleapis//google/devtools/containeranalysis/v1beta1/source:source_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/source,@go_googleapis//google/devtools/containeranalysis/v1beta1/source:source_go_proto -google/devtools/containeranalysis/v1beta1/vulnerability/vulnerability.proto,@go_googleapis//google/devtools/containeranalysis/v1beta1/vulnerability:vulnerability_proto,google.golang.org/genproto/googleapis/devtools/containeranalysis/v1beta1/vulnerability,@go_googleapis//google/devtools/containeranalysis/v1beta1/vulnerability:vulnerability_go_proto -google/devtools/remoteexecution/v1test/remote_execution.proto,@go_googleapis//google/devtools/remoteexecution/v1test:remoteexecution_proto,google.golang.org/genproto/googleapis/devtools/remoteexecution/v1test,@go_googleapis//google/devtools/remoteexecution/v1test:remoteexecution_go_proto -google/devtools/remoteworkers/v1test2/bots.proto,@go_googleapis//google/devtools/remoteworkers/v1test2:remoteworkers_proto,google.golang.org/genproto/googleapis/devtools/remoteworkers/v1test2,@go_googleapis//google/devtools/remoteworkers/v1test2:remoteworkers_go_proto -google/devtools/remoteworkers/v1test2/command.proto,@go_googleapis//google/devtools/remoteworkers/v1test2:remoteworkers_proto,google.golang.org/genproto/googleapis/devtools/remoteworkers/v1test2,@go_googleapis//google/devtools/remoteworkers/v1test2:remoteworkers_go_proto -google/devtools/remoteworkers/v1test2/tasks.proto,@go_googleapis//google/devtools/remoteworkers/v1test2:remoteworkers_proto,google.golang.org/genproto/googleapis/devtools/remoteworkers/v1test2,@go_googleapis//google/devtools/remoteworkers/v1test2:remoteworkers_go_proto -google/devtools/remoteworkers/v1test2/worker.proto,@go_googleapis//google/devtools/remoteworkers/v1test2:remoteworkers_proto,google.golang.org/genproto/googleapis/devtools/remoteworkers/v1test2,@go_googleapis//google/devtools/remoteworkers/v1test2:remoteworkers_go_proto -google/devtools/resultstore/v2/action.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/resultstore/v2/common.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/resultstore/v2/configuration.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/resultstore/v2/configured_target.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/resultstore/v2/coverage.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/resultstore/v2/coverage_summary.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/resultstore/v2/download_metadata.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/resultstore/v2/file.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/resultstore/v2/file_processing_error.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/resultstore/v2/file_set.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/resultstore/v2/invocation.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/resultstore/v2/resultstore_download.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/resultstore/v2/resultstore_file_download.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/resultstore/v2/resultstore_upload.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/resultstore/v2/target.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/resultstore/v2/test_suite.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/resultstore/v2/upload_metadata.proto,@go_googleapis//google/devtools/resultstore/v2:resultstore_proto,google.golang.org/genproto/googleapis/devtools/resultstore/v2,@go_googleapis//google/devtools/resultstore/v2:resultstore_go_proto -google/devtools/source/v1/source_context.proto,@go_googleapis//google/devtools/source/v1:source_proto,google.golang.org/genproto/googleapis/devtools/source/v1,@go_googleapis//google/devtools/source/v1:source_go_proto -google/devtools/sourcerepo/v1/sourcerepo.proto,@go_googleapis//google/devtools/sourcerepo/v1:sourcerepo_proto,google.golang.org/genproto/googleapis/devtools/sourcerepo/v1,@go_googleapis//google/devtools/sourcerepo/v1:sourcerepo_go_proto -google/example/library/v1/library.proto,@go_googleapis//google/example/library/v1:library_proto,google.golang.org/genproto/googleapis/example/library/v1,@go_googleapis//google/example/library/v1:library_go_proto -google/firebase/fcm/connection/v1alpha1/connection_api.proto,@go_googleapis//google/firebase/fcm/connection/v1alpha1:connection_proto,google.golang.org/genproto/googleapis/firebase/fcm/connection/v1alpha1,@go_googleapis//google/firebase/fcm/connection/v1alpha1:connection_go_proto -google/firestore/admin/v1/field.proto,@go_googleapis//google/firestore/admin/v1:admin_proto,google.golang.org/genproto/googleapis/firestore/admin/v1,@go_googleapis//google/firestore/admin/v1:admin_go_proto -google/firestore/admin/v1/firestore_admin.proto,@go_googleapis//google/firestore/admin/v1:admin_proto,google.golang.org/genproto/googleapis/firestore/admin/v1,@go_googleapis//google/firestore/admin/v1:admin_go_proto -google/firestore/admin/v1/index.proto,@go_googleapis//google/firestore/admin/v1:admin_proto,google.golang.org/genproto/googleapis/firestore/admin/v1,@go_googleapis//google/firestore/admin/v1:admin_go_proto -google/firestore/admin/v1/location.proto,@go_googleapis//google/firestore/admin/v1:admin_proto,google.golang.org/genproto/googleapis/firestore/admin/v1,@go_googleapis//google/firestore/admin/v1:admin_go_proto -google/firestore/admin/v1/operation.proto,@go_googleapis//google/firestore/admin/v1:admin_proto,google.golang.org/genproto/googleapis/firestore/admin/v1,@go_googleapis//google/firestore/admin/v1:admin_go_proto -google/firestore/admin/v1beta1/firestore_admin.proto,@go_googleapis//google/firestore/admin/v1beta1:admin_proto,google.golang.org/genproto/googleapis/firestore/admin/v1beta1,@go_googleapis//google/firestore/admin/v1beta1:admin_go_proto -google/firestore/admin/v1beta1/index.proto,@go_googleapis//google/firestore/admin/v1beta1:admin_proto,google.golang.org/genproto/googleapis/firestore/admin/v1beta1,@go_googleapis//google/firestore/admin/v1beta1:admin_go_proto -google/firestore/admin/v1beta1/location.proto,@go_googleapis//google/firestore/admin/v1beta1:admin_proto,google.golang.org/genproto/googleapis/firestore/admin/v1beta1,@go_googleapis//google/firestore/admin/v1beta1:admin_go_proto -google/firestore/admin/v1beta2/field.proto,@go_googleapis//google/firestore/admin/v1beta2:admin_proto,google.golang.org/genproto/googleapis/firestore/admin/v1beta2,@go_googleapis//google/firestore/admin/v1beta2:admin_go_proto -google/firestore/admin/v1beta2/firestore_admin.proto,@go_googleapis//google/firestore/admin/v1beta2:admin_proto,google.golang.org/genproto/googleapis/firestore/admin/v1beta2,@go_googleapis//google/firestore/admin/v1beta2:admin_go_proto -google/firestore/admin/v1beta2/index.proto,@go_googleapis//google/firestore/admin/v1beta2:admin_proto,google.golang.org/genproto/googleapis/firestore/admin/v1beta2,@go_googleapis//google/firestore/admin/v1beta2:admin_go_proto -google/firestore/admin/v1beta2/operation.proto,@go_googleapis//google/firestore/admin/v1beta2:admin_proto,google.golang.org/genproto/googleapis/firestore/admin/v1beta2,@go_googleapis//google/firestore/admin/v1beta2:admin_go_proto -google/firestore/v1/common.proto,@go_googleapis//google/firestore/v1:firestore_proto,google.golang.org/genproto/googleapis/firestore/v1,@go_googleapis//google/firestore/v1:firestore_go_proto -google/firestore/v1/document.proto,@go_googleapis//google/firestore/v1:firestore_proto,google.golang.org/genproto/googleapis/firestore/v1,@go_googleapis//google/firestore/v1:firestore_go_proto -google/firestore/v1/firestore.proto,@go_googleapis//google/firestore/v1:firestore_proto,google.golang.org/genproto/googleapis/firestore/v1,@go_googleapis//google/firestore/v1:firestore_go_proto -google/firestore/v1/query.proto,@go_googleapis//google/firestore/v1:firestore_proto,google.golang.org/genproto/googleapis/firestore/v1,@go_googleapis//google/firestore/v1:firestore_go_proto -google/firestore/v1/write.proto,@go_googleapis//google/firestore/v1:firestore_proto,google.golang.org/genproto/googleapis/firestore/v1,@go_googleapis//google/firestore/v1:firestore_go_proto -google/firestore/v1beta1/common.proto,@go_googleapis//google/firestore/v1beta1:firestore_proto,google.golang.org/genproto/googleapis/firestore/v1beta1,@go_googleapis//google/firestore/v1beta1:firestore_go_proto -google/firestore/v1beta1/document.proto,@go_googleapis//google/firestore/v1beta1:firestore_proto,google.golang.org/genproto/googleapis/firestore/v1beta1,@go_googleapis//google/firestore/v1beta1:firestore_go_proto -google/firestore/v1beta1/firestore.proto,@go_googleapis//google/firestore/v1beta1:firestore_proto,google.golang.org/genproto/googleapis/firestore/v1beta1,@go_googleapis//google/firestore/v1beta1:firestore_go_proto -google/firestore/v1beta1/query.proto,@go_googleapis//google/firestore/v1beta1:firestore_proto,google.golang.org/genproto/googleapis/firestore/v1beta1,@go_googleapis//google/firestore/v1beta1:firestore_go_proto -google/firestore/v1beta1/write.proto,@go_googleapis//google/firestore/v1beta1:firestore_proto,google.golang.org/genproto/googleapis/firestore/v1beta1,@go_googleapis//google/firestore/v1beta1:firestore_go_proto -google/genomics/v1/annotations.proto,@go_googleapis//google/genomics/v1:genomics_proto,google.golang.org/genproto/googleapis/genomics/v1,@go_googleapis//google/genomics/v1:genomics_go_proto -google/genomics/v1/cigar.proto,@go_googleapis//google/genomics/v1:genomics_proto,google.golang.org/genproto/googleapis/genomics/v1,@go_googleapis//google/genomics/v1:genomics_go_proto -google/genomics/v1/datasets.proto,@go_googleapis//google/genomics/v1:genomics_proto,google.golang.org/genproto/googleapis/genomics/v1,@go_googleapis//google/genomics/v1:genomics_go_proto -google/genomics/v1/operations.proto,@go_googleapis//google/genomics/v1:genomics_proto,google.golang.org/genproto/googleapis/genomics/v1,@go_googleapis//google/genomics/v1:genomics_go_proto -google/genomics/v1/position.proto,@go_googleapis//google/genomics/v1:genomics_proto,google.golang.org/genproto/googleapis/genomics/v1,@go_googleapis//google/genomics/v1:genomics_go_proto -google/genomics/v1/range.proto,@go_googleapis//google/genomics/v1:genomics_proto,google.golang.org/genproto/googleapis/genomics/v1,@go_googleapis//google/genomics/v1:genomics_go_proto -google/genomics/v1/readalignment.proto,@go_googleapis//google/genomics/v1:genomics_proto,google.golang.org/genproto/googleapis/genomics/v1,@go_googleapis//google/genomics/v1:genomics_go_proto -google/genomics/v1/readgroup.proto,@go_googleapis//google/genomics/v1:genomics_proto,google.golang.org/genproto/googleapis/genomics/v1,@go_googleapis//google/genomics/v1:genomics_go_proto -google/genomics/v1/readgroupset.proto,@go_googleapis//google/genomics/v1:genomics_proto,google.golang.org/genproto/googleapis/genomics/v1,@go_googleapis//google/genomics/v1:genomics_go_proto -google/genomics/v1/reads.proto,@go_googleapis//google/genomics/v1:genomics_proto,google.golang.org/genproto/googleapis/genomics/v1,@go_googleapis//google/genomics/v1:genomics_go_proto -google/genomics/v1/references.proto,@go_googleapis//google/genomics/v1:genomics_proto,google.golang.org/genproto/googleapis/genomics/v1,@go_googleapis//google/genomics/v1:genomics_go_proto -google/genomics/v1/variants.proto,@go_googleapis//google/genomics/v1:genomics_proto,google.golang.org/genproto/googleapis/genomics/v1,@go_googleapis//google/genomics/v1:genomics_go_proto -google/genomics/v1alpha2/pipelines.proto,@go_googleapis//google/genomics/v1alpha2:genomics_proto,google.golang.org/genproto/googleapis/genomics/v1alpha2,@go_googleapis//google/genomics/v1alpha2:genomics_go_proto -google/geo/type/viewport.proto,@go_googleapis//google/geo/type:viewport_proto,google.golang.org/genproto/googleapis/geo/type/viewport,@go_googleapis//google/geo/type:viewport_go_proto -google/home/graph/v1/device.proto,@go_googleapis//google/home/graph/v1:graph_proto,google.golang.org/genproto/googleapis/home/graph/v1,@go_googleapis//google/home/graph/v1:graph_go_proto -google/home/graph/v1/homegraph.proto,@go_googleapis//google/home/graph/v1:graph_proto,google.golang.org/genproto/googleapis/home/graph/v1,@go_googleapis//google/home/graph/v1:graph_go_proto -google/iam/admin/v1/iam.proto,@go_googleapis//google/iam/admin/v1:admin_proto,google.golang.org/genproto/googleapis/iam/admin/v1,@go_googleapis//google/iam/admin/v1:admin_go_proto -google/iam/credentials/v1/common.proto,@go_googleapis//google/iam/credentials/v1:credentials_proto,google.golang.org/genproto/googleapis/iam/credentials/v1,@go_googleapis//google/iam/credentials/v1:credentials_go_proto -google/iam/credentials/v1/iamcredentials.proto,@go_googleapis//google/iam/credentials/v1:credentials_proto,google.golang.org/genproto/googleapis/iam/credentials/v1,@go_googleapis//google/iam/credentials/v1:credentials_go_proto -google/iam/v1/iam_policy.proto,@go_googleapis//google/iam/v1:iam_proto,google.golang.org/genproto/googleapis/iam/v1,@go_googleapis//google/iam/v1:iam_go_proto -google/iam/v1/logging/audit_data.proto,@go_googleapis//google/iam/v1/logging:logging_proto,google.golang.org/genproto/googleapis/iam/v1/logging,@go_googleapis//google/iam/v1/logging:logging_go_proto -google/iam/v1/options.proto,@go_googleapis//google/iam/v1:iam_proto,google.golang.org/genproto/googleapis/iam/v1,@go_googleapis//google/iam/v1:iam_go_proto -google/iam/v1/policy.proto,@go_googleapis//google/iam/v1:iam_proto,google.golang.org/genproto/googleapis/iam/v1,@go_googleapis//google/iam/v1:iam_go_proto -google/logging/type/http_request.proto,@go_googleapis//google/logging/type:ltype_proto,google.golang.org/genproto/googleapis/logging/type,@go_googleapis//google/logging/type:ltype_go_proto -google/logging/type/log_severity.proto,@go_googleapis//google/logging/type:ltype_proto,google.golang.org/genproto/googleapis/logging/type,@go_googleapis//google/logging/type:ltype_go_proto -google/logging/v2/log_entry.proto,@go_googleapis//google/logging/v2:logging_proto,google.golang.org/genproto/googleapis/logging/v2,@go_googleapis//google/logging/v2:logging_go_proto -google/logging/v2/logging.proto,@go_googleapis//google/logging/v2:logging_proto,google.golang.org/genproto/googleapis/logging/v2,@go_googleapis//google/logging/v2:logging_go_proto -google/logging/v2/logging_config.proto,@go_googleapis//google/logging/v2:logging_proto,google.golang.org/genproto/googleapis/logging/v2,@go_googleapis//google/logging/v2:logging_go_proto -google/logging/v2/logging_metrics.proto,@go_googleapis//google/logging/v2:logging_proto,google.golang.org/genproto/googleapis/logging/v2,@go_googleapis//google/logging/v2:logging_go_proto -google/longrunning/operations.proto,@go_googleapis//google/longrunning:longrunning_proto,google.golang.org/genproto/googleapis/longrunning,@go_googleapis//google/longrunning:longrunning_go_proto -google/monitoring/v3/alert.proto,@go_googleapis//google/monitoring/v3:monitoring_proto,google.golang.org/genproto/googleapis/monitoring/v3,@go_googleapis//google/monitoring/v3:monitoring_go_proto -google/monitoring/v3/alert_service.proto,@go_googleapis//google/monitoring/v3:monitoring_proto,google.golang.org/genproto/googleapis/monitoring/v3,@go_googleapis//google/monitoring/v3:monitoring_go_proto -google/monitoring/v3/common.proto,@go_googleapis//google/monitoring/v3:monitoring_proto,google.golang.org/genproto/googleapis/monitoring/v3,@go_googleapis//google/monitoring/v3:monitoring_go_proto -google/monitoring/v3/dropped_labels.proto,@go_googleapis//google/monitoring/v3:monitoring_proto,google.golang.org/genproto/googleapis/monitoring/v3,@go_googleapis//google/monitoring/v3:monitoring_go_proto -google/monitoring/v3/group.proto,@go_googleapis//google/monitoring/v3:monitoring_proto,google.golang.org/genproto/googleapis/monitoring/v3,@go_googleapis//google/monitoring/v3:monitoring_go_proto -google/monitoring/v3/group_service.proto,@go_googleapis//google/monitoring/v3:monitoring_proto,google.golang.org/genproto/googleapis/monitoring/v3,@go_googleapis//google/monitoring/v3:monitoring_go_proto -google/monitoring/v3/metric.proto,@go_googleapis//google/monitoring/v3:monitoring_proto,google.golang.org/genproto/googleapis/monitoring/v3,@go_googleapis//google/monitoring/v3:monitoring_go_proto -google/monitoring/v3/metric_service.proto,@go_googleapis//google/monitoring/v3:monitoring_proto,google.golang.org/genproto/googleapis/monitoring/v3,@go_googleapis//google/monitoring/v3:monitoring_go_proto -google/monitoring/v3/mutation_record.proto,@go_googleapis//google/monitoring/v3:monitoring_proto,google.golang.org/genproto/googleapis/monitoring/v3,@go_googleapis//google/monitoring/v3:monitoring_go_proto -google/monitoring/v3/notification.proto,@go_googleapis//google/monitoring/v3:monitoring_proto,google.golang.org/genproto/googleapis/monitoring/v3,@go_googleapis//google/monitoring/v3:monitoring_go_proto -google/monitoring/v3/notification_service.proto,@go_googleapis//google/monitoring/v3:monitoring_proto,google.golang.org/genproto/googleapis/monitoring/v3,@go_googleapis//google/monitoring/v3:monitoring_go_proto -google/monitoring/v3/span_context.proto,@go_googleapis//google/monitoring/v3:monitoring_proto,google.golang.org/genproto/googleapis/monitoring/v3,@go_googleapis//google/monitoring/v3:monitoring_go_proto -google/monitoring/v3/uptime.proto,@go_googleapis//google/monitoring/v3:monitoring_proto,google.golang.org/genproto/googleapis/monitoring/v3,@go_googleapis//google/monitoring/v3:monitoring_go_proto -google/monitoring/v3/uptime_service.proto,@go_googleapis//google/monitoring/v3:monitoring_proto,google.golang.org/genproto/googleapis/monitoring/v3,@go_googleapis//google/monitoring/v3:monitoring_go_proto -google/privacy/dlp/v2/dlp.proto,@go_googleapis//google/privacy/dlp/v2:dlp_proto,google.golang.org/genproto/googleapis/privacy/dlp/v2,@go_googleapis//google/privacy/dlp/v2:dlp_go_proto -google/privacy/dlp/v2/storage.proto,@go_googleapis//google/privacy/dlp/v2:dlp_proto,google.golang.org/genproto/googleapis/privacy/dlp/v2,@go_googleapis//google/privacy/dlp/v2:dlp_go_proto -google/pubsub/v1/pubsub.proto,@go_googleapis//google/pubsub/v1:pubsub_proto,google.golang.org/genproto/googleapis/pubsub/v1,@go_googleapis//google/pubsub/v1:pubsub_go_proto -google/pubsub/v1beta2/pubsub.proto,@go_googleapis//google/pubsub/v1beta2:pubsub_proto,google.golang.org/genproto/googleapis/pubsub/v1beta2,@go_googleapis//google/pubsub/v1beta2:pubsub_go_proto -google/rpc/code.proto,@go_googleapis//google/rpc:code_proto,google.golang.org/genproto/googleapis/rpc/code,@go_googleapis//google/rpc:code_go_proto -google/rpc/error_details.proto,@go_googleapis//google/rpc:errdetails_proto,google.golang.org/genproto/googleapis/rpc/errdetails,@go_googleapis//google/rpc:errdetails_go_proto -google/rpc/status.proto,@go_googleapis//google/rpc:status_proto,google.golang.org/genproto/googleapis/rpc/status,@go_googleapis//google/rpc:status_go_proto -google/spanner/admin/database/v1/spanner_database_admin.proto,@go_googleapis//google/spanner/admin/database/v1:database_proto,google.golang.org/genproto/googleapis/spanner/admin/database/v1,@go_googleapis//google/spanner/admin/database/v1:database_go_proto -google/spanner/admin/instance/v1/spanner_instance_admin.proto,@go_googleapis//google/spanner/admin/instance/v1:instance_proto,google.golang.org/genproto/googleapis/spanner/admin/instance/v1,@go_googleapis//google/spanner/admin/instance/v1:instance_go_proto -google/spanner/v1/keys.proto,@go_googleapis//google/spanner/v1:spanner_proto,google.golang.org/genproto/googleapis/spanner/v1,@go_googleapis//google/spanner/v1:spanner_go_proto -google/spanner/v1/mutation.proto,@go_googleapis//google/spanner/v1:spanner_proto,google.golang.org/genproto/googleapis/spanner/v1,@go_googleapis//google/spanner/v1:spanner_go_proto -google/spanner/v1/query_plan.proto,@go_googleapis//google/spanner/v1:spanner_proto,google.golang.org/genproto/googleapis/spanner/v1,@go_googleapis//google/spanner/v1:spanner_go_proto -google/spanner/v1/result_set.proto,@go_googleapis//google/spanner/v1:spanner_proto,google.golang.org/genproto/googleapis/spanner/v1,@go_googleapis//google/spanner/v1:spanner_go_proto -google/spanner/v1/spanner.proto,@go_googleapis//google/spanner/v1:spanner_proto,google.golang.org/genproto/googleapis/spanner/v1,@go_googleapis//google/spanner/v1:spanner_go_proto -google/spanner/v1/transaction.proto,@go_googleapis//google/spanner/v1:spanner_proto,google.golang.org/genproto/googleapis/spanner/v1,@go_googleapis//google/spanner/v1:spanner_go_proto -google/spanner/v1/type.proto,@go_googleapis//google/spanner/v1:spanner_proto,google.golang.org/genproto/googleapis/spanner/v1,@go_googleapis//google/spanner/v1:spanner_go_proto -google/storagetransfer/v1/transfer.proto,@go_googleapis//google/storagetransfer/v1:storagetransfer_proto,google.golang.org/genproto/googleapis/storagetransfer/v1,@go_googleapis//google/storagetransfer/v1:storagetransfer_go_proto -google/storagetransfer/v1/transfer_types.proto,@go_googleapis//google/storagetransfer/v1:storagetransfer_proto,google.golang.org/genproto/googleapis/storagetransfer/v1,@go_googleapis//google/storagetransfer/v1:storagetransfer_go_proto -google/streetview/publish/v1/resources.proto,@go_googleapis//google/streetview/publish/v1:publish_proto,google.golang.org/genproto/googleapis/streetview/publish/v1,@go_googleapis//google/streetview/publish/v1:publish_go_proto -google/streetview/publish/v1/rpcmessages.proto,@go_googleapis//google/streetview/publish/v1:publish_proto,google.golang.org/genproto/googleapis/streetview/publish/v1,@go_googleapis//google/streetview/publish/v1:publish_go_proto -google/streetview/publish/v1/streetview_publish.proto,@go_googleapis//google/streetview/publish/v1:publish_proto,google.golang.org/genproto/googleapis/streetview/publish/v1,@go_googleapis//google/streetview/publish/v1:publish_go_proto -google/type/calendar_period.proto,@go_googleapis//google/type:calendarperiod_proto,google.golang.org/genproto/googleapis/type/calendarperiod,@go_googleapis//google/type:calendarperiod_go_proto -google/type/color.proto,@go_googleapis//google/type:color_proto,google.golang.org/genproto/googleapis/type/color,@go_googleapis//google/type:color_go_proto -google/type/date.proto,@go_googleapis//google/type:date_proto,google.golang.org/genproto/googleapis/type/date,@go_googleapis//google/type:date_go_proto -google/type/dayofweek.proto,@go_googleapis//google/type:dayofweek_proto,google.golang.org/genproto/googleapis/type/dayofweek,@go_googleapis//google/type:dayofweek_go_proto -google/type/expr.proto,@go_googleapis//google/type:expr_proto,google.golang.org/genproto/googleapis/type/expr,@go_googleapis//google/type:expr_go_proto -google/type/fraction.proto,@go_googleapis//google/type:fraction_proto,google.golang.org/genproto/googleapis/type/fraction,@go_googleapis//google/type:fraction_go_proto -google/type/latlng.proto,@go_googleapis//google/type:latlng_proto,google.golang.org/genproto/googleapis/type/latlng,@go_googleapis//google/type:latlng_go_proto -google/type/money.proto,@go_googleapis//google/type:money_proto,google.golang.org/genproto/googleapis/type/money,@go_googleapis//google/type:money_go_proto -google/type/postal_address.proto,@go_googleapis//google/type:postaladdress_proto,google.golang.org/genproto/googleapis/type/postaladdress,@go_googleapis//google/type:postaladdress_go_proto -google/type/quaternion.proto,@go_googleapis//google/type:quaternion_proto,google.golang.org/genproto/googleapis/type/quaternion,@go_googleapis//google/type:quaternion_go_proto -google/type/timeofday.proto,@go_googleapis//google/type:timeofday_proto,google.golang.org/genproto/googleapis/type/timeofday,@go_googleapis//google/type:timeofday_go_proto -google/watcher/v1/watch.proto,@go_googleapis//google/watcher/v1:watcher_proto,google.golang.org/genproto/googleapis/watcher/v1,@go_googleapis//google/watcher/v1:watcher_go_proto -grafeas/v1/attestation.proto,@go_googleapis//grafeas/v1:grafeas_proto,google.golang.org/genproto/googleapis/grafeas/v1,@go_googleapis//grafeas/v1:grafeas_go_proto -grafeas/v1/build.proto,@go_googleapis//grafeas/v1:grafeas_proto,google.golang.org/genproto/googleapis/grafeas/v1,@go_googleapis//grafeas/v1:grafeas_go_proto -grafeas/v1/common.proto,@go_googleapis//grafeas/v1:grafeas_proto,google.golang.org/genproto/googleapis/grafeas/v1,@go_googleapis//grafeas/v1:grafeas_go_proto -grafeas/v1/cvss.proto,@go_googleapis//grafeas/v1:grafeas_proto,google.golang.org/genproto/googleapis/grafeas/v1,@go_googleapis//grafeas/v1:grafeas_go_proto -grafeas/v1/deployment.proto,@go_googleapis//grafeas/v1:grafeas_proto,google.golang.org/genproto/googleapis/grafeas/v1,@go_googleapis//grafeas/v1:grafeas_go_proto -grafeas/v1/discovery.proto,@go_googleapis//grafeas/v1:grafeas_proto,google.golang.org/genproto/googleapis/grafeas/v1,@go_googleapis//grafeas/v1:grafeas_go_proto -grafeas/v1/grafeas.proto,@go_googleapis//grafeas/v1:grafeas_proto,google.golang.org/genproto/googleapis/grafeas/v1,@go_googleapis//grafeas/v1:grafeas_go_proto -grafeas/v1/image.proto,@go_googleapis//grafeas/v1:grafeas_proto,google.golang.org/genproto/googleapis/grafeas/v1,@go_googleapis//grafeas/v1:grafeas_go_proto -grafeas/v1/package.proto,@go_googleapis//grafeas/v1:grafeas_proto,google.golang.org/genproto/googleapis/grafeas/v1,@go_googleapis//grafeas/v1:grafeas_go_proto -grafeas/v1/provenance.proto,@go_googleapis//grafeas/v1:grafeas_proto,google.golang.org/genproto/googleapis/grafeas/v1,@go_googleapis//grafeas/v1:grafeas_go_proto -grafeas/v1/vulnerability.proto,@go_googleapis//grafeas/v1:grafeas_proto,google.golang.org/genproto/googleapis/grafeas/v1,@go_googleapis//grafeas/v1:grafeas_go_proto diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/resolve.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/resolve.go deleted file mode 100644 index 9170d2c3225..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/proto/resolve.go +++ /dev/null @@ -1,136 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 proto - -import ( - "errors" - "fmt" - "log" - "path" - "sort" - "strings" - - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/label" - "github.com/bazelbuild/bazel-gazelle/repo" - "github.com/bazelbuild/bazel-gazelle/resolve" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -func (_ *protoLang) Imports(c *config.Config, r *rule.Rule, f *rule.File) []resolve.ImportSpec { - rel := f.Pkg - srcs := r.AttrStrings("srcs") - imports := make([]resolve.ImportSpec, len(srcs)) - pc := GetProtoConfig(c) - prefix := rel - if pc.stripImportPrefix != "" { - prefix = strings.TrimPrefix(rel, pc.stripImportPrefix[1:]) - if rel == prefix { - return nil - } - } - if pc.importPrefix != "" { - prefix = path.Join(pc.importPrefix, prefix) - } - for i, src := range srcs { - imports[i] = resolve.ImportSpec{Lang: "proto", Imp: path.Join(prefix, src)} - } - return imports -} - -func (_ *protoLang) Embeds(r *rule.Rule, from label.Label) []label.Label { - return nil -} - -func (_ *protoLang) Resolve(c *config.Config, ix *resolve.RuleIndex, rc *repo.RemoteCache, r *rule.Rule, importsRaw interface{}, from label.Label) { - if importsRaw == nil { - // may not be set in tests. - return - } - imports := importsRaw.([]string) - r.DelAttr("deps") - depSet := make(map[string]bool) - for _, imp := range imports { - l, err := resolveProto(c, ix, r, imp, from) - if err == skipImportError { - continue - } else if err != nil { - log.Print(err) - } else { - l = l.Rel(from.Repo, from.Pkg) - depSet[l.String()] = true - } - } - if len(depSet) > 0 { - deps := make([]string, 0, len(depSet)) - for dep := range depSet { - deps = append(deps, dep) - } - sort.Strings(deps) - r.SetAttr("deps", deps) - } -} - -var ( - skipImportError = errors.New("std import") - notFoundError = errors.New("not found") -) - -func resolveProto(c *config.Config, ix *resolve.RuleIndex, r *rule.Rule, imp string, from label.Label) (label.Label, error) { - pc := GetProtoConfig(c) - if !strings.HasSuffix(imp, ".proto") { - return label.NoLabel, fmt.Errorf("can't import non-proto: %q", imp) - } - - if l, ok := resolve.FindRuleWithOverride(c, resolve.ImportSpec{Imp: imp, Lang: "proto"}, "proto"); ok { - return l, nil - } - - if l, ok := knownImports[imp]; ok && pc.Mode.ShouldUseKnownImports() { - if l.Equal(from) { - return label.NoLabel, skipImportError - } else { - return l, nil - } - } - - if l, err := resolveWithIndex(ix, imp, from); err == nil || err == skipImportError { - return l, err - } else if err != notFoundError { - return label.NoLabel, err - } - - rel := path.Dir(imp) - if rel == "." { - rel = "" - } - name := RuleName(rel) - return label.New("", rel, name), nil -} - -func resolveWithIndex(ix *resolve.RuleIndex, imp string, from label.Label) (label.Label, error) { - matches := ix.FindRulesByImport(resolve.ImportSpec{Lang: "proto", Imp: imp}, "proto") - if len(matches) == 0 { - return label.NoLabel, notFoundError - } - if len(matches) > 1 { - return label.NoLabel, fmt.Errorf("multiple rules (%s and %s) may be imported with %q from %s", matches[0].Label, matches[1].Label, imp, from) - } - if matches[0].IsSelfImport(from) { - return label.NoLabel, skipImportError - } - return matches[0].Label, nil -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/language/update.go b/vendor/github.com/bazelbuild/bazel-gazelle/language/update.go deleted file mode 100644 index cebf73a27f0..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/language/update.go +++ /dev/null @@ -1,120 +0,0 @@ -/* Copyright 2019 The Bazel Authors. 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 language - -import ( - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/repo" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -// RepoUpdater may be implemented by languages that support updating -// repository rules that provide named libraries. -// -// EXPERIMENTAL: this may change or be removed. -type RepoUpdater interface { - UpdateRepos(args UpdateReposArgs) UpdateReposResult -} - -// UpdateReposArgs contains arguments for RepoUpdater.UpdateRepos. -// Arguments are passed in a struct value so that new fields may be added -// in the future without breaking existing implementations. -// -// EXPERIMENTAL: this may change or be removed. -type UpdateReposArgs struct { - // Config is the configuration for the main workspace. - Config *config.Config - - // Imports is a list of libraries to update. UpdateRepos should return - // repository rules that provide these libraries. It may also return - // repository rules providing transitive dependencies. - Imports []string - - // Cache stores information fetched from the network and ensures that - // the same request isn't made multiple times. - Cache *repo.RemoteCache -} - -// UpdateReposResult contains return values for RepoUpdater.UpdateRepos. -// Results are returned through a struct so that new (optional) fields may be -// added without breaking existing implementations. -// -// EXPERIMENTAL: this may change or be removed. -type UpdateReposResult struct { - // Gen is a list of repository rules that provide libraries named by - // UpdateImportArgs.Imports. These will be merged with existing rules or - // added to WORKSPACE. This list may be shorter or longer than the list - // of imports, since a single repository may provide multiple imports, - // and additional repositories may be needed for transitive dependencies. - Gen []*rule.Rule - - // Error is any fatal error that occurred. Non-fatal errors should be logged. - Error error -} - -// RepoImporter may be implemented by languages that support importing -// repository rules from another build system. -// -// EXPERIMENTAL: this may change or be removed. -type RepoImporter interface { - // CanImport returns whether a given configuration file may be imported - // with this extension. Only one extension may import any given file. - // ImportRepos will not be called unless this returns true. - CanImport(path string) bool - - // ImportRepos generates a list of repository rules by reading a - // configuration file from another build system. - ImportRepos(args ImportReposArgs) ImportReposResult -} - -// ImportReposArgs contains arguments for RepoImporter.ImportRepos. -// Arguments are passed in a struct value so that new fields may be added -// in the future without breaking existing implementations. -// -// EXPERIMENTAL: this may change or be removed. -type ImportReposArgs struct { - // Config is the configuration for the main workspace. - Config *config.Config - - // Path is the name of the configuration file to import. - Path string - - // Prune indicates whether repository rules that are no longer needed - // should be deleted. This means the Empty list in the result should be - // filled in. - Prune bool - - // Cache stores information fetched from the network and ensures that - // the same request isn't made multiple times. - Cache *repo.RemoteCache -} - -// ImportReposResult contains return values for RepoImporter.ImportRepos. -// Results are returned through a struct so that new (optional) fields may -// be added without breaking existing implementations. -// -// EXPERIMENTAL: this may change or be removed. -type ImportReposResult struct { - // Gen is a list of imported repository rules. - Gen []*rule.Rule - - // Empty is a list of repository rules that may be deleted. This should only - // be set if ImportReposArgs.Prune is true. - Empty []*rule.Rule - - // Error is any fatal error that occurred. Non-fatal errors should be logged. - Error error -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/merger/BUILD b/vendor/github.com/bazelbuild/bazel-gazelle/merger/BUILD deleted file mode 100644 index f51dfca394a..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/merger/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "fix.go", - "merger.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/bazel-gazelle/merger", - importpath = "github.com/bazelbuild/bazel-gazelle/merger", - visibility = ["//visibility:public"], - deps = ["//vendor/github.com/bazelbuild/bazel-gazelle/rule:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/merger/fix.go b/vendor/github.com/bazelbuild/bazel-gazelle/merger/fix.go deleted file mode 100644 index 852b8d67680..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/merger/fix.go +++ /dev/null @@ -1,179 +0,0 @@ -/* Copyright 2017 The Bazel Authors. 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 merger - -import ( - "fmt" - "strings" - - "github.com/bazelbuild/bazel-gazelle/rule" -) - -// FixLoads removes loads of unused go rules and adds loads of newly used rules. -// This should be called after FixFile and MergeFile, since symbols -// may be introduced that aren't loaded. -// -// This function calls File.Sync before processing loads. -func FixLoads(f *rule.File, knownLoads []rule.LoadInfo) { - knownFiles := make(map[string]bool) - knownKinds := make(map[string]string) - for _, l := range knownLoads { - knownFiles[l.Name] = true - for _, k := range l.Symbols { - knownKinds[k] = l.Name - } - } - - // Sync the file. We need File.Loads and File.Rules to contain inserted - // statements and not deleted statements. - f.Sync() - - // Scan load statements in the file. Keep track of loads of known files, - // since these may be changed. Keep track of symbols loaded from unknown - // files; we will not add loads for these. - var loads []*rule.Load - otherLoadedKinds := make(map[string]bool) - for _, l := range f.Loads { - if knownFiles[l.Name()] { - loads = append(loads, l) - continue - } - for _, sym := range l.Symbols() { - otherLoadedKinds[sym] = true - } - } - - // Make a map of all the symbols from known files used in this file. - usedKinds := make(map[string]map[string]bool) - for _, r := range f.Rules { - kind := r.Kind() - if file, ok := knownKinds[kind]; ok && !otherLoadedKinds[kind] { - if usedKinds[file] == nil { - usedKinds[file] = make(map[string]bool) - } - usedKinds[file][kind] = true - } - } - - // Fix the load statements. The order is important, so we iterate over - // knownLoads instead of knownFiles. - for _, known := range knownLoads { - file := known.Name - first := true - for _, l := range loads { - if l.Name() != file { - continue - } - if first { - fixLoad(l, file, usedKinds[file], knownKinds) - first = false - } else { - fixLoad(l, file, nil, knownKinds) - } - if l.IsEmpty() { - l.Delete() - } - } - if first { - load := fixLoad(nil, file, usedKinds[file], knownKinds) - if load != nil { - index := newLoadIndex(f, known.After) - load.Insert(f, index) - } - } - } -} - -// fixLoad updates a load statement with the given symbols. If load is nil, -// a new load may be created and returned. Symbols in kinds will be added -// to the load if they're not already present. Known symbols not in kinds -// will be removed if present. Other symbols will be preserved. If load is -// empty, nil is returned. -func fixLoad(load *rule.Load, file string, kinds map[string]bool, knownKinds map[string]string) *rule.Load { - if load == nil { - if len(kinds) == 0 { - return nil - } - load = rule.NewLoad(file) - } - - for k := range kinds { - load.Add(k) - } - for _, k := range load.Symbols() { - if knownKinds[k] != "" && !kinds[k] { - load.Remove(k) - } - } - return load -} - -// newLoadIndex returns the index in stmts where a new load statement should -// be inserted. after is a list of function names that the load should not -// be inserted before. -func newLoadIndex(f *rule.File, after []string) int { - if len(after) == 0 { - return 0 - } - index := 0 - for _, r := range f.Rules { - for _, a := range after { - if r.Kind() == a && r.Index() >= index { - index = r.Index() + 1 - } - } - } - return index -} - -// CheckGazelleLoaded searches the given WORKSPACE file for a repository named -// "bazel_gazelle". If no such repository is found *and* the repo is not -// declared with a directive *and* at least one load statement mentions -// the repository, a descriptive error will be returned. -// -// This should be called after modifications have been made to WORKSPACE -// (i.e., after FixLoads) before writing it to disk. -func CheckGazelleLoaded(f *rule.File) error { - needGazelle := false - for _, l := range f.Loads { - if strings.HasPrefix(l.Name(), "@bazel_gazelle//") { - needGazelle = true - } - } - if !needGazelle { - return nil - } - for _, r := range f.Rules { - if r.Name() == "bazel_gazelle" { - return nil - } - } - for _, d := range f.Directives { - if d.Key != "repo" { - continue - } - if fs := strings.Fields(d.Value); len(fs) > 0 && fs[0] == "bazel_gazelle" { - return nil - } - } - return fmt.Errorf(`%s: error: bazel_gazelle is not declared in WORKSPACE. -Without this repository, Gazelle cannot safely modify the WORKSPACE file. -See the instructions at https://github.com/bazelbuild/bazel-gazelle. -If the bazel_gazelle is declared inside a macro, you can suppress this error -by adding a comment like this to WORKSPACE: - # gazelle:repo bazel_gazelle -`, f.Path) -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/merger/merger.go b/vendor/github.com/bazelbuild/bazel-gazelle/merger/merger.go deleted file mode 100644 index 7993eba071c..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/merger/merger.go +++ /dev/null @@ -1,250 +0,0 @@ -/* Copyright 2016 The Bazel Authors. 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 merger provides functions for merging generated rules into -// existing build files. -// -// Gazelle's normal workflow is roughly as follows: -// -// 1. Read metadata from sources. -// -// 2. Generate new rules. -// -// 3. Merge newly generated rules with rules in the existing build file -// if there is one. -// -// 4. Build an index of merged library rules for dependency resolution. -// -// 5. Resolve dependencies (i.e., convert import strings to deps labels). -// -// 6. Merge the newly resolved dependencies. -// -// 7. Write the merged file back to disk. -// -// This package is used for sets 3 and 6 above. -package merger - -import ( - "fmt" - "strings" - - "github.com/bazelbuild/bazel-gazelle/rule" -) - -// Phase indicates which attributes should be merged in matching rules. -type Phase int - -const ( - // The pre-resolve merge is performed before rules are indexed for dependency - // resolution. All attributes not related to dependencies are merged - // (i.e., rule.KindInfo.MergeableAttrs). This merge must be performed - // before indexing because attributes related to indexing (e.g., - // srcs, importpath) will be affected. - PreResolve Phase = iota - - // The post-resolve merge is performed after rules are indexed. All attributes - // related to dependencies are merged (i.e., rule.KindInfo.ResolveAttrs). - PostResolve -) - -// MergeFile combines information from newly generated rules with matching -// rules in an existing build file. MergeFile can also delete rules which -// are empty after merging. -// -// oldFile is the file to merge. It must not be nil. -// -// emptyRules is a list of stub rules (with no attributes other than name) -// which were not generated. These are merged with matching rules. The merged -// rules are deleted if they contain no attributes that make them buildable -// (e.g., srcs, deps, anything in rule.KindInfo.NonEmptyAttrs). -// -// genRules is a list of newly generated rules. These are merged with -// matching rules. A rule matches if it has the same kind and name or if -// some other attribute in rule.KindInfo.MatchAttrs matches (e.g., -// "importpath" in go_library). Elements of genRules that don't match -// any existing rule are appended to the end of oldFile. -// -// phase indicates whether this is a pre- or post-resolve merge. Different -// attributes (rule.KindInfo.MergeableAttrs or ResolveAttrs) will be merged. -// -// kinds maps rule kinds (e.g., "go_library") to metadata that helps merge -// rules of that kind. -// -// When a generated and existing rule are merged, each attribute is merged -// separately. If an attribute is mergeable (according to KindInfo), values -// from the existing attribute are replaced by values from the generated -// attribute. Comments are preserved on values that are present in both -// versions of the attribute. If at attribute is not mergeable, the generated -// version of the attribute will be added if no existing attribute is present; -// otherwise, the existing attribute will be preserved. -// -// Note that "# keep" comments affect merging. If a value within an existing -// attribute is marked with a "# keep" comment, it will not be removed. -// If an attribute is marked with a "# keep" comment, it will not be merged. -// If a rule is marked with a "# keep" comment, the whole rule will not -// be modified. -func MergeFile(oldFile *rule.File, emptyRules, genRules []*rule.Rule, phase Phase, kinds map[string]rule.KindInfo) { - getMergeAttrs := func(r *rule.Rule) map[string]bool { - if phase == PreResolve { - return kinds[r.Kind()].MergeableAttrs - } else { - return kinds[r.Kind()].ResolveAttrs - } - } - - // Merge empty rules into the file and delete any rules which become empty. - for _, emptyRule := range emptyRules { - if oldRule, _ := Match(oldFile.Rules, emptyRule, kinds[emptyRule.Kind()]); oldRule != nil { - if oldRule.ShouldKeep() { - continue - } - rule.MergeRules(emptyRule, oldRule, getMergeAttrs(emptyRule), oldFile.Path) - if oldRule.IsEmpty(kinds[oldRule.Kind()]) { - oldRule.Delete() - } - } - } - oldFile.Sync() - - // Match generated rules with existing rules in the file. Keep track of - // rules with non-standard names. - matchRules := make([]*rule.Rule, len(genRules)) - matchErrors := make([]error, len(genRules)) - substitutions := make(map[string]string) - for i, genRule := range genRules { - oldRule, err := Match(oldFile.Rules, genRule, kinds[genRule.Kind()]) - if err != nil { - // TODO(jayconrod): add a verbose mode and log errors. They are too chatty - // to print by default. - matchErrors[i] = err - continue - } - matchRules[i] = oldRule - if oldRule != nil { - if oldRule.Name() != genRule.Name() { - substitutions[genRule.Name()] = oldRule.Name() - } - } - } - - // Rename labels in generated rules that refer to other generated rules. - if len(substitutions) > 0 { - for _, genRule := range genRules { - substituteRule(genRule, substitutions, kinds[genRule.Kind()]) - } - } - - // Merge generated rules with existing rules or append to the end of the file. - for i, genRule := range genRules { - if matchErrors[i] != nil { - continue - } - if matchRules[i] == nil { - genRule.Insert(oldFile) - } else { - rule.MergeRules(genRule, matchRules[i], getMergeAttrs(genRule), oldFile.Path) - } - } -} - -// substituteRule replaces local labels (those beginning with ":", referring to -// targets in the same package) according to a substitution map. This is used -// to update generated rules before merging when the corresponding existing -// rules have different names. If substituteRule replaces a string, it returns -// a new expression; it will not modify the original expression. -func substituteRule(r *rule.Rule, substitutions map[string]string, info rule.KindInfo) { - for attr := range info.SubstituteAttrs { - if expr := r.Attr(attr); expr != nil { - expr = rule.MapExprStrings(expr, func(s string) string { - if rename, ok := substitutions[strings.TrimPrefix(s, ":")]; ok { - return ":" + rename - } else { - return s - } - }) - r.SetAttr(attr, expr) - } - } -} - -// Match searches for a rule that can be merged with x in rules. -// -// A rule is considered a match if its kind is equal to x's kind AND either its -// name is equal OR at least one of the attributes in matchAttrs is equal. -// -// If there are no matches, nil and nil are returned. -// -// If a rule has the same name but a different kind, nill and an error -// are returned. -// -// If there is exactly one match, the rule and nil are returned. -// -// If there are multiple matches, match will attempt to disambiguate, based on -// the quality of the match (name match is best, then attribute match in the -// order that attributes are listed). If disambiguation is successful, -// the rule and nil are returned. Otherwise, nil and an error are returned. -func Match(rules []*rule.Rule, x *rule.Rule, info rule.KindInfo) (*rule.Rule, error) { - xname := x.Name() - xkind := x.Kind() - var nameMatches []*rule.Rule - var kindMatches []*rule.Rule - for _, y := range rules { - if xname == y.Name() { - nameMatches = append(nameMatches, y) - } - if xkind == y.Kind() { - kindMatches = append(kindMatches, y) - } - } - - if len(nameMatches) == 1 { - y := nameMatches[0] - if xkind != y.Kind() { - return nil, fmt.Errorf("could not merge %s(%s): a rule of the same name has kind %s", xkind, xname, y.Kind()) - } - return y, nil - } - if len(nameMatches) > 1 { - return nil, fmt.Errorf("could not merge %s(%s): multiple rules have the same name", xkind, xname) - } - - for _, key := range info.MatchAttrs { - var attrMatches []*rule.Rule - xvalue := x.AttrString(key) - if xvalue == "" { - continue - } - for _, y := range kindMatches { - if xvalue == y.AttrString(key) { - attrMatches = append(attrMatches, y) - } - } - if len(attrMatches) == 1 { - return attrMatches[0], nil - } else if len(attrMatches) > 1 { - return nil, fmt.Errorf("could not merge %s(%s): multiple rules have the same attribute %s = %q", xkind, xname, key, xvalue) - } - } - - if info.MatchAny { - if len(kindMatches) == 1 { - return kindMatches[0], nil - } else if len(kindMatches) > 1 { - return nil, fmt.Errorf("could not merge %s(%s): multiple rules have the same kind but different names", xkind, xname) - } - } - - return nil, nil -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/pathtools/BUILD b/vendor/github.com/bazelbuild/bazel-gazelle/pathtools/BUILD deleted file mode 100644 index a2d99691f76..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/pathtools/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["path.go"], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/bazel-gazelle/pathtools", - importpath = "github.com/bazelbuild/bazel-gazelle/pathtools", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/pathtools/path.go b/vendor/github.com/bazelbuild/bazel-gazelle/pathtools/path.go deleted file mode 100644 index bdfcbc0db44..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/pathtools/path.go +++ /dev/null @@ -1,111 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 pathtools provides utilities for manipulating paths. Most paths -// within Gazelle are slash-separated paths, relative to the repository root -// directory. The repository root directory is represented by the empty -// string. Paths in this format may be used directly as package names in labels. -package pathtools - -import ( - "path" - "path/filepath" - "strings" -) - -// HasPrefix returns whether the slash-separated path p has the given -// prefix. Unlike strings.HasPrefix, this function respects component -// boundaries, so "/home/foo" is not a prefix is "/home/foobar/baz". If the -// prefix is empty, this function always returns true. -func HasPrefix(p, prefix string) bool { - return prefix == "" || p == prefix || strings.HasPrefix(p, prefix+"/") -} - -// TrimPrefix returns p without the provided prefix. If p doesn't start -// with prefix, it returns p unchanged. Unlike strings.HasPrefix, this function -// respects component boundaries (assuming slash-separated paths), so -// TrimPrefix("foo/bar", "foo") returns "baz". -func TrimPrefix(p, prefix string) string { - if prefix == "" { - return p - } - if prefix == p { - return "" - } - return strings.TrimPrefix(p, prefix+"/") -} - -// RelBaseName returns the base name for rel, a slash-separated path relative -// to the repository root. If rel is empty, RelBaseName returns the base name -// of prefix. If prefix is empty, RelBaseName returns the base name of root, -// the absolute file path of the repository root directory. If that's empty -// to, then RelBaseName returns "root". -func RelBaseName(rel, prefix, root string) string { - base := path.Base(rel) - if base == "." || base == "/" { - base = path.Base(prefix) - } - if base == "." || base == "/" { - base = filepath.Base(root) - } - if base == "." || base == "/" { - base = "root" - } - return base -} - -// Index returns the starting index of the string sub within the non-absolute -// slash-separated path p. sub must start and end at component boundaries -// within p. -func Index(p, sub string) int { - if sub == "" { - return 0 - } - p = path.Clean(p) - sub = path.Clean(sub) - if path.IsAbs(sub) { - if HasPrefix(p, sub) { - return 0 - } else { - return -1 - } - } - if p == "" || p == "/" { - return -1 - } - - i := 0 // i is the index of the first byte of a path element - if len(p) > 0 && p[0] == '/' { - i++ - } - for { - suffix := p[i:] - if len(suffix) < len(sub) { - return -1 - } - if suffix[:len(sub)] == sub && (len(suffix) == len(sub) || suffix[len(sub)] == '/') { - return i - } - j := strings.IndexByte(suffix, '/') - if j < 0 { - return -1 - } - i += j + 1 - if i >= len(p) { - return -1 - } - } - return -1 -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/repo/BUILD b/vendor/github.com/bazelbuild/bazel-gazelle/repo/BUILD deleted file mode 100644 index 4a49c8fa6e9..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/repo/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "remote.go", - "repo.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/bazel-gazelle/repo", - importpath = "github.com/bazelbuild/bazel-gazelle/repo", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/bazelbuild/bazel-gazelle/label:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/pathtools:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/rule:go_default_library", - "//vendor/golang.org/x/tools/go/vcs:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/repo/remote.go b/vendor/github.com/bazelbuild/bazel-gazelle/repo/remote.go deleted file mode 100644 index e378d6aa523..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/repo/remote.go +++ /dev/null @@ -1,583 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 repo - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path" - "path/filepath" - "regexp" - "runtime" - "strings" - "sync" - - "github.com/bazelbuild/bazel-gazelle/label" - "github.com/bazelbuild/bazel-gazelle/pathtools" - "golang.org/x/tools/go/vcs" -) - -// RemoteCache stores information about external repositories. The cache may -// be initialized with information about known repositories, i.e., those listed -// in the WORKSPACE file and mentioned on the command line. Other information -// is retrieved over the network. -// -// Public methods of RemoteCache may be slow in cases where a network fetch -// is needed. Public methods may be called concurrently. -// -// TODO(jayconrod): this is very Go-centric. It should be moved to language/go. -// Unfortunately, doing so would break the resolve.Resolver interface. -type RemoteCache struct { - // RepoRootForImportPath is vcs.RepoRootForImportPath by default. It may - // be overridden so that tests may avoid accessing the network. - RepoRootForImportPath func(string, bool) (*vcs.RepoRoot, error) - - // HeadCmd returns the latest commit on the default branch in the given - // repository. This is used by Head. It may be stubbed out for tests. - HeadCmd func(remote, vcs string) (string, error) - - // ModInfo returns the module path and version that provides the package - // with the given import path. This is used by Mod. It may be stubbed - // out for tests. - ModInfo func(importPath string) (modPath string, err error) - - // ModVersionInfo returns the module path, true version, and sum for - // the module that provides the package with the given import path. - // This is used by ModVersion. It may be stubbed out for tests. - ModVersionInfo func(modPath, query string) (version, sum string, err error) - - root, remote, head, mod, modVersion remoteCacheMap - - tmpOnce sync.Once - tmpDir string - tmpErr error -} - -// remoteCacheMap is a thread-safe, idempotent cache. It is used to store -// information which should be fetched over the network no more than once. -// This follows the Memo pattern described in The Go Programming Language, -// section 9.7. -type remoteCacheMap struct { - mu sync.Mutex - cache map[string]*remoteCacheEntry -} - -type remoteCacheEntry struct { - value interface{} - err error - - // ready is nil for entries that were added when the cache was initialized. - // It is non-nil for other entries. It is closed when an entry is ready, - // i.e., the operation loading the entry completed. - ready chan struct{} -} - -type rootValue struct { - root, name string -} - -type remoteValue struct { - remote, vcs string -} - -type headValue struct { - commit, tag string -} - -type modValue struct { - path, name string - known bool -} - -type modVersionValue struct { - path, name, version, sum string -} - -// Repo describes details of a Go repository known in advance. It is used to -// initialize RemoteCache so that some repositories don't need to be looked up. -// -// DEPRECATED: Go-specific details should be removed from RemoteCache, and -// lookup logic should be moved to language/go. This means RemoteCache will -// need to be initialized in a different way. -type Repo struct { - Name, GoPrefix, Remote, VCS string -} - -// NewRemoteCache creates a new RemoteCache with a set of known repositories. -// The Root and Remote methods will return information about repositories listed -// here without accessing the network. However, the Head method will still -// access the network for these repositories to retrieve information about new -// versions. -// -// A cleanup function is also returned. The caller must call this when -// RemoteCache is no longer needed. RemoteCache may write files to a temporary -// directory. This will delete them. -func NewRemoteCache(knownRepos []Repo) (r *RemoteCache, cleanup func() error) { - r = &RemoteCache{ - RepoRootForImportPath: vcs.RepoRootForImportPath, - HeadCmd: defaultHeadCmd, - root: remoteCacheMap{cache: make(map[string]*remoteCacheEntry)}, - remote: remoteCacheMap{cache: make(map[string]*remoteCacheEntry)}, - head: remoteCacheMap{cache: make(map[string]*remoteCacheEntry)}, - mod: remoteCacheMap{cache: make(map[string]*remoteCacheEntry)}, - modVersion: remoteCacheMap{cache: make(map[string]*remoteCacheEntry)}, - } - r.ModInfo = func(importPath string) (string, error) { - return defaultModInfo(r, importPath) - } - r.ModVersionInfo = func(modPath, query string) (string, string, error) { - return defaultModVersionInfo(r, modPath, query) - } - for _, repo := range knownRepos { - r.root.cache[repo.GoPrefix] = &remoteCacheEntry{ - value: rootValue{ - root: repo.GoPrefix, - name: repo.Name, - }, - } - if repo.Remote != "" { - r.remote.cache[repo.GoPrefix] = &remoteCacheEntry{ - value: remoteValue{ - remote: repo.Remote, - vcs: repo.VCS, - }, - } - } - r.mod.cache[repo.GoPrefix] = &remoteCacheEntry{ - value: modValue{ - path: repo.GoPrefix, - name: repo.Name, - known: true, - }, - } - } - - // Augment knownRepos with additional prefixes for - // minimal module compatibility. For example, if repo "com_example_foo_v2" - // has prefix "example.com/foo/v2", map "example.com/foo" to the same - // entry. - // TODO(jayconrod): there should probably be some control over whether - // callers can use these mappings: packages within modules should not be - // allowed to use them. However, we'll return the same result nearly all - // the time, and simpler is better. - for _, repo := range knownRepos { - path := pathWithoutSemver(repo.GoPrefix) - if path == "" || r.root.cache[path] != nil { - continue - } - r.root.cache[path] = r.root.cache[repo.GoPrefix] - if e := r.remote.cache[repo.GoPrefix]; e != nil { - r.remote.cache[path] = e - } - r.mod.cache[path] = r.mod.cache[repo.GoPrefix] - } - - return r, r.cleanup -} - -func (r *RemoteCache) cleanup() error { - if r.tmpDir == "" { - return nil - } - return os.RemoveAll(r.tmpDir) -} - -var gopkginPattern = regexp.MustCompile("^(gopkg.in/(?:[^/]+/)?[^/]+\\.v\\d+)(?:/|$)") - -var knownPrefixes = []struct { - prefix string - missing int -}{ - {prefix: "golang.org/x", missing: 1}, - {prefix: "google.golang.org", missing: 1}, - {prefix: "cloud.google.com", missing: 1}, - {prefix: "github.com", missing: 2}, -} - -// Root returns the portion of an import path that corresponds to the root -// directory of the repository containing the given import path. For example, -// given "golang.org/x/tools/go/loader", this will return "golang.org/x/tools". -// The workspace name of the repository is also returned. This may be a custom -// name set in WORKSPACE, or it may be a generated name based on the root path. -func (r *RemoteCache) Root(importPath string) (root, name string, err error) { - // Try prefixes of the import path in the cache, but don't actually go out - // to vcs yet. We do this before handling known special cases because - // the cache is pre-populated with repository rules, and we want to use their - // names if we can. - prefix := importPath - for { - v, ok, err := r.root.get(prefix) - if ok { - if err != nil { - return "", "", err - } - value := v.(rootValue) - return value.root, value.name, nil - } - - prefix = path.Dir(prefix) - if prefix == "." || prefix == "/" { - break - } - } - - // Try known prefixes. - for _, p := range knownPrefixes { - if pathtools.HasPrefix(importPath, p.prefix) { - rest := pathtools.TrimPrefix(importPath, p.prefix) - var components []string - if rest != "" { - components = strings.Split(rest, "/") - } - if len(components) < p.missing { - return "", "", fmt.Errorf("import path %q is shorter than the known prefix %q", importPath, p.prefix) - } - root = p.prefix - for _, c := range components[:p.missing] { - root = path.Join(root, c) - } - name = label.ImportPathToBazelRepoName(root) - return root, name, nil - } - } - - // gopkg.in is special, and might have either one or two levels of - // missing paths. See http://labix.org/gopkg.in for URL patterns. - if match := gopkginPattern.FindStringSubmatch(importPath); len(match) > 0 { - root = match[1] - name = label.ImportPathToBazelRepoName(root) - return root, name, nil - } - - // Find the prefix using vcs and cache the result. - v, err := r.root.ensure(importPath, func() (interface{}, error) { - res, err := r.RepoRootForImportPath(importPath, false) - if err != nil { - return nil, err - } - return rootValue{res.Root, label.ImportPathToBazelRepoName(res.Root)}, nil - }) - if err != nil { - return "", "", err - } - value := v.(rootValue) - return value.root, value.name, nil -} - -// Remote returns the VCS name and the remote URL for a repository with the -// given root import path. This is suitable for creating new repository rules. -func (r *RemoteCache) Remote(root string) (remote, vcs string, err error) { - v, err := r.remote.ensure(root, func() (interface{}, error) { - repo, err := r.RepoRootForImportPath(root, false) - if err != nil { - return nil, err - } - return remoteValue{remote: repo.Repo, vcs: repo.VCS.Cmd}, nil - }) - if err != nil { - return "", "", err - } - value := v.(remoteValue) - return value.remote, value.vcs, nil -} - -// Head returns the most recent commit id on the default branch and latest -// version tag for the given remote repository. The tag "" is returned if -// no latest version was found. -// -// TODO(jayconrod): support VCS other than git. -// TODO(jayconrod): support version tags. "" is always returned. -func (r *RemoteCache) Head(remote, vcs string) (commit, tag string, err error) { - if vcs != "git" { - return "", "", fmt.Errorf("could not locate recent commit in repo %q with unknown version control scheme %q", remote, vcs) - } - - v, err := r.head.ensure(remote, func() (interface{}, error) { - commit, err := r.HeadCmd(remote, vcs) - if err != nil { - return nil, err - } - return headValue{commit: commit}, nil - }) - if err != nil { - return "", "", err - } - value := v.(headValue) - return value.commit, value.tag, nil -} - -func defaultHeadCmd(remote, vcs string) (string, error) { - switch vcs { - case "local": - return "", nil - - case "git": - // Old versions of git ls-remote exit with code 129 when "--" is passed. - // We'll try to validate the argument here instead. - if strings.HasPrefix(remote, "-") { - return "", fmt.Errorf("remote must not start with '-': %q", remote) - } - cmd := exec.Command("git", "ls-remote", remote, "HEAD") - out, err := cmd.Output() - if err != nil { - var stdErr []byte - if e, ok := err.(*exec.ExitError); ok { - stdErr = e.Stderr - } - return "", fmt.Errorf("git ls-remote for %s : %v : %s", remote, err, stdErr) - } - ix := bytes.IndexByte(out, '\t') - if ix < 0 { - return "", fmt.Errorf("could not parse output for git ls-remote for %q", remote) - } - return string(out[:ix]), nil - - default: - return "", fmt.Errorf("unknown version control system: %s", vcs) - } -} - -// Mod returns the module path for the module that contains the package -// named by importPath. The name of the go_repository rule for the module -// is also returned. For example, calling Mod on "github.com/foo/bar/v2/baz" -// would give the module path "github.com/foo/bar/v2" and the name -// "com_github_foo_bar_v2". -// -// If a known repository *could* provide importPath (because its "importpath" -// is a prefix of importPath), Mod will assume that it does. This may give -// inaccurate results if importPath is in an undeclared nested module. Run -// "gazelle update-repos -from_file=go.mod" first for best results. -// -// If no known repository could provide importPath, Mod will run "go list" to -// find the module. The special patterns that Root uses are ignored. Results are -// cached. Use GOPROXY for faster results. -func (r *RemoteCache) Mod(importPath string) (modPath, name string, err error) { - // Check if any of the known repositories is a prefix. - prefix := importPath - for { - v, ok, err := r.mod.get(prefix) - if ok { - if err != nil { - return "", "", err - } - value := v.(modValue) - if value.known { - return value.path, value.name, nil - } else { - break - } - } - - prefix = path.Dir(prefix) - if prefix == "." || prefix == "/" { - break - } - } - - // Ask "go list". - v, err := r.mod.ensure(importPath, func() (interface{}, error) { - modPath, err := r.ModInfo(importPath) - if err != nil { - return nil, err - } - return modValue{ - path: modPath, - name: label.ImportPathToBazelRepoName(modPath), - }, nil - }) - if err != nil { - return "", "", err - } - value := v.(modValue) - return value.path, value.name, nil -} - -func defaultModInfo(rc *RemoteCache, importPath string) (modPath string, err error) { - rc.initTmp() - if rc.tmpErr != nil { - return "", rc.tmpErr - } - - goTool := findGoTool() - cmd := exec.Command(goTool, "list", "-find", "-f", "{{.Module.Path}}", "--", importPath) - cmd.Dir = rc.tmpDir - cmd.Env = append(os.Environ(), "GO111MODULE=on") - out, err := cmd.Output() - if err != nil { - var stdErr []byte - if e, ok := err.(*exec.ExitError); ok { - stdErr = e.Stderr - } - return "", fmt.Errorf("finding module path for import %s: %v: %s", importPath, err, stdErr) - } - return strings.TrimSpace(string(out)), nil -} - -// ModVersion looks up information about a module at a given version. -// The path must be the module path, not a package within the module. -// The version may be a canonical semantic version, a query like "latest", -// or a branch, tag, or revision name. ModVersion returns the name of -// the repository rule providing the module (if any), the true version, -// and the sum. -func (r *RemoteCache) ModVersion(modPath, query string) (name, version, sum string, err error) { - // Ask "go list". - arg := modPath + "@" + query - v, err := r.modVersion.ensure(arg, func() (interface{}, error) { - version, sum, err := r.ModVersionInfo(modPath, query) - if err != nil { - return nil, err - } - return modVersionValue{ - path: modPath, - version: version, - sum: sum, - }, nil - }) - if err != nil { - return "", "", "", err - } - value := v.(modVersionValue) - - // Try to find the repository name for the module, if there's already - // a repository rule that provides it. - v, ok, err := r.mod.get(modPath) - if ok && err == nil { - name = v.(modValue).name - } else { - name = label.ImportPathToBazelRepoName(modPath) - } - - return name, value.version, value.sum, nil -} - -func defaultModVersionInfo(rc *RemoteCache, modPath, query string) (version, sum string, err error) { - rc.initTmp() - if rc.tmpErr != nil { - return "", "", rc.tmpErr - } - - goTool := findGoTool() - cmd := exec.Command(goTool, "mod", "download", "-json", "--", modPath+"@"+query) - cmd.Dir = rc.tmpDir - cmd.Env = append(os.Environ(), "GO111MODULE=on") - out, err := cmd.Output() - if err != nil { - var stdErr []byte - if e, ok := err.(*exec.ExitError); ok { - stdErr = e.Stderr - } - return "", "", fmt.Errorf("finding module version and sum for %s@%s: %v: %s", modPath, query, err, stdErr) - } - - var result struct{ Version, Sum string } - if err := json.Unmarshal(out, &result); err != nil { - fmt.Println(out) - return "", "", fmt.Errorf("finding module version and sum for %s@%s: invalid output from 'go mod download': %v", modPath, query, err) - } - return result.Version, result.Sum, nil -} - -// get retrieves a value associated with the given key from the cache. ok will -// be true if the key exists in the cache, even if it's in the process of -// being fetched. -func (m *remoteCacheMap) get(key string) (value interface{}, ok bool, err error) { - m.mu.Lock() - e, ok := m.cache[key] - m.mu.Unlock() - if !ok { - return nil, ok, nil - } - if e.ready != nil { - <-e.ready - } - return e.value, ok, e.err -} - -// ensure retreives a value associated with the given key from the cache. If -// the key does not exist in the cache, the load function will be called, -// and its result will be associated with the key. The load function will not -// be called more than once for any key. -func (m *remoteCacheMap) ensure(key string, load func() (interface{}, error)) (interface{}, error) { - m.mu.Lock() - e, ok := m.cache[key] - if !ok { - e = &remoteCacheEntry{ready: make(chan struct{})} - m.cache[key] = e - m.mu.Unlock() - e.value, e.err = load() - close(e.ready) - } else { - m.mu.Unlock() - if e.ready != nil { - <-e.ready - } - } - return e.value, e.err -} - -func (rc *RemoteCache) initTmp() { - rc.tmpOnce.Do(func() { - rc.tmpDir, rc.tmpErr = ioutil.TempDir("", "gazelle-remotecache-") - if rc.tmpErr != nil { - return - } - rc.tmpErr = ioutil.WriteFile(filepath.Join(rc.tmpDir, "go.mod"), []byte(`module gazelle_remote_cache__\n`), 0666) - }) -} - -var semverRex = regexp.MustCompile(`^.*?(/v\d+)(?:/.*)?$`) - -// pathWithoutSemver removes a semantic version suffix from path. -// For example, if path is "example.com/foo/v2/bar", pathWithoutSemver -// will return "example.com/foo/bar". If there is no semantic version suffix, -// "" will be returned. -// TODO(jayconrod): copied from language/go. This whole type should be -// migrated there. -func pathWithoutSemver(path string) string { - m := semverRex.FindStringSubmatchIndex(path) - if m == nil { - return "" - } - v := path[m[2]+2 : m[3]] - if v == "0" || v == "1" { - return "" - } - return path[:m[2]] + path[m[3]:] -} - -// findGoTool attempts to locate the go executable. If GOROOT is set, we'll -// prefer the one in there; otherwise, we'll rely on PATH. If the wrapper -// script generated by the gazelle rule is invoked by Bazel, it will set -// GOROOT to the configured SDK. We don't want to rely on the host SDK in -// that situation. -// -// TODO(jayconrod): copied from language/go (though it was originally in this -// package). Go-specific details should be removed from RemoteCache, and -// this copy should be deleted. -func findGoTool() string { - path := "go" // rely on PATH by default - if goroot, ok := os.LookupEnv("GOROOT"); ok { - path = filepath.Join(goroot, "bin", "go") - } - if runtime.GOOS == "windows" { - path += ".exe" - } - return path -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/repo/repo.go b/vendor/github.com/bazelbuild/bazel-gazelle/repo/repo.go deleted file mode 100644 index e5ce5dff606..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/repo/repo.go +++ /dev/null @@ -1,166 +0,0 @@ -/* Copyright 2017 The Bazel Authors. 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 repo provides functionality for managing Go repository rules. -// -// UNSTABLE: The exported APIs in this package may change. In the future, -// language extensions should implement an interface for repository -// rule management. The update-repos command will call interface methods, -// and most if this package's functionality will move to language/go. -// Moving this package to an internal directory would break existing -// extensions, since RemoteCache is referenced through the resolve.Resolver -// interface, which extensions are required to implement. -package repo - -import ( - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/bazelbuild/bazel-gazelle/rule" -) - -type byRuleName []*rule.Rule - -func (s byRuleName) Len() int { return len(s) } -func (s byRuleName) Less(i, j int) bool { return s[i].Name() < s[j].Name() } -func (s byRuleName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -// FindExternalRepo attempts to locate the directory where Bazel has fetched -// the external repository with the given name. An error is returned if the -// repository directory cannot be located. -func FindExternalRepo(repoRoot, name string) (string, error) { - // See https://docs.bazel.build/versions/master/output_directories.html - // for documentation on Bazel directory layout. - // We expect the bazel-out symlink in the workspace root directory to point to - // /execroot//bazel-out - // We expect the external repository to be checked out at - // /external/ - // Note that users can change the prefix for most of the Bazel symlinks with - // --symlink_prefix, but this does not include bazel-out. - externalPath := strings.Join([]string{repoRoot, "bazel-out", "..", "..", "..", "external", name}, string(os.PathSeparator)) - cleanPath, err := filepath.EvalSymlinks(externalPath) - if err != nil { - return "", err - } - st, err := os.Stat(cleanPath) - if err != nil { - return "", err - } - if !st.IsDir() { - return "", fmt.Errorf("%s: not a directory", externalPath) - } - return cleanPath, nil -} - -// ListRepositories extracts metadata about repositories declared in a -// file. -func ListRepositories(workspace *rule.File) (repos []*rule.Rule, repoFileMap map[string]*rule.File, err error) { - repoIndexMap := make(map[string]int) - repoFileMap = make(map[string]*rule.File) - for _, repo := range workspace.Rules { - if name := repo.Name(); name != "" { - repos = append(repos, repo) - repoFileMap[name] = workspace - repoIndexMap[name] = len(repos) - 1 - } - } - extraRepos, err := parseRepositoryDirectives(workspace.Directives) - if err != nil { - return nil, nil, err - } - for _, repo := range extraRepos { - if i, ok := repoIndexMap[repo.Name()]; ok { - repos[i] = repo - } else { - repos = append(repos, repo) - } - repoFileMap[repo.Name()] = workspace - } - - for _, d := range workspace.Directives { - switch d.Key { - case "repository_macro": - f, defName, err := parseRepositoryMacroDirective(d.Value) - if err != nil { - return nil, nil, err - } - f = filepath.Join(filepath.Dir(workspace.Path), filepath.Clean(f)) - macroFile, err := rule.LoadMacroFile(f, "", defName) - if err != nil { - return nil, nil, err - } - for _, repo := range macroFile.Rules { - if name := repo.Name(); name != "" { - repos = append(repos, repo) - repoFileMap[name] = macroFile - repoIndexMap[name] = len(repos) - 1 - } - } - extraRepos, err = parseRepositoryDirectives(macroFile.Directives) - if err != nil { - return nil, nil, err - } - for _, repo := range extraRepos { - if i, ok := repoIndexMap[repo.Name()]; ok { - repos[i] = repo - } else { - repos = append(repos, repo) - } - repoFileMap[repo.Name()] = macroFile - } - } - } - return repos, repoFileMap, nil -} - -func parseRepositoryDirectives(directives []rule.Directive) (repos []*rule.Rule, err error) { - for _, d := range directives { - switch d.Key { - case "repository": - vals := strings.Fields(d.Value) - if len(vals) < 2 { - return nil, fmt.Errorf("failure parsing repository: %s, expected repository kind and attributes", d.Value) - } - kind := vals[0] - r := rule.NewRule(kind, "") - for _, val := range vals[1:] { - kv := strings.SplitN(val, "=", 2) - if len(kv) != 2 { - return nil, fmt.Errorf("failure parsing repository: %s, expected format for attributes is attr1_name=attr1_value", d.Value) - } - r.SetAttr(kv[0], kv[1]) - } - if r.Name() == "" { - return nil, fmt.Errorf("failure parsing repository: %s, expected a name attribute for the given repository", d.Value) - } - repos = append(repos, r) - } - } - return repos, nil -} - -func parseRepositoryMacroDirective(directive string) (string, string, error) { - vals := strings.Split(directive, "%") - if len(vals) != 2 { - return "", "", fmt.Errorf("Failure parsing repository_macro: %s, expected format is macroFile%%defName", directive) - } - f := vals[0] - if strings.HasPrefix(f, "..") { - return "", "", fmt.Errorf("Failure parsing repository_macro: %s, macro file path %s should not start with \"..\"", directive, f) - } - return f, vals[1], nil -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/resolve/BUILD b/vendor/github.com/bazelbuild/bazel-gazelle/resolve/BUILD deleted file mode 100644 index 9877c35ef07..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/resolve/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "config.go", - "index.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/bazel-gazelle/resolve", - importpath = "github.com/bazelbuild/bazel-gazelle/resolve", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/bazelbuild/bazel-gazelle/config:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/label:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/repo:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/rule:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/resolve/config.go b/vendor/github.com/bazelbuild/bazel-gazelle/resolve/config.go deleted file mode 100644 index 27d38955c53..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/resolve/config.go +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 resolve - -import ( - "flag" - "log" - "strings" - - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/label" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -// FindRuleWithOverride searches the current configuration for user-specified -// dependency resolution overrides. Overrides specified later (in configuration -// files in deeper directories, or closer to the end of the file) are -// returned first. If no override is found, label.NoLabel is returned. -func FindRuleWithOverride(c *config.Config, imp ImportSpec, lang string) (label.Label, bool) { - rc := getResolveConfig(c) - for i := len(rc.overrides) - 1; i >= 0; i-- { - o := rc.overrides[i] - if o.matches(imp, lang) { - return o.dep, true - } - } - return label.NoLabel, false -} - -type overrideSpec struct { - imp ImportSpec - lang string - dep label.Label -} - -func (o overrideSpec) matches(imp ImportSpec, lang string) bool { - return imp.Lang == o.imp.Lang && - imp.Imp == o.imp.Imp && - (o.lang == "" || o.lang == lang) -} - -type resolveConfig struct { - overrides []overrideSpec -} - -const resolveName = "_resolve" - -func getResolveConfig(c *config.Config) *resolveConfig { - return c.Exts[resolveName].(*resolveConfig) -} - -type Configurer struct{} - -func (_ *Configurer) RegisterFlags(fs *flag.FlagSet, cmd string, c *config.Config) { - c.Exts[resolveName] = &resolveConfig{} -} - -func (_ *Configurer) CheckFlags(fs *flag.FlagSet, c *config.Config) error { return nil } - -func (_ *Configurer) KnownDirectives() []string { - return []string{"resolve"} -} - -func (_ *Configurer) Configure(c *config.Config, rel string, f *rule.File) { - rc := getResolveConfig(c) - rcCopy := &resolveConfig{ - overrides: rc.overrides[:], - } - - if f != nil { - for _, d := range f.Directives { - if d.Key == "resolve" { - parts := strings.Fields(d.Value) - o := overrideSpec{} - var lbl string - if len(parts) == 3 { - o.imp.Lang = parts[0] - o.imp.Imp = parts[1] - lbl = parts[2] - } else if len(parts) == 4 { - o.imp.Lang = parts[0] - o.lang = parts[1] - o.imp.Imp = parts[2] - lbl = parts[3] - } else { - log.Printf("could not parse directive: %s\n\texpected gazelle:resolve source-language [import-language] import-string label", d.Value) - continue - } - var err error - o.dep, err = label.Parse(lbl) - if err != nil { - log.Printf("gazelle:resolve %s: %v", d.Value, err) - continue - } - o.dep = o.dep.Abs("", rel) - rcCopy.overrides = append(rcCopy.overrides, o) - } - } - } - - c.Exts[resolveName] = rcCopy -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/resolve/index.go b/vendor/github.com/bazelbuild/bazel-gazelle/resolve/index.go deleted file mode 100644 index a02d15c6ac7..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/resolve/index.go +++ /dev/null @@ -1,246 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 resolve - -import ( - "log" - - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/label" - "github.com/bazelbuild/bazel-gazelle/repo" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -// ImportSpec describes a library to be imported. Imp is an import string for -// the library. Lang is the language in which the import string appears (this -// should match Resolver.Name). -type ImportSpec struct { - Lang, Imp string -} - -// Resolver is an interface that language extensions can implement to resolve -// dependencies in rules they generate. -type Resolver interface { - // Name returns the name of the language. This should be a prefix of the - // kinds of rules generated by the language, e.g., "go" for the Go extension - // since it generates "go_library" rules. - Name() string - - // Imports returns a list of ImportSpecs that can be used to import the rule - // r. This is used to populate RuleIndex. - // - // If nil is returned, the rule will not be indexed. If any non-nil slice is - // returned, including an empty slice, the rule will be indexed. - Imports(c *config.Config, r *rule.Rule, f *rule.File) []ImportSpec - - // Embeds returns a list of labels of rules that the given rule embeds. If - // a rule is embedded by another importable rule of the same language, only - // the embedding rule will be indexed. The embedding rule will inherit - // the imports of the embedded rule. - Embeds(r *rule.Rule, from label.Label) []label.Label - - // Resolve translates imported libraries for a given rule into Bazel - // dependencies. Information about imported libraries is returned for each - // rule generated by language.GenerateRules in - // language.GenerateResult.Imports. Resolve generates a "deps" attribute (or - // the appropriate language-specific equivalent) for each import according to - // language-specific rules and heuristics. - Resolve(c *config.Config, ix *RuleIndex, rc *repo.RemoteCache, r *rule.Rule, imports interface{}, from label.Label) -} - -// RuleIndex is a table of rules in a workspace, indexed by label and by -// import path. Used by Resolver to map import paths to labels. -type RuleIndex struct { - rules []*ruleRecord - labelMap map[label.Label]*ruleRecord - importMap map[ImportSpec][]*ruleRecord - mrslv func(r *rule.Rule, pkgRel string) Resolver -} - -// ruleRecord contains information about a rule relevant to import indexing. -type ruleRecord struct { - rule *rule.Rule - label label.Label - file *rule.File - - // importedAs is a list of ImportSpecs by which this rule may be imported. - // Used to build a map from ImportSpecs to ruleRecords. - importedAs []ImportSpec - - // embeds is the transitive closure of labels for rules that this rule embeds - // (as determined by the Embeds method). This only includes rules in the same - // language (i.e., it includes a go_library embedding a go_proto_library, but - // not a go_proto_library embedding a proto_library). - embeds []label.Label - - // embedded indicates whether another rule of the same language embeds this - // rule. Embedded rules should not be indexed. - embedded bool - - didCollectEmbeds bool -} - -// NewRuleIndex creates a new index. -// -// kindToResolver is a map from rule kinds (for example, "go_library") to -// Resolvers that support those kinds. -func NewRuleIndex(mrslv func(r *rule.Rule, pkgRel string) Resolver) *RuleIndex { - return &RuleIndex{ - labelMap: make(map[label.Label]*ruleRecord), - mrslv: mrslv, - } -} - -// AddRule adds a rule r to the index. The rule will only be indexed if there -// is a known resolver for the rule's kind and Resolver.Imports returns a -// non-nil slice. -// -// AddRule may only be called before Finish. -func (ix *RuleIndex) AddRule(c *config.Config, r *rule.Rule, f *rule.File) { - var imps []ImportSpec - if rslv := ix.mrslv(r, f.Pkg); rslv != nil { - imps = rslv.Imports(c, r, f) - } - // If imps == nil, the rule is not importable. If imps is the empty slice, - // it may still be importable if it embeds importable libraries. - if imps == nil { - return - } - - record := &ruleRecord{ - rule: r, - label: label.New(c.RepoName, f.Pkg, r.Name()), - file: f, - importedAs: imps, - } - if _, ok := ix.labelMap[record.label]; ok { - log.Printf("multiple rules found with label %s", record.label) - return - } - ix.rules = append(ix.rules, record) - ix.labelMap[record.label] = record -} - -// Finish constructs the import index and performs any other necessary indexing -// actions after all rules have been added. This step is necessary because -// a rule may be indexed differently based on what rules are added later. -// -// Finish must be called after all AddRule calls and before any -// FindRulesByImport calls. -func (ix *RuleIndex) Finish() { - for _, r := range ix.rules { - ix.collectEmbeds(r) - } - ix.buildImportIndex() -} - -func (ix *RuleIndex) collectEmbeds(r *ruleRecord) { - if r.didCollectEmbeds { - return - } - resolver := ix.mrslv(r.rule, r.file.Pkg) - r.didCollectEmbeds = true - embedLabels := resolver.Embeds(r.rule, r.label) - r.embeds = embedLabels - for _, e := range embedLabels { - er, ok := ix.findRuleByLabel(e, r.label) - if !ok { - continue - } - ix.collectEmbeds(er) - if resolver == ix.mrslv(er.rule, er.file.Pkg) { - er.embedded = true - r.embeds = append(r.embeds, er.embeds...) - } - r.importedAs = append(r.importedAs, er.importedAs...) - } -} - -// buildImportIndex constructs the map used by FindRulesByImport. -func (ix *RuleIndex) buildImportIndex() { - ix.importMap = make(map[ImportSpec][]*ruleRecord) - for _, r := range ix.rules { - if r.embedded { - continue - } - indexed := make(map[ImportSpec]bool) - for _, imp := range r.importedAs { - if indexed[imp] { - continue - } - indexed[imp] = true - ix.importMap[imp] = append(ix.importMap[imp], r) - } - } -} - -func (ix *RuleIndex) findRuleByLabel(label label.Label, from label.Label) (*ruleRecord, bool) { - label = label.Abs(from.Repo, from.Pkg) - r, ok := ix.labelMap[label] - return r, ok -} - -type FindResult struct { - // Label is the absolute label (including repository and package name) for - // a matched rule. - Label label.Label - - // Embeds is the transitive closure of labels for rules that the matched - // rule embeds. It may contains duplicates and does not include the label - // for the rule itself. - Embeds []label.Label -} - -// FindRulesByImport attempts to resolve an import string to a rule record. -// imp is the import to resolve (which includes the target language). lang is -// the language of the rule with the dependency (for example, in -// go_proto_library, imp will have ProtoLang and lang will be GoLang). -// from is the rule which is doing the dependency. This is used to check -// vendoring visibility and to check for self-imports. -// -// FindRulesByImport returns a list of rules, since any number of rules may -// provide the same import. Callers may need to resolve ambiguities using -// language-specific heuristics. -func (ix *RuleIndex) FindRulesByImport(imp ImportSpec, lang string) []FindResult { - matches := ix.importMap[imp] - results := make([]FindResult, 0, len(matches)) - for _, m := range matches { - if ix.mrslv(m.rule, "").Name() != lang { - continue - } - results = append(results, FindResult{ - Label: m.label, - Embeds: m.embeds, - }) - } - return results -} - -// IsSelfImport returns true if the result's label matches the given label -// or the result's rule transitively embeds the rule with the given label. -// Self imports cause cyclic dependencies, so the caller may want to omit -// the dependency or report an error. -func (r FindResult) IsSelfImport(from label.Label) bool { - if from.Equal(r.Label) { - return true - } - for _, e := range r.Embeds { - if from.Equal(e) { - return true - } - } - return false -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/rule/BUILD b/vendor/github.com/bazelbuild/bazel-gazelle/rule/BUILD deleted file mode 100644 index 63c69609495..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/rule/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "directives.go", - "expr.go", - "merge.go", - "platform.go", - "platform_strings.go", - "rule.go", - "sort_labels.go", - "types.go", - "value.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/bazel-gazelle/rule", - importpath = "github.com/bazelbuild/bazel-gazelle/rule", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/bazelbuild/bazel-gazelle/label:go_default_library", - "//vendor/github.com/bazelbuild/buildtools/build:go_default_library", - "//vendor/github.com/bazelbuild/buildtools/tables:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/rule/directives.go b/vendor/github.com/bazelbuild/bazel-gazelle/rule/directives.go deleted file mode 100644 index f5ba580be0e..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/rule/directives.go +++ /dev/null @@ -1,75 +0,0 @@ -/* Copyright 2017 The Bazel Authors. 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 rule - -import ( - "regexp" - - bzl "github.com/bazelbuild/buildtools/build" -) - -// Directive is a key-value pair extracted from a top-level comment in -// a build file. Directives have the following format: -// -// # gazelle:key value -// -// Keys may not contain spaces. Values may be empty and may contain spaces, -// but surrounding space is trimmed. -type Directive struct { - Key, Value string -} - -// TODO(jayconrod): annotation directives will apply to an individual rule. -// They must appear in the block of comments above that rule. - -// ParseDirectives scans f for Gazelle directives. The full list of directives -// is returned. Errors are reported for unrecognized directives and directives -// out of place (after the first statement). -func ParseDirectives(f *bzl.File) []Directive { - return parseDirectives(f.Stmt) -} - -// ParseDirectivesFromMacro scans a macro body for Gazelle directives. The -// full list of directives is returned. Errors are reported for unrecognized -// directives and directives out of place (after the first statement). -func ParseDirectivesFromMacro(f *bzl.DefStmt) []Directive { - return parseDirectives(f.Body) -} - -func parseDirectives(stmt []bzl.Expr) []Directive { - var directives []Directive - parseComment := func(com bzl.Comment) { - match := directiveRe.FindStringSubmatch(com.Token) - if match == nil { - return - } - key, value := match[1], match[2] - directives = append(directives, Directive{key, value}) - } - - for _, s := range stmt { - coms := s.Comment() - for _, com := range coms.Before { - parseComment(com) - } - for _, com := range coms.After { - parseComment(com) - } - } - return directives -} - -var directiveRe = regexp.MustCompile(`^#\s*gazelle:(\w+)\s*(.*?)\s*$`) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/rule/expr.go b/vendor/github.com/bazelbuild/bazel-gazelle/rule/expr.go deleted file mode 100644 index cd2fff0e273..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/rule/expr.go +++ /dev/null @@ -1,354 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 rule - -import ( - "fmt" - "log" - "strings" - - "github.com/bazelbuild/bazel-gazelle/label" - bzl "github.com/bazelbuild/buildtools/build" -) - -// MapExprStrings applies a function to string sub-expressions within e. -// An expression containing the results with the same structure as e is -// returned. -func MapExprStrings(e bzl.Expr, f func(string) string) bzl.Expr { - if e == nil { - return nil - } - switch expr := e.(type) { - case *bzl.StringExpr: - s := f(expr.Value) - if s == "" { - return nil - } - ret := *expr - ret.Value = s - return &ret - - case *bzl.ListExpr: - var list []bzl.Expr - for _, elem := range expr.List { - elem = MapExprStrings(elem, f) - if elem != nil { - list = append(list, elem) - } - } - if len(list) == 0 && len(expr.List) > 0 { - return nil - } - ret := *expr - ret.List = list - return &ret - - case *bzl.DictExpr: - var cases []bzl.Expr - isEmpty := true - for _, kv := range expr.List { - keyval, ok := kv.(*bzl.KeyValueExpr) - if !ok { - log.Panicf("unexpected expression in generated imports dict: %#v", kv) - } - value := MapExprStrings(keyval.Value, f) - if value != nil { - cases = append(cases, &bzl.KeyValueExpr{Key: keyval.Key, Value: value}) - if key, ok := keyval.Key.(*bzl.StringExpr); !ok || key.Value != "//conditions:default" { - isEmpty = false - } - } - } - if isEmpty { - return nil - } - ret := *expr - ret.List = cases - return &ret - - case *bzl.CallExpr: - if x, ok := expr.X.(*bzl.Ident); !ok || x.Name != "select" || len(expr.List) != 1 { - log.Panicf("unexpected call expression in generated imports: %#v", e) - } - arg := MapExprStrings(expr.List[0], f) - if arg == nil { - return nil - } - call := *expr - call.List[0] = arg - return &call - - case *bzl.BinaryExpr: - x := MapExprStrings(expr.X, f) - y := MapExprStrings(expr.Y, f) - if x == nil { - return y - } - if y == nil { - return x - } - binop := *expr - binop.X = x - binop.Y = y - return &binop - - default: - return nil - } -} - -// FlattenExpr takes an expression that may have been generated from -// PlatformStrings and returns its values in a flat, sorted, de-duplicated -// list. Comments are accumulated and de-duplicated across duplicate -// expressions. If the expression could not have been generted by -// PlatformStrings, the expression will be returned unmodified. -func FlattenExpr(e bzl.Expr) bzl.Expr { - ps, err := extractPlatformStringsExprs(e) - if err != nil { - return e - } - - ls := makeListSquasher() - addElem := func(e bzl.Expr) bool { - s, ok := e.(*bzl.StringExpr) - if !ok { - return false - } - ls.add(s) - return true - } - addList := func(e bzl.Expr) bool { - l, ok := e.(*bzl.ListExpr) - if !ok { - return false - } - for _, elem := range l.List { - if !addElem(elem) { - return false - } - } - return true - } - addDict := func(d *bzl.DictExpr) bool { - for _, kv := range d.List { - if !addList(kv.(*bzl.KeyValueExpr).Value) { - return false - } - } - return true - } - - if ps.generic != nil { - if !addList(ps.generic) { - return e - } - } - for _, d := range []*bzl.DictExpr{ps.os, ps.arch, ps.platform} { - if d == nil { - continue - } - if !addDict(d) { - return e - } - } - - return ls.list() -} - -func isScalar(e bzl.Expr) bool { - switch e.(type) { - case *bzl.StringExpr, *bzl.LiteralExpr, *bzl.Ident: - return true - default: - return false - } -} - -func dictEntryKeyValue(e bzl.Expr) (string, *bzl.ListExpr, error) { - kv, ok := e.(*bzl.KeyValueExpr) - if !ok { - return "", nil, fmt.Errorf("dict entry was not a key-value pair: %#v", e) - } - k, ok := kv.Key.(*bzl.StringExpr) - if !ok { - return "", nil, fmt.Errorf("dict key was not string: %#v", kv.Key) - } - v, ok := kv.Value.(*bzl.ListExpr) - if !ok { - return "", nil, fmt.Errorf("dict value was not list: %#v", kv.Value) - } - return k.Value, v, nil -} - -func stringValue(e bzl.Expr) string { - s, ok := e.(*bzl.StringExpr) - if !ok { - return "" - } - return s.Value -} - -// platformStringsExprs is a set of sub-expressions that match the structure -// of package.PlatformStrings. ExprFromValue produces expressions that -// follow this structure for srcs, deps, and other attributes, so this matches -// all non-scalar expressions generated by Gazelle. -// -// The matched expression has the form: -// -// [] + select({}) + select({}) + select({}) -// -// The four collections may appear in any order, and some or all of them may -// be omitted (all fields are nil for a nil expression). -type platformStringsExprs struct { - generic *bzl.ListExpr - os, arch, platform *bzl.DictExpr -} - -// extractPlatformStringsExprs matches an expression and attempts to extract -// sub-expressions in platformStringsExprs. The sub-expressions can then be -// merged with corresponding sub-expressions. Any field in the returned -// structure may be nil. An error is returned if the given expression does -// not follow the pattern described by platformStringsExprs. -func extractPlatformStringsExprs(expr bzl.Expr) (platformStringsExprs, error) { - var ps platformStringsExprs - if expr == nil { - return ps, nil - } - - // Break the expression into a sequence of expressions combined with +. - var parts []bzl.Expr - for { - binop, ok := expr.(*bzl.BinaryExpr) - if !ok { - parts = append(parts, expr) - break - } - parts = append(parts, binop.Y) - expr = binop.X - } - - // Process each part. They may be in any order. - for _, part := range parts { - switch part := part.(type) { - case *bzl.ListExpr: - if ps.generic != nil { - return platformStringsExprs{}, fmt.Errorf("expression could not be matched: multiple list expressions") - } - ps.generic = part - - case *bzl.CallExpr: - x, ok := part.X.(*bzl.Ident) - if !ok || x.Name != "select" || len(part.List) != 1 { - return platformStringsExprs{}, fmt.Errorf("expression could not be matched: callee other than select or wrong number of args") - } - arg, ok := part.List[0].(*bzl.DictExpr) - if !ok { - return platformStringsExprs{}, fmt.Errorf("expression could not be matched: select argument not dict") - } - var dict **bzl.DictExpr - for _, item := range arg.List { - kv := item.(*bzl.KeyValueExpr) // parser guarantees this - k, ok := kv.Key.(*bzl.StringExpr) - if !ok { - return platformStringsExprs{}, fmt.Errorf("expression could not be matched: dict keys are not all strings") - } - if k.Value == "//conditions:default" { - continue - } - key, err := label.Parse(k.Value) - if err != nil { - return platformStringsExprs{}, fmt.Errorf("expression could not be matched: dict key is not label: %q", k.Value) - } - if KnownOSSet[key.Name] { - dict = &ps.os - break - } - if KnownArchSet[key.Name] { - dict = &ps.arch - break - } - osArch := strings.Split(key.Name, "_") - if len(osArch) != 2 || !KnownOSSet[osArch[0]] || !KnownArchSet[osArch[1]] { - return platformStringsExprs{}, fmt.Errorf("expression could not be matched: dict key contains unknown platform: %q", k.Value) - } - dict = &ps.platform - break - } - if dict == nil { - // We could not identify the dict because it's empty or only contains - // //conditions:default. We'll call it the platform dict to avoid - // dropping it. - dict = &ps.platform - } - if *dict != nil { - return platformStringsExprs{}, fmt.Errorf("expression could not be matched: multiple selects that are either os-specific, arch-specific, or platform-specific") - } - *dict = arg - } - } - return ps, nil -} - -// makePlatformStringsExpr constructs a single expression from the -// sub-expressions in ps. -func makePlatformStringsExpr(ps platformStringsExprs) bzl.Expr { - makeSelect := func(dict *bzl.DictExpr) bzl.Expr { - return &bzl.CallExpr{ - X: &bzl.Ident{Name: "select"}, - List: []bzl.Expr{dict}, - } - } - forceMultiline := func(e bzl.Expr) { - switch e := e.(type) { - case *bzl.ListExpr: - e.ForceMultiLine = true - case *bzl.CallExpr: - e.List[0].(*bzl.DictExpr).ForceMultiLine = true - } - } - - var parts []bzl.Expr - if ps.generic != nil { - parts = append(parts, ps.generic) - } - if ps.os != nil { - parts = append(parts, makeSelect(ps.os)) - } - if ps.arch != nil { - parts = append(parts, makeSelect(ps.arch)) - } - if ps.platform != nil { - parts = append(parts, makeSelect(ps.platform)) - } - - if len(parts) == 0 { - return nil - } - if len(parts) == 1 { - return parts[0] - } - expr := parts[0] - forceMultiline(expr) - for _, part := range parts[1:] { - forceMultiline(part) - expr = &bzl.BinaryExpr{ - Op: "+", - X: expr, - Y: part, - } - } - return expr -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/rule/merge.go b/vendor/github.com/bazelbuild/bazel-gazelle/rule/merge.go deleted file mode 100644 index 9a76e979a79..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/rule/merge.go +++ /dev/null @@ -1,489 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 rule - -import ( - "errors" - "fmt" - "log" - "sort" - - bzl "github.com/bazelbuild/buildtools/build" -) - -// MergeRules copies information from src into dst, usually discarding -// information in dst when they have the same attributes. -// -// If dst is marked with a "# keep" comment, either above the rule or as -// a suffix, nothing will be changed. -// -// If src has an attribute that is not in dst, it will be copied into dst. -// -// If src and dst have the same attribute and the attribute is mergeable and the -// attribute in dst is not marked with a "# keep" comment, values in the dst -// attribute not marked with a "# keep" comment will be dropped, and values from -// src will be copied in. -// -// If dst has an attribute not in src, and the attribute is mergeable and not -// marked with a "# keep" comment, values in the attribute not marked with -// a "# keep" comment will be dropped. If the attribute is empty afterward, -// it will be deleted. -func MergeRules(src, dst *Rule, mergeable map[string]bool, filename string) { - if dst.ShouldKeep() { - return - } - - // Process attributes that are in dst but not in src. - for key, dstAttr := range dst.attrs { - if _, ok := src.attrs[key]; ok || !mergeable[key] || ShouldKeep(dstAttr) { - continue - } - dstValue := dstAttr.RHS - if mergedValue, err := mergeExprs(nil, dstValue); err != nil { - start, end := dstValue.Span() - log.Printf("%s:%d.%d-%d.%d: could not merge expression", filename, start.Line, start.LineRune, end.Line, end.LineRune) - } else if mergedValue == nil { - dst.DelAttr(key) - } else { - dst.SetAttr(key, mergedValue) - } - } - - // Merge attributes from src into dst. - for key, srcAttr := range src.attrs { - srcValue := srcAttr.RHS - if dstAttr, ok := dst.attrs[key]; !ok { - dst.SetAttr(key, srcValue) - } else if mergeable[key] && !ShouldKeep(dstAttr) { - dstValue := dstAttr.RHS - if mergedValue, err := mergeExprs(srcValue, dstValue); err != nil { - start, end := dstValue.Span() - log.Printf("%s:%d.%d-%d.%d: could not merge expression", filename, start.Line, start.LineRune, end.Line, end.LineRune) - } else { - dst.SetAttr(key, mergedValue) - } - } - } -} - -// mergeExprs combines information from src and dst and returns a merged -// expression. dst may be modified during this process. The returned expression -// may be different from dst when a structural change is needed. -// -// The following kinds of expressions are recognized. -// -// * nil -// * strings (can only be merged with strings) -// * lists of strings -// * a call to select with a dict argument. The dict keys must be strings, -// and the values must be lists of strings. -// * a list of strings combined with a select call using +. The list must -// be the left operand. -// -// An error is returned if the expressions can't be merged, for example -// because they are not in one of the above formats. -func mergeExprs(src, dst bzl.Expr) (bzl.Expr, error) { - if ShouldKeep(dst) { - return nil, nil - } - if src == nil && (dst == nil || isScalar(dst)) { - return nil, nil - } - if isScalar(src) { - return src, nil - } - - srcExprs, err := extractPlatformStringsExprs(src) - if err != nil { - return nil, err - } - dstExprs, err := extractPlatformStringsExprs(dst) - if err != nil { - return nil, err - } - mergedExprs, err := mergePlatformStringsExprs(srcExprs, dstExprs) - if err != nil { - return nil, err - } - return makePlatformStringsExpr(mergedExprs), nil -} - -func mergePlatformStringsExprs(src, dst platformStringsExprs) (platformStringsExprs, error) { - var ps platformStringsExprs - var err error - ps.generic = mergeList(src.generic, dst.generic) - if ps.os, err = mergeDict(src.os, dst.os); err != nil { - return platformStringsExprs{}, err - } - if ps.arch, err = mergeDict(src.arch, dst.arch); err != nil { - return platformStringsExprs{}, err - } - if ps.platform, err = mergeDict(src.platform, dst.platform); err != nil { - return platformStringsExprs{}, err - } - return ps, nil -} - -func mergeList(src, dst *bzl.ListExpr) *bzl.ListExpr { - if dst == nil { - return src - } - if src == nil { - src = &bzl.ListExpr{List: []bzl.Expr{}} - } - - // Build a list of strings from the src list and keep matching strings - // in the dst list. This preserves comments. Also keep anything with - // a "# keep" comment, whether or not it's in the src list. - srcSet := make(map[string]bool) - for _, v := range src.List { - if s := stringValue(v); s != "" { - srcSet[s] = true - } - } - - var merged []bzl.Expr - kept := make(map[string]bool) - keepComment := false - for _, v := range dst.List { - s := stringValue(v) - if keep := ShouldKeep(v); keep || srcSet[s] { - keepComment = keepComment || keep - merged = append(merged, v) - if s != "" { - kept[s] = true - } - } - } - - // Add anything in the src list that wasn't kept. - for _, v := range src.List { - if s := stringValue(v); kept[s] { - continue - } - merged = append(merged, v) - } - - if len(merged) == 0 { - return nil - } - return &bzl.ListExpr{ - List: merged, - ForceMultiLine: src.ForceMultiLine || dst.ForceMultiLine || keepComment, - } -} - -func mergeDict(src, dst *bzl.DictExpr) (*bzl.DictExpr, error) { - if dst == nil { - return src, nil - } - if src == nil { - src = &bzl.DictExpr{List: []bzl.Expr{}} - } - - var entries []*dictEntry - entryMap := make(map[string]*dictEntry) - - for _, kv := range dst.List { - k, v, err := dictEntryKeyValue(kv) - if err != nil { - return nil, err - } - if _, ok := entryMap[k]; ok { - return nil, fmt.Errorf("dst dict contains more than one case named %q", k) - } - e := &dictEntry{key: k, dstValue: v} - entries = append(entries, e) - entryMap[k] = e - } - - for _, kv := range src.List { - k, v, err := dictEntryKeyValue(kv) - if err != nil { - return nil, err - } - e, ok := entryMap[k] - if !ok { - e = &dictEntry{key: k} - entries = append(entries, e) - entryMap[k] = e - } - e.srcValue = v - } - - keys := make([]string, 0, len(entries)) - haveDefault := false - for _, e := range entries { - e.mergedValue = mergeList(e.srcValue, e.dstValue) - if e.key == "//conditions:default" { - // Keep the default case, even if it's empty. - haveDefault = true - if e.mergedValue == nil { - e.mergedValue = &bzl.ListExpr{} - } - } else if e.mergedValue != nil { - keys = append(keys, e.key) - } - } - if len(keys) == 0 && (!haveDefault || len(entryMap["//conditions:default"].mergedValue.List) == 0) { - return nil, nil - } - sort.Strings(keys) - // Always put the default case last. - if haveDefault { - keys = append(keys, "//conditions:default") - } - - mergedEntries := make([]bzl.Expr, len(keys)) - for i, k := range keys { - e := entryMap[k] - mergedEntries[i] = &bzl.KeyValueExpr{ - Key: &bzl.StringExpr{Value: e.key}, - Value: e.mergedValue, - } - } - - return &bzl.DictExpr{List: mergedEntries, ForceMultiLine: true}, nil -} - -type dictEntry struct { - key string - dstValue, srcValue, mergedValue *bzl.ListExpr -} - -// SquashRules copies information from src into dst without discarding -// information in dst. SquashRules detects duplicate elements in lists and -// dictionaries, but it doesn't sort elements after squashing. If squashing -// fails because the expression is not understood, an error is returned, -// and neither rule is modified. -func SquashRules(src, dst *Rule, filename string) error { - if dst.ShouldKeep() { - return nil - } - - for key, srcAttr := range src.attrs { - srcValue := srcAttr.RHS - if dstAttr, ok := dst.attrs[key]; !ok { - dst.SetAttr(key, srcValue) - } else if !ShouldKeep(dstAttr) { - dstValue := dstAttr.RHS - if squashedValue, err := squashExprs(srcValue, dstValue); err != nil { - start, end := dstValue.Span() - return fmt.Errorf("%s:%d.%d-%d.%d: could not squash expression", filename, start.Line, start.LineRune, end.Line, end.LineRune) - } else { - dst.SetAttr(key, squashedValue) - } - } - } - dst.expr.Comment().Before = append(dst.expr.Comment().Before, src.expr.Comment().Before...) - dst.expr.Comment().Suffix = append(dst.expr.Comment().Suffix, src.expr.Comment().Suffix...) - dst.expr.Comment().After = append(dst.expr.Comment().After, src.expr.Comment().After...) - return nil -} - -func squashExprs(src, dst bzl.Expr) (bzl.Expr, error) { - if ShouldKeep(dst) { - return dst, nil - } - if isScalar(dst) { - // may lose src, but they should always be the same. - return dst, nil - } - srcExprs, err := extractPlatformStringsExprs(src) - if err != nil { - return nil, err - } - dstExprs, err := extractPlatformStringsExprs(dst) - if err != nil { - return nil, err - } - squashedExprs, err := squashPlatformStringsExprs(srcExprs, dstExprs) - if err != nil { - return nil, err - } - return makePlatformStringsExpr(squashedExprs), nil -} - -func squashPlatformStringsExprs(x, y platformStringsExprs) (platformStringsExprs, error) { - var ps platformStringsExprs - var err error - if ps.generic, err = squashList(x.generic, y.generic); err != nil { - return platformStringsExprs{}, err - } - if ps.os, err = squashDict(x.os, y.os); err != nil { - return platformStringsExprs{}, err - } - if ps.arch, err = squashDict(x.arch, y.arch); err != nil { - return platformStringsExprs{}, err - } - if ps.platform, err = squashDict(x.platform, y.platform); err != nil { - return platformStringsExprs{}, err - } - return ps, nil -} - -func squashList(x, y *bzl.ListExpr) (*bzl.ListExpr, error) { - if x == nil { - return y, nil - } - if y == nil { - return x, nil - } - - ls := makeListSquasher() - for _, e := range x.List { - s, ok := e.(*bzl.StringExpr) - if !ok { - return nil, errors.New("could not squash non-string") - } - ls.add(s) - } - for _, e := range y.List { - s, ok := e.(*bzl.StringExpr) - if !ok { - return nil, errors.New("could not squash non-string") - } - ls.add(s) - } - squashed := ls.list() - squashed.Comments.Before = append(x.Comments.Before, y.Comments.Before...) - squashed.Comments.Suffix = append(x.Comments.Suffix, y.Comments.Suffix...) - squashed.Comments.After = append(x.Comments.After, y.Comments.After...) - return squashed, nil -} - -func squashDict(x, y *bzl.DictExpr) (*bzl.DictExpr, error) { - if x == nil { - return y, nil - } - if y == nil { - return x, nil - } - - cases := make(map[string]*bzl.KeyValueExpr) - addCase := func(e bzl.Expr) error { - kv := e.(*bzl.KeyValueExpr) - key, ok := kv.Key.(*bzl.StringExpr) - if !ok { - return errors.New("could not squash non-string dict key") - } - if _, ok := kv.Value.(*bzl.ListExpr); !ok { - return errors.New("could not squash non-list dict value") - } - if c, ok := cases[key.Value]; ok { - if sq, err := squashList(kv.Value.(*bzl.ListExpr), c.Value.(*bzl.ListExpr)); err != nil { - return err - } else { - c.Value = sq - } - } else { - kvCopy := *kv - cases[key.Value] = &kvCopy - } - return nil - } - - for _, e := range x.List { - if err := addCase(e); err != nil { - return nil, err - } - } - for _, e := range y.List { - if err := addCase(e); err != nil { - return nil, err - } - } - - keys := make([]string, 0, len(cases)) - haveDefault := false - for k := range cases { - if k == "//conditions:default" { - haveDefault = true - continue - } - keys = append(keys, k) - } - sort.Strings(keys) - if haveDefault { - keys = append(keys, "//conditions:default") // must be last - } - - squashed := *x - squashed.Comments.Before = append(x.Comments.Before, y.Comments.Before...) - squashed.Comments.Suffix = append(x.Comments.Suffix, y.Comments.Suffix...) - squashed.Comments.After = append(x.Comments.After, y.Comments.After...) - squashed.List = make([]bzl.Expr, 0, len(cases)) - for _, k := range keys { - squashed.List = append(squashed.List, cases[k]) - } - return &squashed, nil -} - -// listSquasher builds a sorted, deduplicated list of string expressions. If -// a string expression is added multiple times, comments are consolidated. -// The original expressions are not modified. -type listSquasher struct { - unique map[string]*bzl.StringExpr - seenComments map[elemComment]bool -} - -type elemComment struct { - elem, com string -} - -func makeListSquasher() listSquasher { - return listSquasher{ - unique: make(map[string]*bzl.StringExpr), - seenComments: make(map[elemComment]bool), - } -} - -func (ls *listSquasher) add(s *bzl.StringExpr) { - sCopy, ok := ls.unique[s.Value] - if !ok { - // Make a copy of s. We may modify it when we consolidate comments from - // duplicate strings. We don't want to modify the original in case this - // function fails (due to a later failed pattern match). - sCopy = new(bzl.StringExpr) - *sCopy = *s - sCopy.Comments.Before = make([]bzl.Comment, 0, len(s.Comments.Before)) - sCopy.Comments.Suffix = make([]bzl.Comment, 0, len(s.Comments.Suffix)) - ls.unique[s.Value] = sCopy - } - for _, c := range s.Comment().Before { - if key := (elemComment{s.Value, c.Token}); !ls.seenComments[key] { - sCopy.Comments.Before = append(sCopy.Comments.Before, c) - ls.seenComments[key] = true - } - } - for _, c := range s.Comment().Suffix { - if key := (elemComment{s.Value, c.Token}); !ls.seenComments[key] { - sCopy.Comments.Suffix = append(sCopy.Comments.Suffix, c) - ls.seenComments[key] = true - } - } -} - -func (ls *listSquasher) list() *bzl.ListExpr { - sortedExprs := make([]bzl.Expr, 0, len(ls.unique)) - for _, e := range ls.unique { - sortedExprs = append(sortedExprs, e) - } - sort.Slice(sortedExprs, func(i, j int) bool { - return sortedExprs[i].(*bzl.StringExpr).Value < sortedExprs[j].(*bzl.StringExpr).Value - }) - return &bzl.ListExpr{List: sortedExprs} -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/rule/platform.go b/vendor/github.com/bazelbuild/bazel-gazelle/rule/platform.go deleted file mode 100644 index a3227442c75..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/rule/platform.go +++ /dev/null @@ -1,142 +0,0 @@ -/* Copyright 2017 The Bazel Authors. 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 rule - -import ( - "sort" -) - -// Platform represents a GOOS/GOARCH pair. When Platform is used to describe -// sources, dependencies, or flags, either OS or Arch may be empty. -// -// DEPRECATED: do not use outside language/go. This type is Go-specific -// and should be moved to the Go extension. -type Platform struct { - OS, Arch string -} - -// String returns OS, Arch, or "OS_Arch" if both are set. This must match -// the names of config_setting rules in @io_bazel_rules_go//go/platform. -func (p Platform) String() string { - switch { - case p.OS != "" && p.Arch != "": - return p.OS + "_" + p.Arch - case p.OS != "": - return p.OS - case p.Arch != "": - return p.Arch - default: - return "" - } -} - -// KnownPlatforms is the set of target platforms that Go supports. Gazelle -// will generate multi-platform build files using these tags. rules_go and -// Bazel may not actually support all of these. -// -// DEPRECATED: do not use outside language/go. -var KnownPlatforms = []Platform{ - {"android", "386"}, - {"android", "amd64"}, - {"android", "arm"}, - {"android", "arm64"}, - {"darwin", "386"}, - {"darwin", "amd64"}, - {"darwin", "arm"}, - {"darwin", "arm64"}, - {"dragonfly", "amd64"}, - {"freebsd", "386"}, - {"freebsd", "amd64"}, - {"freebsd", "arm"}, - {"ios", "386"}, - {"ios", "amd64"}, - {"ios", "arm"}, - {"ios", "arm64"}, - {"linux", "386"}, - {"linux", "amd64"}, - {"linux", "arm"}, - {"linux", "arm64"}, - {"linux", "mips"}, - {"linux", "mips64"}, - {"linux", "mips64le"}, - {"linux", "mipsle"}, - {"linux", "ppc64"}, - {"linux", "ppc64le"}, - {"linux", "s390x"}, - {"nacl", "386"}, - {"nacl", "amd64p32"}, - {"nacl", "arm"}, - {"netbsd", "386"}, - {"netbsd", "amd64"}, - {"netbsd", "arm"}, - {"openbsd", "386"}, - {"openbsd", "amd64"}, - {"openbsd", "arm"}, - {"plan9", "386"}, - {"plan9", "amd64"}, - {"plan9", "arm"}, - {"solaris", "amd64"}, - {"windows", "386"}, - {"windows", "amd64"}, -} - -var OSAliases = map[string][]string{ - "android": []string{"linux"}, - "ios": []string{"darwin"}, -} - -var ( - // KnownOSs is the sorted list of operating systems that Go supports. - KnownOSs []string - - // KnownOSSet is the set of operating systems that Go supports. - KnownOSSet map[string]bool - - // KnownArchs is the sorted list of architectures that Go supports. - KnownArchs []string - - // KnownArchSet is the set of architectures that Go supports. - KnownArchSet map[string]bool - - // KnownOSArchs is a map from OS to the archictures they run on. - KnownOSArchs map[string][]string - - // KnownArchOSs is a map from architectures to that OSs that run on them. - KnownArchOSs map[string][]string -) - -func init() { - KnownOSSet = make(map[string]bool) - KnownArchSet = make(map[string]bool) - KnownOSArchs = make(map[string][]string) - KnownArchOSs = make(map[string][]string) - for _, p := range KnownPlatforms { - KnownOSSet[p.OS] = true - KnownArchSet[p.Arch] = true - KnownOSArchs[p.OS] = append(KnownOSArchs[p.OS], p.Arch) - KnownArchOSs[p.Arch] = append(KnownArchOSs[p.Arch], p.OS) - } - KnownOSs = make([]string, 0, len(KnownOSSet)) - KnownArchs = make([]string, 0, len(KnownArchSet)) - for os := range KnownOSSet { - KnownOSs = append(KnownOSs, os) - } - for arch := range KnownArchSet { - KnownArchs = append(KnownArchs, arch) - } - sort.Strings(KnownOSs) - sort.Strings(KnownArchs) -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/rule/platform_strings.go b/vendor/github.com/bazelbuild/bazel-gazelle/rule/platform_strings.go deleted file mode 100644 index ad452cf49f9..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/rule/platform_strings.go +++ /dev/null @@ -1,245 +0,0 @@ -/* Copyright 2017 The Bazel Authors. 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 rule - -import ( - "sort" - "strings" - - bzl "github.com/bazelbuild/buildtools/build" -) - -// PlatformStrings contains a set of strings associated with a buildable -// target in a package. This is used to store source file names, -// import paths, and flags. -// -// Strings are stored in four sets: generic strings, OS-specific strings, -// arch-specific strings, and OS-and-arch-specific strings. A string may not -// be duplicated within a list or across sets; however, a string may appear -// in more than one list within a set (e.g., in "linux" and "windows" within -// the OS set). Strings within each list should be sorted, though this may -// not be relied upon. -// -// DEPRECATED: do not use outside language/go. This type is Go-specific and -// should be moved to the Go extension. -type PlatformStrings struct { - // Generic is a list of strings not specific to any platform. - Generic []string - - // OS is a map from OS name (anything in KnownOSs) to - // OS-specific strings. - OS map[string][]string - - // Arch is a map from architecture name (anything in KnownArchs) to - // architecture-specific strings. - Arch map[string][]string - - // Platform is a map from platforms to OS and architecture-specific strings. - Platform map[Platform][]string -} - -// HasExt returns whether this set contains a file with the given extension. -func (ps *PlatformStrings) HasExt(ext string) bool { - return ps.firstExtFile(ext) != "" -} - -func (ps *PlatformStrings) IsEmpty() bool { - return len(ps.Generic) == 0 && len(ps.OS) == 0 && len(ps.Arch) == 0 && len(ps.Platform) == 0 -} - -// Flat returns all the strings in the set, sorted and de-duplicated. -func (ps *PlatformStrings) Flat() []string { - unique := make(map[string]struct{}) - for _, s := range ps.Generic { - unique[s] = struct{}{} - } - for _, ss := range ps.OS { - for _, s := range ss { - unique[s] = struct{}{} - } - } - for _, ss := range ps.Arch { - for _, s := range ss { - unique[s] = struct{}{} - } - } - for _, ss := range ps.Platform { - for _, s := range ss { - unique[s] = struct{}{} - } - } - flat := make([]string, 0, len(unique)) - for s := range unique { - flat = append(flat, s) - } - sort.Strings(flat) - return flat -} - -func (ps *PlatformStrings) firstExtFile(ext string) string { - for _, f := range ps.Generic { - if strings.HasSuffix(f, ext) { - return f - } - } - for _, fs := range ps.OS { - for _, f := range fs { - if strings.HasSuffix(f, ext) { - return f - } - } - } - for _, fs := range ps.Arch { - for _, f := range fs { - if strings.HasSuffix(f, ext) { - return f - } - } - } - for _, fs := range ps.Platform { - for _, f := range fs { - if strings.HasSuffix(f, ext) { - return f - } - } - } - return "" -} - -// Map applies a function that processes individual strings to the strings -// in "ps" and returns a new PlatformStrings with the result. Empty strings -// returned by the function are dropped. -func (ps *PlatformStrings) Map(f func(s string) (string, error)) (PlatformStrings, []error) { - var errors []error - mapSlice := func(ss []string) ([]string, error) { - rs := make([]string, 0, len(ss)) - for _, s := range ss { - if r, err := f(s); err != nil { - errors = append(errors, err) - } else if r != "" { - rs = append(rs, r) - } - } - return rs, nil - } - result, _ := ps.MapSlice(mapSlice) - return result, errors -} - -// MapSlice applies a function that processes slices of strings to the strings -// in "ps" and returns a new PlatformStrings with the results. -func (ps *PlatformStrings) MapSlice(f func([]string) ([]string, error)) (PlatformStrings, []error) { - var errors []error - - mapSlice := func(ss []string) []string { - rs, err := f(ss) - if err != nil { - errors = append(errors, err) - return nil - } - return rs - } - - mapStringMap := func(m map[string][]string) map[string][]string { - if m == nil { - return nil - } - rm := make(map[string][]string) - for k, ss := range m { - ss = mapSlice(ss) - if len(ss) > 0 { - rm[k] = ss - } - } - if len(rm) == 0 { - return nil - } - return rm - } - - mapPlatformMap := func(m map[Platform][]string) map[Platform][]string { - if m == nil { - return nil - } - rm := make(map[Platform][]string) - for k, ss := range m { - ss = mapSlice(ss) - if len(ss) > 0 { - rm[k] = ss - } - } - if len(rm) == 0 { - return nil - } - return rm - } - - result := PlatformStrings{ - Generic: mapSlice(ps.Generic), - OS: mapStringMap(ps.OS), - Arch: mapStringMap(ps.Arch), - Platform: mapPlatformMap(ps.Platform), - } - return result, errors -} - -func (ps PlatformStrings) BzlExpr() bzl.Expr { - var pieces []bzl.Expr - if len(ps.Generic) > 0 { - pieces = append(pieces, ExprFromValue(ps.Generic)) - } - if len(ps.OS) > 0 { - pieces = append(pieces, platformStringsOSArchDictExpr(ps.OS)) - } - if len(ps.Arch) > 0 { - pieces = append(pieces, platformStringsOSArchDictExpr(ps.Arch)) - } - if len(ps.Platform) > 0 { - pieces = append(pieces, platformStringsPlatformDictExpr(ps.Platform)) - } - if len(pieces) == 0 { - return &bzl.ListExpr{} - } else if len(pieces) == 1 { - return pieces[0] - } else { - e := pieces[0] - if list, ok := e.(*bzl.ListExpr); ok { - list.ForceMultiLine = true - } - for _, piece := range pieces[1:] { - e = &bzl.BinaryExpr{X: e, Y: piece, Op: "+"} - } - return e - } -} - -func platformStringsOSArchDictExpr(m map[string][]string) bzl.Expr { - s := make(SelectStringListValue) - for key, value := range m { - s["@io_bazel_rules_go//go/platform:"+key] = value - } - s["//conditions:default"] = nil - return s.BzlExpr() -} - -func platformStringsPlatformDictExpr(m map[Platform][]string) bzl.Expr { - s := make(SelectStringListValue) - for key, value := range m { - s["@io_bazel_rules_go//go/platform:"+key.String()] = value - } - s["//conditions:default"] = nil - return s.BzlExpr() -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/rule/rule.go b/vendor/github.com/bazelbuild/bazel-gazelle/rule/rule.go deleted file mode 100644 index 8617b44ba45..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/rule/rule.go +++ /dev/null @@ -1,859 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 rule provides tools for editing Bazel build files. It is intended to -// be a more powerful replacement for -// github.com/bazelbuild/buildtools/build.Rule, adapted for Gazelle's usage. It -// is language agnostic, but it may be used for language-specific rules by -// providing configuration. -// -// File is the primary interface to this package. A File represents an -// individual build file. It comprises a list of Rules and a list of Loads. -// Rules and Loads may be inserted, modified, or deleted. When all changes -// are done, File.Save() may be called to write changes back to a file. -package rule - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "sort" - "strings" - - bzl "github.com/bazelbuild/buildtools/build" - bt "github.com/bazelbuild/buildtools/tables" -) - -// File provides editing functionality for a build file. You can create a -// new file with EmptyFile or load an existing file with LoadFile. After -// changes have been made, call Save to write changes back to a file. -type File struct { - // File is the underlying build file syntax tree. Some editing operations - // may modify this, but editing is not complete until Sync() is called. - File *bzl.File - - // function is the underlying syntax tree of a bzl file function. - // This is used for editing the bzl file function specified by the - // update-repos -to_macro option. - function *function - - // Pkg is the Bazel package this build file defines. - Pkg string - - // Path is the file system path to the build file (same as File.Path). - Path string - - // DefName is the name of the function definition this File refers to - // if loaded with LoadMacroFile or a similar function. Normally empty. - DefName string - - // Directives is a list of configuration directives found in top-level - // comments in the file. This should not be modified after the file is read. - Directives []Directive - - // Loads is a list of load statements within the file. This should not - // be modified directly; use Load methods instead. - Loads []*Load - - // Rules is a list of rules within the file (or function calls that look like - // rules). This should not be modified directly; use Rule methods instead. - Rules []*Rule -} - -// EmptyFile creates a File wrapped around an empty syntax tree. -func EmptyFile(path, pkg string) *File { - return &File{ - File: &bzl.File{Path: path, Type: bzl.TypeBuild}, - Path: path, - Pkg: pkg, - } -} - -// LoadFile loads a build file from disk, parses it, and scans for rules and -// load statements. The syntax tree within the returned File will be modified -// by editing methods. -// -// This function returns I/O and parse errors without modification. It's safe -// to use os.IsNotExist and similar predicates. -func LoadFile(path, pkg string) (*File, error) { - data, err := ioutil.ReadFile(path) - if err != nil { - return nil, err - } - return LoadData(path, pkg, data) -} - -// LoadWorkspaceFile is similar to LoadFile but parses the file as a WORKSPACE -// file. -func LoadWorkspaceFile(path, pkg string) (*File, error) { - data, err := ioutil.ReadFile(path) - if err != nil { - return nil, err - } - return LoadWorkspaceData(path, pkg, data) -} - -// LoadMacroFile loads a bzl file from disk, parses it, then scans for the load -// statements and the rules called from the given Starlark function. If there is -// no matching function name, then a new function with that name will be created. -// The function's syntax tree will be returned within File and can be modified by -// Sync and Save calls. -func LoadMacroFile(path, pkg, defName string) (*File, error) { - data, err := ioutil.ReadFile(path) - if err != nil { - return nil, err - } - return LoadMacroData(path, pkg, defName, data) -} - -// EmptyMacroFile creates a bzl file at the given path and within the file creates -// a Starlark function with the provided name. The function can then be modified -// by Sync and Save calls. -func EmptyMacroFile(path, pkg, defName string) (*File, error) { - _, err := os.Create(path) - if err != nil { - return nil, err - } - return LoadMacroData(path, pkg, defName, nil) -} - -// LoadData parses a build file from a byte slice and scans it for rules and -// load statements. The syntax tree within the returned File will be modified -// by editing methods. -func LoadData(path, pkg string, data []byte) (*File, error) { - ast, err := bzl.ParseBuild(path, data) - if err != nil { - return nil, err - } - return ScanAST(pkg, ast), nil -} - -// LoadWorkspaceData is similar to LoadData but parses the data as a -// WORKSPACE file. -func LoadWorkspaceData(path, pkg string, data []byte) (*File, error) { - ast, err := bzl.ParseWorkspace(path, data) - if err != nil { - return nil, err - } - return ScanAST(pkg, ast), nil -} - -// LoadMacroData parses a bzl file from a byte slice and scans for the load -// statements and the rules called from the given Starlark function. If there is -// no matching function name, then a new function will be created, and added to the -// File the next time Sync is called. The function's syntax tree will be returned -// within File and can be modified by Sync and Save calls. -func LoadMacroData(path, pkg, defName string, data []byte) (*File, error) { - ast, err := bzl.ParseBzl(path, data) - if err != nil { - return nil, err - } - return ScanASTBody(pkg, defName, ast), nil -} - -// ScanAST creates a File wrapped around the given syntax tree. This tree -// will be modified by editing methods. -func ScanAST(pkg string, bzlFile *bzl.File) *File { - return ScanASTBody(pkg, "", bzlFile) -} - -type function struct { - stmt *bzl.DefStmt - inserted, hasPass bool -} - -// ScanASTBody creates a File wrapped around the given syntax tree. It will also -// scan the AST for a function matching the given defName, and if the function -// does not exist it will create a new one and mark it to be added to the File -// the next time Sync is called. -func ScanASTBody(pkg, defName string, bzlFile *bzl.File) *File { - f := &File{ - File: bzlFile, - Pkg: pkg, - Path: bzlFile.Path, - DefName: defName, - } - var defStmt *bzl.DefStmt - f.Rules, f.Loads, defStmt = scanExprs(defName, bzlFile.Stmt) - if defStmt != nil { - f.Rules, _, _ = scanExprs("", defStmt.Body) - f.function = &function{ - stmt: defStmt, - inserted: true, - } - if len(defStmt.Body) == 1 { - if v, ok := defStmt.Body[0].(*bzl.BranchStmt); ok && v.Token == "pass" { - f.function.hasPass = true - } - } - } else if defName != "" { - f.function = &function{ - stmt: &bzl.DefStmt{Name: defName}, - inserted: false, - } - } - if f.function != nil { - f.Directives = ParseDirectivesFromMacro(f.function.stmt) - } else { - f.Directives = ParseDirectives(bzlFile) - } - return f -} - -func scanExprs(defName string, stmt []bzl.Expr) (rules []*Rule, loads []*Load, fn *bzl.DefStmt) { - for i, expr := range stmt { - switch expr := expr.(type) { - case *bzl.LoadStmt: - l := loadFromExpr(i, expr) - loads = append(loads, l) - case *bzl.CallExpr: - if r := ruleFromExpr(i, expr); r != nil { - rules = append(rules, r) - } - case *bzl.DefStmt: - if expr.Name == defName { - fn = expr - } - } - } - return rules, loads, fn -} - -// MatchBuildFileName looks for a file in files that has a name from names. -// If there is at least one matching file, a path will be returned by joining -// dir and the first matching name. If there are no matching files, the -// empty string is returned. -func MatchBuildFileName(dir string, names []string, files []os.FileInfo) string { - for _, name := range names { - for _, fi := range files { - if fi.Name() == name && !fi.IsDir() { - return filepath.Join(dir, name) - } - } - } - return "" -} - -// SyncMacroFile syncs the file's syntax tree with another file's. This is -// useful for keeping multiple macro definitions from the same .bzl file in sync. -func (f *File) SyncMacroFile(from *File) { - fromFunc := *from.function.stmt - _, _, toFunc := scanExprs(from.function.stmt.Name, f.File.Stmt) - if toFunc != nil { - *toFunc = fromFunc - } else { - f.File.Stmt = append(f.File.Stmt, &fromFunc) - } -} - -// MacroName returns the name of the macro function that this file is editing, -// or an empty string if a macro function is not being edited. -func (f *File) MacroName() string { - if f.function != nil && f.function.stmt != nil { - return f.function.stmt.Name - } - return "" -} - -// Sync writes all changes back to the wrapped syntax tree. This should be -// called after editing operations, before reading the syntax tree again. -func (f *File) Sync() { - var loadInserts, loadDeletes, loadStmts []*stmt - var r, w int - for r, w = 0, 0; r < len(f.Loads); r++ { - s := f.Loads[r] - s.sync() - if s.deleted { - loadDeletes = append(loadDeletes, &s.stmt) - continue - } - if s.inserted { - loadInserts = append(loadInserts, &s.stmt) - s.inserted = false - } else { - loadStmts = append(loadStmts, &s.stmt) - } - f.Loads[w] = s - w++ - } - f.Loads = f.Loads[:w] - var ruleInserts, ruleDeletes, ruleStmts []*stmt - for r, w = 0, 0; r < len(f.Rules); r++ { - s := f.Rules[r] - s.sync() - if s.deleted { - ruleDeletes = append(ruleDeletes, &s.stmt) - continue - } - if s.inserted { - ruleInserts = append(ruleInserts, &s.stmt) - s.inserted = false - } else { - ruleStmts = append(ruleStmts, &s.stmt) - } - f.Rules[w] = s - w++ - } - f.Rules = f.Rules[:w] - - if f.function == nil { - deletes := append(ruleDeletes, loadDeletes...) - inserts := append(ruleInserts, loadInserts...) - stmts := append(ruleStmts, loadStmts...) - updateStmt(&f.File.Stmt, inserts, deletes, stmts) - } else { - updateStmt(&f.File.Stmt, loadInserts, loadDeletes, loadStmts) - if f.function.hasPass && len(ruleInserts) > 0 { - f.function.stmt.Body = []bzl.Expr{} - f.function.hasPass = false - } - updateStmt(&f.function.stmt.Body, ruleInserts, ruleDeletes, ruleStmts) - if len(f.function.stmt.Body) == 0 { - f.function.stmt.Body = append(f.function.stmt.Body, &bzl.BranchStmt{Token: "pass"}) - f.function.hasPass = true - } - if !f.function.inserted { - f.File.Stmt = append(f.File.Stmt, f.function.stmt) - f.function.inserted = true - } - } -} - -func updateStmt(oldStmt *[]bzl.Expr, inserts, deletes, stmts []*stmt) { - sort.Stable(byIndex(deletes)) - sort.Stable(byIndex(inserts)) - sort.Stable(byIndex(stmts)) - newStmt := make([]bzl.Expr, 0, len(*oldStmt)-len(deletes)+len(inserts)) - var ii, di, si int - for i, stmt := range *oldStmt { - for ii < len(inserts) && inserts[ii].index == i { - inserts[ii].index = len(newStmt) - newStmt = append(newStmt, inserts[ii].expr) - ii++ - } - if di < len(deletes) && deletes[di].index == i { - di++ - continue - } - if si < len(stmts) && stmts[si].expr == stmt { - stmts[si].index = len(newStmt) - si++ - } - newStmt = append(newStmt, stmt) - } - for ii < len(inserts) { - inserts[ii].index = len(newStmt) - newStmt = append(newStmt, inserts[ii].expr) - ii++ - } - *oldStmt = newStmt -} - -// Format formats the build file in a form that can be written to disk. -// This method calls Sync internally. -func (f *File) Format() []byte { - f.Sync() - return bzl.Format(f.File) -} - -// Save writes the build file to disk. This method calls Sync internally. -func (f *File) Save(path string) error { - f.Sync() - data := bzl.Format(f.File) - return ioutil.WriteFile(path, data, 0666) -} - -// HasDefaultVisibility returns whether the File contains a "package" rule with -// a "default_visibility" attribute. Rules generated by Gazelle should not -// have their own visibility attributes if this is the case. -func (f *File) HasDefaultVisibility() bool { - for _, r := range f.Rules { - if r.Kind() == "package" && r.Attr("default_visibility") != nil { - return true - } - } - return false -} - -type stmt struct { - index int - deleted, inserted, updated bool - expr bzl.Expr -} - -// Index returns the index for this statement within the build file. For -// inserted rules, this is where the rule will be inserted (rules with the -// same index will be inserted in the order Insert was called). For existing -// rules, this is the index of the original statement. -func (s *stmt) Index() int { return s.index } - -// Delete marks this statement for deletion. It will be removed from the -// syntax tree when File.Sync is called. -func (s *stmt) Delete() { s.deleted = true } - -type byIndex []*stmt - -func (s byIndex) Len() int { - return len(s) -} - -func (s byIndex) Less(i, j int) bool { - return s[i].index < s[j].index -} - -func (s byIndex) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -// identPair represents one symbol, with or without remapping, in a load -// statement within a build file. -type identPair struct { - to, from *bzl.Ident -} - -// Load represents a load statement within a build file. -type Load struct { - stmt - name string - symbols map[string]identPair -} - -// NewLoad creates a new, empty load statement for the given file name. -func NewLoad(name string) *Load { - return &Load{ - stmt: stmt{ - expr: &bzl.LoadStmt{ - Module: &bzl.StringExpr{Value: name}, - ForceCompact: true, - }, - }, - name: name, - symbols: make(map[string]identPair), - } -} - -func loadFromExpr(index int, loadStmt *bzl.LoadStmt) *Load { - l := &Load{ - stmt: stmt{index: index, expr: loadStmt}, - name: loadStmt.Module.Value, - symbols: make(map[string]identPair), - } - for i := range loadStmt.From { - to, from := loadStmt.To[i], loadStmt.From[i] - l.symbols[to.Name] = identPair{to: to, from: from} - } - return l -} - -// Name returns the name of the file this statement loads. -func (l *Load) Name() string { - return l.name -} - -// Symbols returns a list of symbols this statement loads. -func (l *Load) Symbols() []string { - syms := make([]string, 0, len(l.symbols)) - for sym := range l.symbols { - syms = append(syms, sym) - } - sort.Strings(syms) - return syms -} - -// Has returns true if sym is loaded by this statement. -func (l *Load) Has(sym string) bool { - _, ok := l.symbols[sym] - return ok -} - -// Add inserts a new symbol into the load statement. This has no effect if -// the symbol is already loaded. Symbols will be sorted, so the order -// doesn't matter. -func (l *Load) Add(sym string) { - if _, ok := l.symbols[sym]; !ok { - i := &bzl.Ident{Name: sym} - l.symbols[sym] = identPair{to: i, from: i} - l.updated = true - } -} - -// Remove deletes a symbol from the load statement. This has no effect if -// the symbol is not loaded. -func (l *Load) Remove(sym string) { - if _, ok := l.symbols[sym]; ok { - delete(l.symbols, sym) - l.updated = true - } -} - -// IsEmpty returns whether this statement loads any symbols. -func (l *Load) IsEmpty() bool { - return len(l.symbols) == 0 -} - -// Insert marks this statement for insertion at the given index. If multiple -// statements are inserted at the same index, they will be inserted in the -// order Insert is called. -func (l *Load) Insert(f *File, index int) { - l.index = index - l.inserted = true - f.Loads = append(f.Loads, l) -} - -func (l *Load) sync() { - if !l.updated { - return - } - l.updated = false - - // args1 and args2 are two different sort groups based on whether a remap of the identifier is present. - var args1, args2, args []string - for sym, pair := range l.symbols { - if pair.from.Name == pair.to.Name { - args1 = append(args1, sym) - } else { - args2 = append(args2, sym) - } - } - sort.Strings(args1) - sort.Strings(args2) - args = append(args, args1...) - args = append(args, args2...) - - loadStmt := l.expr.(*bzl.LoadStmt) - loadStmt.Module.Value = l.name - loadStmt.From = make([]*bzl.Ident, 0, len(args)) - loadStmt.To = make([]*bzl.Ident, 0, len(args)) - for _, sym := range args { - pair := l.symbols[sym] - loadStmt.From = append(loadStmt.From, pair.from) - loadStmt.To = append(loadStmt.To, pair.to) - if pair.from.Name != pair.to.Name { - loadStmt.ForceCompact = false - } - } -} - -// Rule represents a rule statement within a build file. -type Rule struct { - stmt - kind string - args []bzl.Expr - attrs map[string]*bzl.AssignExpr - private map[string]interface{} -} - -// NewRule creates a new, empty rule with the given kind and name. -func NewRule(kind, name string) *Rule { - nameAttr := &bzl.AssignExpr{ - LHS: &bzl.Ident{Name: "name"}, - RHS: &bzl.StringExpr{Value: name}, - Op: "=", - } - r := &Rule{ - stmt: stmt{ - expr: &bzl.CallExpr{ - X: &bzl.Ident{Name: kind}, - List: []bzl.Expr{nameAttr}, - }, - }, - kind: kind, - attrs: map[string]*bzl.AssignExpr{"name": nameAttr}, - private: map[string]interface{}{}, - } - return r -} - -func ruleFromExpr(index int, expr bzl.Expr) *Rule { - call, ok := expr.(*bzl.CallExpr) - if !ok { - return nil - } - x, ok := call.X.(*bzl.Ident) - if !ok { - return nil - } - kind := x.Name - var args []bzl.Expr - attrs := make(map[string]*bzl.AssignExpr) - for _, arg := range call.List { - if attr, ok := arg.(*bzl.AssignExpr); ok { - key := attr.LHS.(*bzl.Ident) // required by parser - attrs[key.Name] = attr - } else { - args = append(args, arg) - } - } - return &Rule{ - stmt: stmt{ - index: index, - expr: call, - }, - kind: kind, - args: args, - attrs: attrs, - private: map[string]interface{}{}, - } -} - -// ShouldKeep returns whether the rule is marked with a "# keep" comment. Rules -// that are kept should not be modified. This does not check whether -// subexpressions within the rule should be kept. -func (r *Rule) ShouldKeep() bool { - return ShouldKeep(r.expr) -} - -// Kind returns the kind of rule this is (for example, "go_library"). -func (r *Rule) Kind() string { - return r.kind -} - -// SetKind changes the kind of rule this is. -func (r *Rule) SetKind(kind string) { - r.kind = kind - r.updated = true -} - -// Name returns the value of the rule's "name" attribute if it is a string -// or "" if the attribute does not exist or is not a string. -func (r *Rule) Name() string { - return r.AttrString("name") -} - -// SetName sets the value of the rule's "name" attribute. -func (r *Rule) SetName(name string) { - r.SetAttr("name", name) -} - -// AttrKeys returns a sorted list of attribute keys used in this rule. -func (r *Rule) AttrKeys() []string { - keys := make([]string, 0, len(r.attrs)) - for k := range r.attrs { - keys = append(keys, k) - } - sort.SliceStable(keys, func(i, j int) bool { - if cmp := bt.NamePriority[keys[i]] - bt.NamePriority[keys[j]]; cmp != 0 { - return cmp < 0 - } - return keys[i] < keys[j] - }) - return keys -} - -// Attr returns the value of the named attribute. nil is returned when the -// attribute is not set. -func (r *Rule) Attr(key string) bzl.Expr { - attr, ok := r.attrs[key] - if !ok { - return nil - } - return attr.RHS -} - -// AttrString returns the value of the named attribute if it is a scalar string. -// "" is returned if the attribute is not set or is not a string. -func (r *Rule) AttrString(key string) string { - attr, ok := r.attrs[key] - if !ok { - return "" - } - str, ok := attr.RHS.(*bzl.StringExpr) - if !ok { - return "" - } - return str.Value -} - -// AttrStrings returns the string values of an attribute if it is a list. -// nil is returned if the attribute is not set or is not a list. Non-string -// values within the list won't be returned. -func (r *Rule) AttrStrings(key string) []string { - attr, ok := r.attrs[key] - if !ok { - return nil - } - list, ok := attr.RHS.(*bzl.ListExpr) - if !ok { - return nil - } - strs := make([]string, 0, len(list.List)) - for _, e := range list.List { - if str, ok := e.(*bzl.StringExpr); ok { - strs = append(strs, str.Value) - } - } - return strs -} - -// DelAttr removes the named attribute from the rule. -func (r *Rule) DelAttr(key string) { - delete(r.attrs, key) - r.updated = true -} - -// SetAttr adds or replaces the named attribute with an expression produced -// by ExprFromValue. -func (r *Rule) SetAttr(key string, value interface{}) { - rhs := ExprFromValue(value) - if attr, ok := r.attrs[key]; ok { - attr.RHS = rhs - } else { - r.attrs[key] = &bzl.AssignExpr{ - LHS: &bzl.Ident{Name: key}, - RHS: rhs, - Op: "=", - } - } - r.updated = true -} - -// PrivateAttrKeys returns a sorted list of private attribute names. -func (r *Rule) PrivateAttrKeys() []string { - keys := make([]string, 0, len(r.private)) - for k := range r.private { - keys = append(keys, k) - } - sort.Strings(keys) - return keys -} - -// PrivateAttr return the private value associated with a key. -func (r *Rule) PrivateAttr(key string) interface{} { - return r.private[key] -} - -// SetPrivateAttr associates a value with a key. Unlike SetAttr, this value -// is not converted to a build syntax tree and will not be written to a build -// file. -func (r *Rule) SetPrivateAttr(key string, value interface{}) { - r.private[key] = value -} - -// Args returns positional arguments passed to a rule. -func (r *Rule) Args() []bzl.Expr { - return r.args -} - -// Insert marks this statement for insertion at the end of the file. Multiple -// statements will be inserted in the order Insert is called. -func (r *Rule) Insert(f *File) { - // TODO(jayconrod): should rules always be inserted at the end? Should there - // be some sort order? - var stmt []bzl.Expr - if f.function == nil { - stmt = f.File.Stmt - } else { - stmt = f.function.stmt.Body - } - r.index = len(stmt) - r.inserted = true - f.Rules = append(f.Rules, r) -} - -// IsEmpty returns true when the rule contains none of the attributes in attrs -// for its kind. attrs should contain attributes that make the rule buildable -// like srcs or deps and not descriptive attributes like name or visibility. -func (r *Rule) IsEmpty(info KindInfo) bool { - if info.NonEmptyAttrs == nil { - return false - } - for k := range info.NonEmptyAttrs { - if _, ok := r.attrs[k]; ok { - return false - } - } - return true -} - -func (r *Rule) sync() { - if !r.updated { - return - } - r.updated = false - - for _, k := range []string{"srcs", "deps"} { - if attr, ok := r.attrs[k]; ok { - bzl.Walk(attr.RHS, sortExprLabels) - } - } - - call := r.expr.(*bzl.CallExpr) - call.X.(*bzl.Ident).Name = r.kind - if len(r.attrs) > 1 { - call.ForceMultiLine = true - } - - list := make([]bzl.Expr, 0, len(r.args)+len(r.attrs)) - list = append(list, r.args...) - for _, attr := range r.attrs { - list = append(list, attr) - } - sortedAttrs := list[len(r.args):] - key := func(e bzl.Expr) string { return e.(*bzl.AssignExpr).LHS.(*bzl.Ident).Name } - sort.SliceStable(sortedAttrs, func(i, j int) bool { - ki := key(sortedAttrs[i]) - kj := key(sortedAttrs[j]) - if cmp := bt.NamePriority[ki] - bt.NamePriority[kj]; cmp != 0 { - return cmp < 0 - } - return ki < kj - }) - - call.List = list - r.updated = false -} - -// ShouldKeep returns whether e is marked with a "# keep" comment. Kept -// expressions should not be removed or modified. -func ShouldKeep(e bzl.Expr) bool { - for _, c := range append(e.Comment().Before, e.Comment().Suffix...) { - text := strings.TrimSpace(strings.TrimPrefix(c.Token, "#")) - if text == "keep" { - return true - } - } - return false -} - -// CheckInternalVisibility overrides the given visibility if the package is -// internal. -func CheckInternalVisibility(rel, visibility string) string { - if i := strings.LastIndex(rel, "/internal/"); i >= 0 { - visibility = fmt.Sprintf("//%s:__subpackages__", rel[:i]) - } else if strings.HasPrefix(rel, "internal/") { - visibility = "//:__subpackages__" - } - return visibility -} - -type byAttrName []KeyValue - -var _ sort.Interface = byAttrName{} - -func (s byAttrName) Len() int { - return len(s) -} - -func (s byAttrName) Less(i, j int) bool { - if cmp := bt.NamePriority[s[i].Key] - bt.NamePriority[s[j].Key]; cmp != 0 { - return cmp < 0 - } - return s[i].Key < s[j].Key -} - -func (s byAttrName) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/rule/sort_labels.go b/vendor/github.com/bazelbuild/bazel-gazelle/rule/sort_labels.go deleted file mode 100644 index bd27eb55820..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/rule/sort_labels.go +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright 2017 The Bazel Authors. 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 rule - -import ( - "sort" - "strings" - - bzl "github.com/bazelbuild/buildtools/build" -) - -// sortExprLabels sorts lists of strings using the same order as buildifier. -// Buildifier also sorts string lists, but not those involved with "select" -// expressions. This function is intended to be used with bzl.Walk. -func sortExprLabels(e bzl.Expr, _ []bzl.Expr) { - list, ok := e.(*bzl.ListExpr) - if !ok || len(list.List) == 0 { - return - } - - keys := make([]stringSortKey, len(list.List)) - for i, elem := range list.List { - s, ok := elem.(*bzl.StringExpr) - if !ok { - return // don't sort lists unless all elements are strings - } - keys[i] = makeSortKey(i, s) - } - - before := keys[0].x.Comment().Before - keys[0].x.Comment().Before = nil - sort.Sort(byStringExpr(keys)) - keys[0].x.Comment().Before = append(before, keys[0].x.Comment().Before...) - for i, k := range keys { - list.List[i] = k.x - } -} - -// Code below this point is adapted from -// github.com/bazelbuild/buildtools/build/rewrite.go - -// A stringSortKey records information about a single string literal to be -// sorted. The strings are first grouped into four phases: most strings, -// strings beginning with ":", strings beginning with "//", and strings -// beginning with "@". The next significant part of the comparison is the list -// of elements in the value, where elements are split at `.' and `:'. Finally -// we compare by value and break ties by original index. -type stringSortKey struct { - phase int - split []string - value string - original int - x bzl.Expr -} - -func makeSortKey(index int, x *bzl.StringExpr) stringSortKey { - key := stringSortKey{ - value: x.Value, - original: index, - x: x, - } - - switch { - case strings.HasPrefix(x.Value, ":"): - key.phase = 1 - case strings.HasPrefix(x.Value, "//"): - key.phase = 2 - case strings.HasPrefix(x.Value, "@"): - key.phase = 3 - } - - key.split = strings.Split(strings.Replace(x.Value, ":", ".", -1), ".") - return key -} - -// byStringExpr implements sort.Interface for a list of stringSortKey. -type byStringExpr []stringSortKey - -func (x byStringExpr) Len() int { return len(x) } -func (x byStringExpr) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -func (x byStringExpr) Less(i, j int) bool { - xi := x[i] - xj := x[j] - - if xi.phase != xj.phase { - return xi.phase < xj.phase - } - for k := 0; k < len(xi.split) && k < len(xj.split); k++ { - if xi.split[k] != xj.split[k] { - return xi.split[k] < xj.split[k] - } - } - if len(xi.split) != len(xj.split) { - return len(xi.split) < len(xj.split) - } - if xi.value != xj.value { - return xi.value < xj.value - } - return xi.original < xj.original -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/rule/types.go b/vendor/github.com/bazelbuild/bazel-gazelle/rule/types.go deleted file mode 100644 index 5d1f5a3f925..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/rule/types.go +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 rule - -// LoadInfo describes a file that Gazelle knows about and the symbols -// it defines. -type LoadInfo struct { - Name string - Symbols []string - After []string -} - -// KindInfo stores metadata for a kind of rule, for example, "go_library". -type KindInfo struct { - // MatchAny is true if a rule of this kind may be matched with any rule - // of the same kind, regardless of attributes, if exactly one rule is - // present a build file. - MatchAny bool - - // MatchAttrs is a list of attributes used in matching. For example, - // for go_library, this list contains "importpath". Attributes are matched - // in order. - MatchAttrs []string - - // NonEmptyAttrs is a set of attributes that, if present, disqualify a rule - // from being deleted after merge. - NonEmptyAttrs map[string]bool - - // SubstituteAttrs is a set of attributes that should be substituted - // after matching and before merging. For example, suppose generated rule A - // references B via an "embed" attribute, and B matches against rule C. - // The label for B in A's "embed" must be substituted with a label for C. - // "embed" would need to be in this set. - SubstituteAttrs map[string]bool - - // MergeableAttrs is a set of attributes that should be merged before - // dependency resolution. See rule.Merge. - MergeableAttrs map[string]bool - - // ResolveAttrs is a set of attributes that should be merged after - // dependency resolution. See rule.Merge. - ResolveAttrs map[string]bool -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/rule/value.go b/vendor/github.com/bazelbuild/bazel-gazelle/rule/value.go deleted file mode 100644 index 1edc6ff63a6..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/rule/value.go +++ /dev/null @@ -1,191 +0,0 @@ -/* Copyright 2016 The Bazel Authors. 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 rule - -import ( - "fmt" - "log" - "reflect" - "sort" - - bzl "github.com/bazelbuild/buildtools/build" -) - -// KeyValue represents a key-value pair. This gets converted into a -// rule attribute, i.e., a Skylark keyword argument. -type KeyValue struct { - Key string - Value interface{} -} - -// GlobValue represents a Bazel glob expression. -type GlobValue struct { - Patterns []string - Excludes []string -} - -// BzlExprValue is implemented by types that have custom translations -// to Starlark values. -type BzlExprValue interface { - BzlExpr() bzl.Expr -} - -// SelectStringListValue is a value that can be translated to a Bazel -// select expression that picks a string list based on a string condition. -type SelectStringListValue map[string][]string - -func (s SelectStringListValue) BzlExpr() bzl.Expr { - defaultKey := "//conditions:default" - keys := make([]string, 0, len(s)) - haveDefaultKey := false - for key := range s { - if key == defaultKey { - haveDefaultKey = true - } else { - keys = append(keys, key) - } - } - sort.Strings(keys) - if haveDefaultKey { - keys = append(keys, defaultKey) - } - - args := make([]bzl.Expr, 0, len(s)) - for _, key := range keys { - value := ExprFromValue(s[key]) - if key != defaultKey { - value.(*bzl.ListExpr).ForceMultiLine = true - } - args = append(args, &bzl.KeyValueExpr{ - Key: &bzl.StringExpr{Value: key}, - Value: value, - }) - } - sel := &bzl.CallExpr{ - X: &bzl.Ident{Name: "select"}, - List: []bzl.Expr{&bzl.DictExpr{List: args, ForceMultiLine: true}}, - } - return sel -} - -// ExprFromValue converts a value into an expression that can be written into -// a Bazel build file. The following types of values can be converted: -// -// * bools, integers, floats, strings. -// * slices, arrays (converted to lists). -// * maps (converted to select expressions; keys must be rules in -// @io_bazel_rules_go//go/platform). -// * GlobValue (converted to glob expressions). -// * PlatformStrings (converted to a concatenation of a list and selects). -// -// Converting unsupported types will cause a panic. -func ExprFromValue(val interface{}) bzl.Expr { - if e, ok := val.(bzl.Expr); ok { - return e - } - if be, ok := val.(BzlExprValue); ok { - return be.BzlExpr() - } - - rv := reflect.ValueOf(val) - switch rv.Kind() { - case reflect.Bool: - tok := "False" - if rv.Bool() { - tok = "True" - } - return &bzl.LiteralExpr{Token: tok} - - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return &bzl.LiteralExpr{Token: fmt.Sprintf("%d", val)} - - case reflect.Float32, reflect.Float64: - return &bzl.LiteralExpr{Token: fmt.Sprintf("%f", val)} - - case reflect.String: - return &bzl.StringExpr{Value: val.(string)} - - case reflect.Slice, reflect.Array: - var list []bzl.Expr - for i := 0; i < rv.Len(); i++ { - elem := ExprFromValue(rv.Index(i).Interface()) - list = append(list, elem) - } - return &bzl.ListExpr{List: list} - - case reflect.Map: - rkeys := rv.MapKeys() - sort.Sort(byString(rkeys)) - args := make([]bzl.Expr, len(rkeys)) - for i, rk := range rkeys { - k := &bzl.StringExpr{Value: mapKeyString(rk)} - v := ExprFromValue(rv.MapIndex(rk).Interface()) - if l, ok := v.(*bzl.ListExpr); ok { - l.ForceMultiLine = true - } - args[i] = &bzl.KeyValueExpr{Key: k, Value: v} - } - return &bzl.DictExpr{List: args, ForceMultiLine: true} - - case reflect.Struct: - switch val := val.(type) { - case GlobValue: - patternsValue := ExprFromValue(val.Patterns) - globArgs := []bzl.Expr{patternsValue} - if len(val.Excludes) > 0 { - excludesValue := ExprFromValue(val.Excludes) - globArgs = append(globArgs, &bzl.KeyValueExpr{ - Key: &bzl.StringExpr{Value: "excludes"}, - Value: excludesValue, - }) - } - return &bzl.CallExpr{ - X: &bzl.LiteralExpr{Token: "glob"}, - List: globArgs, - } - } - } - - log.Panicf("type not supported: %T", val) - return nil -} - -func mapKeyString(k reflect.Value) string { - switch s := k.Interface().(type) { - case string: - return s - default: - log.Panicf("unexpected map key: %v", k) - return "" - } -} - -type byString []reflect.Value - -var _ sort.Interface = byString{} - -func (s byString) Len() int { - return len(s) -} - -func (s byString) Less(i, j int) bool { - return mapKeyString(s[i]) < mapKeyString(s[j]) -} - -func (s byString) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/walk/BUILD b/vendor/github.com/bazelbuild/bazel-gazelle/walk/BUILD deleted file mode 100644 index 9303fe800f5..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/walk/BUILD +++ /dev/null @@ -1,32 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "config.go", - "walk.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/bazel-gazelle/walk", - importpath = "github.com/bazelbuild/bazel-gazelle/walk", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/bazelbuild/bazel-gazelle/config:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/flag:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/pathtools:go_default_library", - "//vendor/github.com/bazelbuild/bazel-gazelle/rule:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/walk/config.go b/vendor/github.com/bazelbuild/bazel-gazelle/walk/config.go deleted file mode 100644 index 22b355836f9..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/walk/config.go +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 walk - -import ( - "flag" - "path" - - "github.com/bazelbuild/bazel-gazelle/config" - gzflag "github.com/bazelbuild/bazel-gazelle/flag" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -// TODO(#472): store location information to validate each exclude. They -// may be set in one directory and used in another. Excludes work on -// declared generated files, so we can't just stat. - -type walkConfig struct { - excludes []string - ignore bool - follow []string -} - -const walkName = "_walk" - -func getWalkConfig(c *config.Config) *walkConfig { - return c.Exts[walkName].(*walkConfig) -} - -func (wc *walkConfig) isExcluded(rel, base string) bool { - if base == ".git" { - return true - } - f := path.Join(rel, base) - for _, x := range wc.excludes { - if f == x { - return true - } - } - return false -} - -type Configurer struct{} - -func (_ *Configurer) RegisterFlags(fs *flag.FlagSet, cmd string, c *config.Config) { - wc := &walkConfig{} - c.Exts[walkName] = wc - fs.Var(&gzflag.MultiFlag{Values: &wc.excludes}, "exclude", "Path to file or directory that should be ignored (may be repeated)") -} - -func (_ *Configurer) CheckFlags(fs *flag.FlagSet, c *config.Config) error { return nil } - -func (_ *Configurer) KnownDirectives() []string { - return []string{"exclude", "follow", "ignore"} -} - -func (_ *Configurer) Configure(c *config.Config, rel string, f *rule.File) { - wc := getWalkConfig(c) - wcCopy := &walkConfig{} - *wcCopy = *wc - wcCopy.ignore = false - - if f != nil { - for _, d := range f.Directives { - switch d.Key { - case "exclude": - wcCopy.excludes = append(wcCopy.excludes, path.Join(rel, d.Value)) - case "follow": - wcCopy.follow = append(wcCopy.follow, path.Join(rel, d.Value)) - case "ignore": - wcCopy.ignore = true - } - } - } - - c.Exts[walkName] = wcCopy -} diff --git a/vendor/github.com/bazelbuild/bazel-gazelle/walk/walk.go b/vendor/github.com/bazelbuild/bazel-gazelle/walk/walk.go deleted file mode 100644 index 672c82b2245..00000000000 --- a/vendor/github.com/bazelbuild/bazel-gazelle/walk/walk.go +++ /dev/null @@ -1,332 +0,0 @@ -/* Copyright 2018 The Bazel Authors. 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 walk provides customizable functionality for visiting each -// subdirectory in a directory tree. -package walk - -import ( - "io/ioutil" - "log" - "os" - "path" - "path/filepath" - "strings" - - "github.com/bazelbuild/bazel-gazelle/config" - "github.com/bazelbuild/bazel-gazelle/pathtools" - "github.com/bazelbuild/bazel-gazelle/rule" -) - -// Mode determines which directories Walk visits and which directories -// should be updated. -type Mode int - -const ( - // In VisitAllUpdateSubdirsMode, Walk visits every directory in the - // repository. The directories given to Walk and their subdirectories are - // updated. - VisitAllUpdateSubdirsMode Mode = iota - - // In VisitAllUpdateDirsMode, Walk visits every directory in the repository. - // Only the directories given to Walk are updated (not their subdirectories). - VisitAllUpdateDirsMode - - // In UpdateDirsMode, Walk only visits and updates directories given to Walk. - // Build files in parent directories are read in order to produce a complete - // configuration, but the callback is not called for parent directories. - UpdateDirsMode -) - -// WalkFunc is a callback called by Walk in each visited directory. -// -// dir is the absolute file system path to the directory being visited. -// -// rel is the relative slash-separated path to the directory from the -// repository root. Will be "" for the repository root directory itself. -// -// c is the configuration for the current directory. This may have been -// modified by directives in the directory's build file. -// -// update is true when the build file may be updated. -// -// f is the existing build file in the directory. Will be nil if there -// was no file. -// -// subdirs is a list of base names of subdirectories within dir, not -// including excluded files. -// -// regularFiles is a list of base names of regular files within dir, not -// including excluded files. -// -// genFiles is a list of names of generated files, found by reading -// "out" and "outs" attributes of rules in f. -type WalkFunc func(dir, rel string, c *config.Config, update bool, f *rule.File, subdirs, regularFiles, genFiles []string) - -// Walk traverses the directory tree rooted at c.RepoRoot. Walk visits -// subdirectories in depth-first post-order. -// -// When Walk visits a directory, it lists the files and subdirectories within -// that directory. If a build file is present, Walk reads the build file and -// applies any directives to the configuration (a copy of the parent directory's -// configuration is made, and the copy is modified). After visiting -// subdirectories, the callback wf may be called, depending on the mode. -// -// c is the root configuration to start with. This includes changes made by -// command line flags, but not by the root build file. This configuration -// should not be modified. -// -// cexts is a list of configuration extensions. When visiting a directory, -// before visiting subdirectories, Walk makes a copy of the parent configuration -// and Configure for each extension on the copy. If Walk sees a directive -// that is not listed in KnownDirectives of any extension, an error will -// be logged. -// -// dirs is a list of absolute, canonical file system paths of directories -// to visit. -// -// mode determines whether subdirectories of dirs should be visited recursively, -// when the wf callback should be called, and when the "update" argument -// to the wf callback should be set. -// -// wf is a function that may be called in each directory. -func Walk(c *config.Config, cexts []config.Configurer, dirs []string, mode Mode, wf WalkFunc) { - knownDirectives := make(map[string]bool) - for _, cext := range cexts { - for _, d := range cext.KnownDirectives() { - knownDirectives[d] = true - } - } - - symlinks := symlinkResolver{visited: []string{c.RepoRoot}} - - updateRels := buildUpdateRelMap(c.RepoRoot, dirs) - - var visit func(*config.Config, string, string, bool) - visit = func(c *config.Config, dir, rel string, updateParent bool) { - haveError := false - - // TODO: OPT: ReadDir stats all the files, which is slow. We just care about - // names and modes, so we should use something like - // golang.org/x/tools/internal/fastwalk to speed this up. - files, err := ioutil.ReadDir(dir) - if err != nil { - log.Print(err) - return - } - - f, err := loadBuildFile(c, rel, dir, files) - if err != nil { - log.Print(err) - haveError = true - } - - c = configure(cexts, knownDirectives, c, rel, f) - wc := getWalkConfig(c) - - if wc.isExcluded(rel, ".") { - return - } - - var subdirs, regularFiles []string - for _, fi := range files { - base := fi.Name() - switch { - case base == "" || wc.isExcluded(rel, base): - continue - - case fi.IsDir() || fi.Mode()&os.ModeSymlink != 0 && symlinks.follow(c, dir, rel, base): - subdirs = append(subdirs, base) - - default: - regularFiles = append(regularFiles, base) - } - } - - shouldUpdate := shouldUpdate(rel, mode, updateParent, updateRels) - for _, sub := range subdirs { - if subRel := path.Join(rel, sub); shouldVisit(subRel, mode, updateRels) { - visit(c, filepath.Join(dir, sub), subRel, shouldUpdate) - } - } - - update := !haveError && !wc.ignore && shouldUpdate - if shouldCall(rel, mode, updateRels) { - genFiles := findGenFiles(wc, f) - wf(dir, rel, c, update, f, subdirs, regularFiles, genFiles) - } - } - visit(c, c.RepoRoot, "", false) -} - -// buildUpdateRelMap builds a table of prefixes, used to determine which -// directories to update and visit. -// -// root and dirs must be absolute, canonical file paths. Each entry in dirs -// must be a subdirectory of root. The caller is responsible for checking this. -// -// buildUpdateRelMap returns a map from slash-separated paths relative to the -// root directory ("" for the root itself) to a boolean indicating whether -// the directory should be updated. -func buildUpdateRelMap(root string, dirs []string) map[string]bool { - relMap := make(map[string]bool) - for _, dir := range dirs { - rel, _ := filepath.Rel(root, dir) - rel = filepath.ToSlash(rel) - if rel == "." { - rel = "" - } - - i := 0 - for { - next := strings.IndexByte(rel[i:], '/') + i - if next-i < 0 { - relMap[rel] = true - break - } - prefix := rel[:next] - relMap[prefix] = relMap[prefix] // set to false if not present - i = next + 1 - } - } - return relMap -} - -// shouldCall returns true if Walk should call the callback in the -// directory rel. -func shouldCall(rel string, mode Mode, updateRels map[string]bool) bool { - return mode != UpdateDirsMode || updateRels[rel] -} - -// shouldUpdate returns true if Walk should pass true to the callback's update -// parameter in the directory rel. This indicates the build file should be -// updated. -func shouldUpdate(rel string, mode Mode, updateParent bool, updateRels map[string]bool) bool { - return mode == VisitAllUpdateSubdirsMode && updateParent || updateRels[rel] -} - -// shouldVisit returns true if Walk should visit the subdirectory rel. -func shouldVisit(rel string, mode Mode, updateRels map[string]bool) bool { - if mode != UpdateDirsMode { - return true - } - _, ok := updateRels[rel] - return ok -} - -func loadBuildFile(c *config.Config, pkg, dir string, files []os.FileInfo) (*rule.File, error) { - var err error - readDir := dir - readFiles := files - if c.ReadBuildFilesDir != "" { - readDir = filepath.Join(c.ReadBuildFilesDir, filepath.FromSlash(pkg)) - readFiles, err = ioutil.ReadDir(readDir) - if err != nil { - return nil, err - } - } - path := rule.MatchBuildFileName(readDir, c.ValidBuildFileNames, readFiles) - if path == "" { - return nil, nil - } - return rule.LoadFile(path, pkg) -} - -func configure(cexts []config.Configurer, knownDirectives map[string]bool, c *config.Config, rel string, f *rule.File) *config.Config { - if rel != "" { - c = c.Clone() - } - if f != nil { - for _, d := range f.Directives { - if !knownDirectives[d.Key] { - log.Printf("%s: unknown directive: gazelle:%s", f.Path, d.Key) - } - } - } - for _, cext := range cexts { - cext.Configure(c, rel, f) - } - return c -} - -func findGenFiles(wc *walkConfig, f *rule.File) []string { - if f == nil { - return nil - } - var strs []string - for _, r := range f.Rules { - for _, key := range []string{"out", "outs"} { - if s := r.AttrString(key); s != "" { - strs = append(strs, s) - } else if ss := r.AttrStrings(key); len(ss) > 0 { - strs = append(strs, ss...) - } - } - } - - var genFiles []string - for _, s := range strs { - if !wc.isExcluded(f.Pkg, s) { - genFiles = append(genFiles, s) - } - } - return genFiles -} - -type symlinkResolver struct { - visited []string -} - -// Decide if symlink dir/base should be followed. -func (r *symlinkResolver) follow(c *config.Config, dir, rel, base string) bool { - if dir == c.RepoRoot && strings.HasPrefix(base, "bazel-") { - // Links such as bazel-, bazel-out, bazel-genfiles are created by - // Bazel to point to internal build directories. - return false - } - - // See if the user has explicitly directed us to follow the link. - wc := getWalkConfig(c) - linkRel := path.Join(rel, base) - for _, follow := range wc.follow { - if linkRel == follow { - return true - } - } - - // See if the symlink points to a tree that has been already visited. - fullpath := filepath.Join(dir, base) - dest, err := filepath.EvalSymlinks(fullpath) - if err != nil { - return false - } - if !filepath.IsAbs(dest) { - dest, err = filepath.Abs(filepath.Join(dir, dest)) - if err != nil { - return false - } - } - for _, p := range r.visited { - if pathtools.HasPrefix(dest, p) || pathtools.HasPrefix(p, dest) { - return false - } - } - r.visited = append(r.visited, dest) - stat, err := os.Stat(fullpath) - if err != nil { - return false - } - return stat.IsDir() -} diff --git a/vendor/github.com/bazelbuild/buildtools/CONTRIBUTORS b/vendor/github.com/bazelbuild/buildtools/CONTRIBUTORS deleted file mode 100644 index 2d919a47f9b..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/CONTRIBUTORS +++ /dev/null @@ -1,15 +0,0 @@ -# People who have agreed to one of the CLAs and can contribute patches. -# The AUTHORS file lists the copyright holders; this file -# lists people. For example, Google employees are listed here -# but not in AUTHORS, because Google holds the copyright. -# -# https://developers.google.com/open-source/cla/individual -# https://developers.google.com/open-source/cla/corporate -# -# Names should be added to this file as: -# Name -Paul Bethe -Russ Cox -Laurent Le Brun -Justine Alexandra Roberts Tunney -Nilton Volpato \ No newline at end of file diff --git a/vendor/github.com/bazelbuild/buildtools/LICENSE b/vendor/github.com/bazelbuild/buildtools/LICENSE deleted file mode 100644 index 0adcb5d6f52..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2016 Google 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. diff --git a/vendor/github.com/bazelbuild/buildtools/api_proto/BUILD b/vendor/github.com/bazelbuild/buildtools/api_proto/BUILD deleted file mode 100644 index 18005665fa7..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/api_proto/BUILD +++ /dev/null @@ -1,24 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["api.gen.pb.go"], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/buildtools/api_proto", - importpath = "github.com/bazelbuild/buildtools/api_proto", - visibility = ["//visibility:public"], - deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/buildtools/api_proto/api.gen.pb.go b/vendor/github.com/bazelbuild/buildtools/api_proto/api.gen.pb.go deleted file mode 100644 index 98dd570832c..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/api_proto/api.gen.pb.go +++ /dev/null @@ -1,317 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: api_proto/api.proto - -package api_proto - -import ( - fmt "fmt" - proto "github.com/golang/protobuf/proto" - math "math" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -type Output_Record_Field_ERROR int32 - -const ( - Output_Record_Field_UNKNOWN Output_Record_Field_ERROR = 0 - Output_Record_Field_MISSING Output_Record_Field_ERROR = 1 -) - -var Output_Record_Field_ERROR_name = map[int32]string{ - 0: "UNKNOWN", - 1: "MISSING", -} - -var Output_Record_Field_ERROR_value = map[string]int32{ - "UNKNOWN": 0, - "MISSING": 1, -} - -func (x Output_Record_Field_ERROR) String() string { - return proto.EnumName(Output_Record_Field_ERROR_name, int32(x)) -} - -func (Output_Record_Field_ERROR) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_35e560d0f079cc1d, []int{0, 0, 0, 0} -} - -type Output struct { - Records []*Output_Record `protobuf:"bytes,1,rep,name=records,proto3" json:"records,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Output) Reset() { *m = Output{} } -func (m *Output) String() string { return proto.CompactTextString(m) } -func (*Output) ProtoMessage() {} -func (*Output) Descriptor() ([]byte, []int) { - return fileDescriptor_35e560d0f079cc1d, []int{0} -} - -func (m *Output) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Output.Unmarshal(m, b) -} -func (m *Output) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Output.Marshal(b, m, deterministic) -} -func (m *Output) XXX_Merge(src proto.Message) { - xxx_messageInfo_Output.Merge(m, src) -} -func (m *Output) XXX_Size() int { - return xxx_messageInfo_Output.Size(m) -} -func (m *Output) XXX_DiscardUnknown() { - xxx_messageInfo_Output.DiscardUnknown(m) -} - -var xxx_messageInfo_Output proto.InternalMessageInfo - -func (m *Output) GetRecords() []*Output_Record { - if m != nil { - return m.Records - } - return nil -} - -type Output_Record struct { - Fields []*Output_Record_Field `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Output_Record) Reset() { *m = Output_Record{} } -func (m *Output_Record) String() string { return proto.CompactTextString(m) } -func (*Output_Record) ProtoMessage() {} -func (*Output_Record) Descriptor() ([]byte, []int) { - return fileDescriptor_35e560d0f079cc1d, []int{0, 0} -} - -func (m *Output_Record) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Output_Record.Unmarshal(m, b) -} -func (m *Output_Record) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Output_Record.Marshal(b, m, deterministic) -} -func (m *Output_Record) XXX_Merge(src proto.Message) { - xxx_messageInfo_Output_Record.Merge(m, src) -} -func (m *Output_Record) XXX_Size() int { - return xxx_messageInfo_Output_Record.Size(m) -} -func (m *Output_Record) XXX_DiscardUnknown() { - xxx_messageInfo_Output_Record.DiscardUnknown(m) -} - -var xxx_messageInfo_Output_Record proto.InternalMessageInfo - -func (m *Output_Record) GetFields() []*Output_Record_Field { - if m != nil { - return m.Fields - } - return nil -} - -type Output_Record_Field struct { - // Types that are valid to be assigned to Value: - // *Output_Record_Field_Text - // *Output_Record_Field_Number - // *Output_Record_Field_Error - // *Output_Record_Field_List - Value isOutput_Record_Field_Value `protobuf_oneof:"value"` - QuoteWhenPrinting bool `protobuf:"varint,7,opt,name=quote_when_printing,json=quoteWhenPrinting,proto3" json:"quote_when_printing,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Output_Record_Field) Reset() { *m = Output_Record_Field{} } -func (m *Output_Record_Field) String() string { return proto.CompactTextString(m) } -func (*Output_Record_Field) ProtoMessage() {} -func (*Output_Record_Field) Descriptor() ([]byte, []int) { - return fileDescriptor_35e560d0f079cc1d, []int{0, 0, 0} -} - -func (m *Output_Record_Field) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Output_Record_Field.Unmarshal(m, b) -} -func (m *Output_Record_Field) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Output_Record_Field.Marshal(b, m, deterministic) -} -func (m *Output_Record_Field) XXX_Merge(src proto.Message) { - xxx_messageInfo_Output_Record_Field.Merge(m, src) -} -func (m *Output_Record_Field) XXX_Size() int { - return xxx_messageInfo_Output_Record_Field.Size(m) -} -func (m *Output_Record_Field) XXX_DiscardUnknown() { - xxx_messageInfo_Output_Record_Field.DiscardUnknown(m) -} - -var xxx_messageInfo_Output_Record_Field proto.InternalMessageInfo - -type isOutput_Record_Field_Value interface { - isOutput_Record_Field_Value() -} - -type Output_Record_Field_Text struct { - Text string `protobuf:"bytes,1,opt,name=text,proto3,oneof"` -} - -type Output_Record_Field_Number struct { - Number int32 `protobuf:"varint,2,opt,name=number,proto3,oneof"` -} - -type Output_Record_Field_Error struct { - Error Output_Record_Field_ERROR `protobuf:"varint,3,opt,name=error,proto3,enum=devtools.buildozer.Output_Record_Field_ERROR,oneof"` -} - -type Output_Record_Field_List struct { - List *RepeatedString `protobuf:"bytes,5,opt,name=list,proto3,oneof"` -} - -func (*Output_Record_Field_Text) isOutput_Record_Field_Value() {} - -func (*Output_Record_Field_Number) isOutput_Record_Field_Value() {} - -func (*Output_Record_Field_Error) isOutput_Record_Field_Value() {} - -func (*Output_Record_Field_List) isOutput_Record_Field_Value() {} - -func (m *Output_Record_Field) GetValue() isOutput_Record_Field_Value { - if m != nil { - return m.Value - } - return nil -} - -func (m *Output_Record_Field) GetText() string { - if x, ok := m.GetValue().(*Output_Record_Field_Text); ok { - return x.Text - } - return "" -} - -func (m *Output_Record_Field) GetNumber() int32 { - if x, ok := m.GetValue().(*Output_Record_Field_Number); ok { - return x.Number - } - return 0 -} - -func (m *Output_Record_Field) GetError() Output_Record_Field_ERROR { - if x, ok := m.GetValue().(*Output_Record_Field_Error); ok { - return x.Error - } - return Output_Record_Field_UNKNOWN -} - -func (m *Output_Record_Field) GetList() *RepeatedString { - if x, ok := m.GetValue().(*Output_Record_Field_List); ok { - return x.List - } - return nil -} - -func (m *Output_Record_Field) GetQuoteWhenPrinting() bool { - if m != nil { - return m.QuoteWhenPrinting - } - return false -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Output_Record_Field) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Output_Record_Field_Text)(nil), - (*Output_Record_Field_Number)(nil), - (*Output_Record_Field_Error)(nil), - (*Output_Record_Field_List)(nil), - } -} - -type RepeatedString struct { - Strings []string `protobuf:"bytes,1,rep,name=strings,proto3" json:"strings,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RepeatedString) Reset() { *m = RepeatedString{} } -func (m *RepeatedString) String() string { return proto.CompactTextString(m) } -func (*RepeatedString) ProtoMessage() {} -func (*RepeatedString) Descriptor() ([]byte, []int) { - return fileDescriptor_35e560d0f079cc1d, []int{1} -} - -func (m *RepeatedString) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RepeatedString.Unmarshal(m, b) -} -func (m *RepeatedString) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RepeatedString.Marshal(b, m, deterministic) -} -func (m *RepeatedString) XXX_Merge(src proto.Message) { - xxx_messageInfo_RepeatedString.Merge(m, src) -} -func (m *RepeatedString) XXX_Size() int { - return xxx_messageInfo_RepeatedString.Size(m) -} -func (m *RepeatedString) XXX_DiscardUnknown() { - xxx_messageInfo_RepeatedString.DiscardUnknown(m) -} - -var xxx_messageInfo_RepeatedString proto.InternalMessageInfo - -func (m *RepeatedString) GetStrings() []string { - if m != nil { - return m.Strings - } - return nil -} - -func init() { - proto.RegisterEnum("devtools.buildozer.Output_Record_Field_ERROR", Output_Record_Field_ERROR_name, Output_Record_Field_ERROR_value) - proto.RegisterType((*Output)(nil), "devtools.buildozer.Output") - proto.RegisterType((*Output_Record)(nil), "devtools.buildozer.Output.Record") - proto.RegisterType((*Output_Record_Field)(nil), "devtools.buildozer.Output.Record.Field") - proto.RegisterType((*RepeatedString)(nil), "devtools.buildozer.RepeatedString") -} - -func init() { proto.RegisterFile("api_proto/api.proto", fileDescriptor_35e560d0f079cc1d) } - -var fileDescriptor_35e560d0f079cc1d = []byte{ - // 346 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xc1, 0x6a, 0xe3, 0x30, - 0x10, 0x86, 0xad, 0x24, 0xb6, 0x37, 0x63, 0x08, 0x59, 0x65, 0x0f, 0x22, 0x27, 0xc7, 0x97, 0x35, - 0x0b, 0xab, 0x85, 0xec, 0xa5, 0xd0, 0x43, 0x21, 0x90, 0x36, 0xa1, 0xd4, 0x29, 0x0a, 0x25, 0xd0, - 0x4b, 0x70, 0x6a, 0x35, 0x11, 0xb8, 0x96, 0x2b, 0xcb, 0x69, 0xe9, 0x73, 0xf4, 0x21, 0xfa, 0x58, - 0x7d, 0x94, 0x62, 0x39, 0x09, 0x94, 0x16, 0xda, 0x93, 0xe6, 0x9f, 0x99, 0xef, 0xff, 0x85, 0x10, - 0xf4, 0xe2, 0x5c, 0x2c, 0x73, 0x25, 0xb5, 0xfc, 0x17, 0xe7, 0x82, 0x9a, 0x0a, 0xe3, 0x84, 0x6f, - 0xb5, 0x94, 0x69, 0x41, 0x57, 0xa5, 0x48, 0x13, 0xf9, 0xc4, 0x55, 0xf0, 0xd2, 0x04, 0x67, 0x56, - 0xea, 0xbc, 0xd4, 0xf8, 0x18, 0x5c, 0xc5, 0x6f, 0xa4, 0x4a, 0x0a, 0x82, 0xfc, 0x66, 0xe8, 0x0d, - 0x07, 0xf4, 0x23, 0x40, 0xeb, 0x65, 0xca, 0xcc, 0x26, 0xdb, 0x13, 0xfd, 0xd7, 0x06, 0x38, 0x75, - 0x0f, 0x9f, 0x80, 0x73, 0x2b, 0x78, 0x7a, 0xb0, 0xf9, 0xfd, 0xa5, 0x0d, 0x3d, 0xad, 0xf6, 0xd9, - 0x0e, 0xeb, 0x3f, 0x37, 0xc0, 0x36, 0x1d, 0xfc, 0x0b, 0x5a, 0x9a, 0x3f, 0x6a, 0x82, 0x7c, 0x14, - 0xb6, 0x27, 0x16, 0x33, 0x0a, 0x13, 0x70, 0xb2, 0xf2, 0x6e, 0xc5, 0x15, 0x69, 0xf8, 0x28, 0xb4, - 0x27, 0x16, 0xdb, 0x69, 0x3c, 0x06, 0x9b, 0x2b, 0x25, 0x15, 0x69, 0xfa, 0x28, 0xec, 0x0c, 0xff, - 0x7e, 0x33, 0x99, 0x8e, 0x19, 0x9b, 0xb1, 0x89, 0xc5, 0x6a, 0x1a, 0x1f, 0x41, 0x2b, 0x15, 0x85, - 0x26, 0xb6, 0x8f, 0x42, 0x6f, 0x18, 0x7c, 0xe6, 0xc2, 0x78, 0xce, 0x63, 0xcd, 0x93, 0xb9, 0x56, - 0x22, 0x5b, 0x57, 0x57, 0xab, 0x08, 0x4c, 0xa1, 0x77, 0x5f, 0x4a, 0xcd, 0x97, 0x0f, 0x1b, 0x9e, - 0x2d, 0x73, 0x25, 0x32, 0x2d, 0xb2, 0x35, 0x71, 0x7d, 0x14, 0xfe, 0x60, 0x3f, 0xcd, 0x68, 0xb1, - 0xe1, 0xd9, 0xe5, 0x6e, 0x10, 0x0c, 0xc0, 0x36, 0xd9, 0xd8, 0x03, 0xf7, 0x2a, 0x3a, 0x8f, 0x66, - 0x8b, 0xa8, 0x6b, 0x55, 0xe2, 0x62, 0x3a, 0x9f, 0x4f, 0xa3, 0xb3, 0x2e, 0x1a, 0xb9, 0x60, 0x6f, - 0xe3, 0xb4, 0xe4, 0xc1, 0x1f, 0xe8, 0xbc, 0x4f, 0xc5, 0x04, 0xdc, 0xc2, 0x54, 0xf5, 0x53, 0xb7, - 0xd9, 0x5e, 0x8e, 0xbc, 0xeb, 0xf6, 0xe1, 0x07, 0xac, 0x1c, 0x73, 0xfc, 0x7f, 0x0b, 0x00, 0x00, - 0xff, 0xff, 0xa1, 0xc3, 0xf5, 0x19, 0x15, 0x02, 0x00, 0x00, -} diff --git a/vendor/github.com/bazelbuild/buildtools/api_proto/api.proto b/vendor/github.com/bazelbuild/buildtools/api_proto/api.proto deleted file mode 100644 index 390b960e25f..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/api_proto/api.proto +++ /dev/null @@ -1,44 +0,0 @@ -/* -Copyright 2016 Google 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. -*/ -syntax = "proto3"; - -package devtools.buildozer; - -option go_package = "api_proto"; - -message Output { - repeated Record records = 1; - message Record { - repeated Field fields = 1; - message Field { - oneof value { - string text = 1; - int32 number = 2; - ERROR error = 3; - RepeatedString list = 5; - } - // Used internally by Buildozer to decide whether a field should be quoted - // when printing. This does not affect the contents of 'value'. - bool quote_when_printing = 7; - - enum ERROR { - UNKNOWN = 0; - MISSING = 1; - } - } - } -} - -message RepeatedString { - repeated string strings = 1; -} diff --git a/vendor/github.com/bazelbuild/buildtools/build/BUILD b/vendor/github.com/bazelbuild/buildtools/build/BUILD deleted file mode 100644 index bca95ccc59b..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/build/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "lex.go", - "parse.y.go", - "print.go", - "quote.go", - "rewrite.go", - "rule.go", - "syntax.go", - "walk.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/buildtools/build", - importpath = "github.com/bazelbuild/buildtools/build", - visibility = ["//visibility:public"], - deps = ["//vendor/github.com/bazelbuild/buildtools/tables:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/buildtools/build/build_defs.bzl b/vendor/github.com/bazelbuild/buildtools/build/build_defs.bzl deleted file mode 100644 index 91ac9e9825a..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/build/build_defs.bzl +++ /dev/null @@ -1,133 +0,0 @@ -"""Provides go_yacc and genfile_check_test - -Copyright 2016 Google 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. -""" - -load( - "@io_bazel_rules_go//go/private:providers.bzl", - "GoSource", -) - -_GO_YACC_TOOL = "@org_golang_x_tools//cmd/goyacc" - -def go_yacc(src, out, visibility = None): - """Runs go tool yacc -o $out $src.""" - native.genrule( - name = src + ".go_yacc", - srcs = [src], - outs = [out], - tools = [_GO_YACC_TOOL], - cmd = ("export GOROOT=$$(dirname $(location " + _GO_YACC_TOOL + "))/..;" + - " $(location " + _GO_YACC_TOOL + ") " + - " -o $(location " + out + ") $(SRCS) > /dev/null"), - visibility = visibility, - ) - -def _extract_go_src(ctx): - """Thin rule that exposes the GoSource from a go_library.""" - return [DefaultInfo(files = depset(ctx.attr.library[GoSource].srcs))] - -extract_go_src = rule( - implementation = _extract_go_src, - attrs = { - "library": attr.label( - providers = [GoSource], - ), - }, -) - -def genfile_check_test(src, gen): - """Asserts that any checked-in generated code matches bazel gen.""" - if not src: - fail("src is required", "src") - if not gen: - fail("gen is required", "gen") - native.genrule( - name = src + "_checksh", - outs = [src + "_check.sh"], - cmd = r"""cat >$@ <<'eof' -#!/bin/bash -# Script generated by @com_github_bazelbuild_buildtools//build:build_defs.bzl - -# --- begin runfiles.bash initialization --- -# Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash). -set -euo pipefail -if [[ ! -d "$${RUNFILES_DIR:-/dev/null}" && ! -f "$${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then - if [[ -f "$$0.runfiles_manifest" ]]; then - export RUNFILES_MANIFEST_FILE="$$0.runfiles_manifest" - elif [[ -f "$$0.runfiles/MANIFEST" ]]; then - export RUNFILES_MANIFEST_FILE="$$0.runfiles/MANIFEST" - elif [[ -f "$$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then - export RUNFILES_DIR="$$0.runfiles" - fi -fi -if [[ -f "$${RUNFILES_DIR:-/dev/null}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then - source "$${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash" -elif [[ -f "$${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then - source "$$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \ - "$$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)" -else - echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash" - exit 1 -fi -# --- end runfiles.bash initialization --- - -[[ "$$1" = external/* ]] && F1="$${1#external/}" || F1="$$TEST_WORKSPACE/$$1" -[[ "$$2" = external/* ]] && F2="$${2#external/}" || F2="$$TEST_WORKSPACE/$$2" -F1="$$(rlocation "$$F1")" -F2="$$(rlocation "$$F2")" -diff -q "$$F1" "$$F2" -eof -""", - ) - native.sh_test( - name = src + "_checkshtest", - size = "small", - srcs = [src + "_check.sh"], - deps = ["@bazel_tools//tools/bash/runfiles"], - data = [src, gen], - args = ["$(location " + src + ")", "$(location " + gen + ")"], - ) - - # magic copy rule used to update the checked-in version - native.genrule( - name = src + "_copysh", - srcs = [gen], - outs = [src + "copy.sh"], - cmd = "echo 'cp $${BUILD_WORKSPACE_DIRECTORY}/$(location " + gen + - ") $${BUILD_WORKSPACE_DIRECTORY}/" + native.package_name() + "/" + src + "' > $@", - ) - native.sh_binary( - name = src + "_copy", - srcs = [src + "_copysh"], - data = [gen], - ) - -def go_proto_checkedin_test(src, proto = "go_default_library"): - """Asserts that any checked-in .pb.go code matches bazel gen.""" - genfile = src + "_genfile" - extract_go_src( - name = genfile + "go", - library = proto, - ) - - # TODO(pmbethe09): why is the extra copy needed? - native.genrule( - name = genfile, - srcs = [genfile + "go"], - outs = [genfile + ".go"], - cmd = "cp $< $@", - ) - genfile_check_test(src, genfile) diff --git a/vendor/github.com/bazelbuild/buildtools/build/lex.go b/vendor/github.com/bazelbuild/buildtools/build/lex.go deleted file mode 100644 index 9876b28d1da..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/build/lex.go +++ /dev/null @@ -1,862 +0,0 @@ -/* -Copyright 2016 Google 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. -*/ -// Lexical scanning for BUILD file parser. - -package build - -import ( - "bytes" - "fmt" - "path/filepath" - "sort" - "strings" - "unicode/utf8" -) - -// FileType represents a type of a file (default (for .bzl files), BUILD, or WORKSPACE). -// Certain formatting or refactoring rules can be applied to several file types, so they support -// bitwise operations: `type1 | type2` can represent a scope (e.g. BUILD and WORKSPACE files) and -// `scope & fileType` can be used to check whether a file type belongs to a scope. -type FileType int - -const ( - // TypeDefault represents general Starlark files - TypeDefault FileType = 1 << iota - // TypeBuild represents BUILD files - TypeBuild - // TypeWorkspace represents WORKSPACE files - TypeWorkspace - // TypeBzl represents .bzl files - TypeBzl -) - -func (t FileType) String() string { - switch t { - case TypeDefault: - return "default" - case TypeBuild: - return "BUILD" - case TypeWorkspace: - return "WORKSPACE" - case TypeBzl: - return ".bzl" - } - return "unknown" -} - -// ParseBuild parses a file, marks it as a BUILD file and returns the corresponding parse tree. -// -// The filename is used only for generating error messages. -func ParseBuild(filename string, data []byte) (*File, error) { - in := newInput(filename, data) - f, err := in.parse() - if f != nil { - f.Type = TypeBuild - } - return f, err -} - -// ParseWorkspace parses a file, marks it as a WORKSPACE file and returns the corresponding parse tree. -// -// The filename is used only for generating error messages. -func ParseWorkspace(filename string, data []byte) (*File, error) { - in := newInput(filename, data) - f, err := in.parse() - if f != nil { - f.Type = TypeWorkspace - } - return f, err -} - -// ParseBzl parses a file, marks it as a .bzl file and returns the corresponding parse tree. -// -// The filename is used only for generating error messages. -func ParseBzl(filename string, data []byte) (*File, error) { - in := newInput(filename, data) - f, err := in.parse() - if f != nil { - f.Type = TypeBzl - } - return f, err -} - -// ParseDefault parses a file, marks it as a generic Starlark file and returns the corresponding parse tree. -// -// The filename is used only for generating error messages. -func ParseDefault(filename string, data []byte) (*File, error) { - in := newInput(filename, data) - f, err := in.parse() - if f != nil { - f.Type = TypeDefault - } - return f, err -} - -func getFileType(filename string) FileType { - if filename == "" { // stdin - return TypeDefault - } - basename := strings.ToLower(filepath.Base(filename)) - if strings.HasSuffix(basename, ".oss") { - basename = basename[:len(basename)-4] - } - ext := filepath.Ext(basename) - switch ext { - case ".bzl": - return TypeBzl - case ".sky": - return TypeDefault - } - base := basename[:len(basename)-len(ext)] - switch { - case ext == ".build" || base == "build" || strings.HasPrefix(base, "build."): - return TypeBuild - case ext == ".workspace" || base == "workspace" || strings.HasPrefix(base, "workspace."): - return TypeWorkspace - } - return TypeDefault -} - -// Parse parses the input data and returns the corresponding parse tree. -// -// Uses the filename to detect the formatting type (build, workspace, or default) and calls -// ParseBuild, ParseWorkspace, or ParseDefault correspondingly. -func Parse(filename string, data []byte) (*File, error) { - switch getFileType(filename) { - case TypeBuild: - return ParseBuild(filename, data) - case TypeWorkspace: - return ParseWorkspace(filename, data) - case TypeBzl: - return ParseBzl(filename, data) - } - return ParseDefault(filename, data) -} - -// ParseError contains information about the error encountered during parsing. -type ParseError struct { - Message string - Filename string - Pos Position -} - -// Error returns a string representation of the parse error. -func (e ParseError) Error() string { - filename := e.Filename - if filename == "" { - filename = "" - } - return fmt.Sprintf("%s:%d:%d: %v", filename, e.Pos.Line, e.Pos.LineRune, e.Message) -} - -// An input represents a single input file being parsed. -type input struct { - // Lexing state. - filename string // name of input file, for errors - complete []byte // entire input - remaining []byte // remaining input - token []byte // token being scanned - lastToken string // most recently returned token, for error messages - pos Position // current input position - lineComments []Comment // accumulated line comments - suffixComments []Comment // accumulated suffix comments - depth int // nesting of [ ] { } ( ) - cleanLine bool // true if the current line only contains whitespace before the current position - indent int // current line indentation in spaces - indents []int // stack of indentation levels in spaces - - // Parser state. - file *File // returned top-level syntax tree - parseError error // error encountered during parsing - - // Comment assignment state. - pre []Expr // all expressions, in preorder traversal - post []Expr // all expressions, in postorder traversal -} - -func newInput(filename string, data []byte) *input { - // The syntax requires that each simple statement ends with '\n', however it's optional at EOF. - // If `data` doesn't end with '\n' we add it here to keep parser simple. - // It shouldn't affect neither the parsed tree nor its formatting. - data = append(data, '\n') - - return &input{ - filename: filename, - complete: data, - remaining: data, - pos: Position{Line: 1, LineRune: 1, Byte: 0}, - cleanLine: true, - indents: []int{0}, - } -} - -func (in *input) currentIndent() int { - return in.indents[len(in.indents)-1] -} - -// parse parses the input file. -func (in *input) parse() (f *File, err error) { - // The parser panics for both routine errors like syntax errors - // and for programmer bugs like array index errors. - // Turn both into error returns. Catching bug panics is - // especially important when processing many files. - defer func() { - if e := recover(); e != nil { - if e == in.parseError { - err = in.parseError - } else { - err = ParseError{Message: fmt.Sprintf("internal error: %v", e), Filename: in.filename, Pos: in.pos} - } - } - }() - - // Invoke the parser generated from parse.y. - yyParse(in) - if in.parseError != nil { - return nil, in.parseError - } - in.file.Path = in.filename - - // Assign comments to nearby syntax. - in.assignComments() - - return in.file, nil -} - -// Error is called to report an error. -// When called by the generated code s is always "syntax error". -// Error does not return: it panics. -func (in *input) Error(s string) { - if s == "syntax error" && in.lastToken != "" { - s += " near " + in.lastToken - } - in.parseError = ParseError{Message: s, Filename: in.filename, Pos: in.pos} - panic(in.parseError) -} - -// eof reports whether the input has reached end of file. -func (in *input) eof() bool { - return len(in.remaining) == 0 -} - -// peekRune returns the next rune in the input without consuming it. -func (in *input) peekRune() int { - if len(in.remaining) == 0 { - return 0 - } - r, _ := utf8.DecodeRune(in.remaining) - return int(r) -} - -// readRune consumes and returns the next rune in the input. -func (in *input) readRune() int { - if len(in.remaining) == 0 { - in.Error("internal lexer error: readRune at EOF") - } - r, size := utf8.DecodeRune(in.remaining) - in.remaining = in.remaining[size:] - if r == '\n' { - in.pos.Line++ - in.pos.LineRune = 1 - } else { - in.pos.LineRune++ - } - in.pos.Byte += size - return int(r) -} - -// startToken marks the beginning of the next input token. -// It must be followed by a call to endToken, once the token has -// been consumed using readRune. -func (in *input) startToken(val *yySymType) { - in.token = in.remaining - val.tok = "" - val.pos = in.pos -} - -// yySymType (used in the next few functions) is defined by the -// generated parser. It is a struct containing all the fields listed -// in parse.y's %union [sic] section. - -// endToken marks the end of an input token. -// It records the actual token string in val.tok if the caller -// has not done that already. -func (in *input) endToken(val *yySymType) { - if val.tok == "" { - tok := string(in.token[:len(in.token)-len(in.remaining)]) - val.tok = tok - in.lastToken = val.tok - } -} - -// Lex is called from the generated parser to obtain the next input token. -// It returns the token value (either a rune like '+' or a symbolic token _FOR) -// and sets val to the data associated with the token. -// -// For all our input tokens, the associated data is -// val.Pos (the position where the token begins) -// and val.Token (the input string corresponding to the token). -func (in *input) Lex(val *yySymType) int { - // Skip past spaces, stopping at non-space or EOF. - countNL := 0 // number of newlines we've skipped past - for !in.eof() { - // Skip over spaces. Count newlines so we can give the parser - // information about where top-level blank lines are, - // for top-level comment assignment. - c := in.peekRune() - if c == ' ' || c == '\t' || c == '\r' || c == '\n' { - if c == '\n' { - in.indent = 0 - in.cleanLine = true - if in.depth == 0 { - // Not in a statememt. Tell parser about top-level blank line. - in.startToken(val) - in.readRune() - in.endToken(val) - return '\n' - } - countNL++ - } else if c == ' ' && in.cleanLine { - in.indent++ - } - in.readRune() - continue - } - - // Comment runs to end of line. - if c == '#' { - // If a line contains just a comment its indentation level doesn't matter. - // Reset it to zero. - in.indent = 0 - isLineComment := in.cleanLine - in.cleanLine = true - - // Is this comment the only thing on its line? - // Find the last \n before this # and see if it's all - // spaces from there to here. - // If it's a suffix comment but the last non-space symbol before - // it is one of (, [, or {, or it's a suffix comment to "):" - // (e.g. trailing closing bracket or a function definition), - // treat it as a line comment that should be - // put inside the corresponding block. - i := bytes.LastIndex(in.complete[:in.pos.Byte], []byte("\n")) - prefix := bytes.TrimSpace(in.complete[i+1 : in.pos.Byte]) - prefix = bytes.Replace(prefix, []byte{' '}, []byte{}, -1) - isSuffix := true - if len(prefix) == 0 || - (len(prefix) == 2 && prefix[0] == ')' && prefix[1] == ':') || - prefix[len(prefix)-1] == '[' || - prefix[len(prefix)-1] == '(' || - prefix[len(prefix)-1] == '{' { - isSuffix = false - } - - // Consume comment without the \n it ends with. - in.startToken(val) - for len(in.remaining) > 0 && in.peekRune() != '\n' { - in.readRune() - } - - in.endToken(val) - - val.tok = strings.TrimRight(val.tok, "\n") - in.lastToken = "comment" - - // If we are at top level (not in a rule), hand the comment to - // the parser as a _COMMENT token. The grammar is written - // to handle top-level comments itself. - if in.depth == 0 && isLineComment { - // Not in a statement. Tell parser about top-level comment. - return _COMMENT - } - - // Otherwise, save comment for later attachment to syntax tree. - if countNL > 1 { - in.lineComments = append(in.lineComments, Comment{val.pos, ""}) - } - if isSuffix { - in.suffixComments = append(in.suffixComments, Comment{val.pos, val.tok}) - } else { - in.lineComments = append(in.lineComments, Comment{val.pos, val.tok}) - } - countNL = 0 - continue - } - - if c == '\\' && len(in.remaining) >= 2 && in.remaining[1] == '\n' { - // We can ignore a trailing \ at end of line together with the \n. - in.readRune() - in.readRune() - continue - } - - // Found non-space non-comment. - break - } - - // Check for changes in indentation - // Skip if we're inside a statement, or if there were non-space - // characters before in the current line. - if in.depth == 0 && in.cleanLine { - if in.indent > in.currentIndent() { - // A new indentation block starts - in.indents = append(in.indents, in.indent) - in.lastToken = "indent" - in.cleanLine = false - return _INDENT - } else if in.indent < in.currentIndent() { - // An indentation block ends - in.indents = in.indents[:len(in.indents)-1] - - // It's a syntax error if the current line indentation level in now greater than - // currentIndent(), should be either equal (a parent block continues) or still less - // (need to unindent more). - if in.indent > in.currentIndent() { - in.pos = val.pos - in.Error("unexpected indentation") - } - in.lastToken = "unindent" - return _UNINDENT - } - } - - in.cleanLine = false - - // If the file ends with an indented block, return the corresponding amounts of unindents. - if in.eof() && in.currentIndent() > 0 { - in.indents = in.indents[:len(in.indents)-1] - in.lastToken = "unindent" - return _UNINDENT - } - - // Found the beginning of the next token. - in.startToken(val) - defer in.endToken(val) - - // End of file. - if in.eof() { - in.lastToken = "EOF" - return _EOF - } - - // Punctuation tokens. - switch c := in.peekRune(); c { - case '[', '(', '{': - in.depth++ - in.readRune() - return c - - case ']', ')', '}': - in.depth-- - in.readRune() - return c - - case '.', ':', ';', ',': // single-char tokens - in.readRune() - return c - - case '<', '>', '=', '!', '+', '-', '*', '/', '%', '|', '&', '~', '^': // possibly followed by = - in.readRune() - - if c == '~' { - // unary bitwise not, shouldn't be followed by anything - return c - } - - if c == '*' && in.peekRune() == '*' { - // double asterisk - in.readRune() - return _STAR_STAR - } - - if c == in.peekRune() { - switch c { - case '/': - // integer division - in.readRune() - c = _INT_DIV - case '<': - // left shift - in.readRune() - c = _BIT_LSH - case '>': - // right shift - in.readRune() - c = _BIT_RSH - } - } - - if in.peekRune() == '=' { - in.readRune() - switch c { - case '<': - return _LE - case '>': - return _GE - case '=': - return _EQ - case '!': - return _NE - default: - return _AUGM - } - } - return c - - case 'r': // possible beginning of raw quoted string - if len(in.remaining) < 2 || in.remaining[1] != '"' && in.remaining[1] != '\'' { - break - } - in.readRune() - c = in.peekRune() - fallthrough - - case '"', '\'': // quoted string - quote := c - if len(in.remaining) >= 3 && in.remaining[0] == byte(quote) && in.remaining[1] == byte(quote) && in.remaining[2] == byte(quote) { - // Triple-quoted string. - in.readRune() - in.readRune() - in.readRune() - var c1, c2, c3 int - for { - if in.eof() { - in.pos = val.pos - in.Error("unexpected EOF in string") - } - c1, c2, c3 = c2, c3, in.readRune() - if c1 == quote && c2 == quote && c3 == quote { - break - } - if c3 == '\\' { - if in.eof() { - in.pos = val.pos - in.Error("unexpected EOF in string") - } - in.readRune() - } - } - } else { - in.readRune() - for { - if in.eof() { - in.pos = val.pos - in.Error("unexpected EOF in string") - } - if in.peekRune() == '\n' { - in.Error("unexpected newline in string") - } - c := in.readRune() - if c == quote { - break - } - if c == '\\' { - if in.eof() { - in.pos = val.pos - in.Error("unexpected EOF in string") - } - in.readRune() - } - } - } - in.endToken(val) - s, triple, err := Unquote(val.tok) - if err != nil { - in.Error(fmt.Sprint(err)) - } - val.str = s - val.triple = triple - return _STRING - } - - // Checked all punctuation. Must be identifier token. - if c := in.peekRune(); !isIdent(c) { - in.Error(fmt.Sprintf("unexpected input character %#q", c)) - } - - // Scan over alphanumeric identifier. - for { - c := in.peekRune() - if !isIdent(c) { - break - } - in.readRune() - } - - // Call endToken to set val.tok to identifier we just scanned, - // so we can look to see if val.tok is a keyword. - in.endToken(val) - if k := keywordToken[val.tok]; k != 0 { - return k - } - switch val.tok { - case "pass": - return _PASS - case "break": - return _BREAK - case "continue": - return _CONTINUE - } - if len(val.tok) > 0 && val.tok[0] >= '0' && val.tok[0] <= '9' { - return _NUMBER - } - return _IDENT -} - -// isIdent reports whether c is an identifier rune. -// We treat all non-ASCII runes as identifier runes. -func isIdent(c int) bool { - return '0' <= c && c <= '9' || - 'A' <= c && c <= 'Z' || - 'a' <= c && c <= 'z' || - c == '_' || - c >= 0x80 -} - -// keywordToken records the special tokens for -// strings that should not be treated as ordinary identifiers. -var keywordToken = map[string]int{ - "and": _AND, - "for": _FOR, - "if": _IF, - "else": _ELSE, - "elif": _ELIF, - "in": _IN, - "is": _IS, - "lambda": _LAMBDA, - "load": _LOAD, - "not": _NOT, - "or": _OR, - "def": _DEF, - "return": _RETURN, -} - -// Comment assignment. -// We build two lists of all subexpressions, preorder and postorder. -// The preorder list is ordered by start location, with outer expressions first. -// The postorder list is ordered by end location, with outer expressions last. -// We use the preorder list to assign each whole-line comment to the syntax -// immediately following it, and we use the postorder list to assign each -// end-of-line comment to the syntax immediately preceding it. - -// order walks the expression adding it and its subexpressions to the -// preorder and postorder lists. -func (in *input) order(v Expr) { - if v != nil { - in.pre = append(in.pre, v) - } - switch v := v.(type) { - default: - panic(fmt.Errorf("order: unexpected type %T", v)) - case nil: - // nothing - case *End: - // nothing - case *File: - for _, stmt := range v.Stmt { - in.order(stmt) - } - case *CommentBlock: - // nothing - case *CallExpr: - in.order(v.X) - for _, x := range v.List { - in.order(x) - } - in.order(&v.End) - case *LoadStmt: - in.order(v.Module) - for i := range v.From { - in.order(v.To[i]) - in.order(v.From[i]) - } - in.order(&v.Rparen) - case *LiteralExpr: - // nothing - case *StringExpr: - // nothing - case *Ident: - // nothing - case *BranchStmt: - // nothing - case *DotExpr: - in.order(v.X) - case *ListExpr: - for _, x := range v.List { - in.order(x) - } - in.order(&v.End) - case *Comprehension: - in.order(v.Body) - for _, c := range v.Clauses { - in.order(c) - } - in.order(&v.End) - case *SetExpr: - for _, x := range v.List { - in.order(x) - } - in.order(&v.End) - case *ForClause: - in.order(v.Vars) - in.order(v.X) - case *IfClause: - in.order(v.Cond) - case *KeyValueExpr: - in.order(v.Key) - in.order(v.Value) - case *DictExpr: - for _, x := range v.List { - in.order(x) - } - in.order(&v.End) - case *TupleExpr: - for _, x := range v.List { - in.order(x) - } - if !v.NoBrackets { - in.order(&v.End) - } - case *UnaryExpr: - in.order(v.X) - case *BinaryExpr: - in.order(v.X) - in.order(v.Y) - case *AssignExpr: - in.order(v.LHS) - in.order(v.RHS) - case *ConditionalExpr: - in.order(v.Then) - in.order(v.Test) - in.order(v.Else) - case *ParenExpr: - in.order(v.X) - in.order(&v.End) - case *SliceExpr: - in.order(v.X) - in.order(v.From) - in.order(v.To) - in.order(v.Step) - case *IndexExpr: - in.order(v.X) - in.order(v.Y) - case *LambdaExpr: - for _, param := range v.Params { - in.order(param) - } - for _, expr := range v.Body { - in.order(expr) - } - case *ReturnStmt: - if v.Result != nil { - in.order(v.Result) - } - case *DefStmt: - for _, x := range v.Params { - in.order(x) - } - for _, x := range v.Body { - in.order(x) - } - case *ForStmt: - in.order(v.Vars) - in.order(v.X) - for _, x := range v.Body { - in.order(x) - } - case *IfStmt: - in.order(v.Cond) - for _, s := range v.True { - in.order(s) - } - if len(v.False) > 0 { - in.order(&v.ElsePos) - } - for _, s := range v.False { - in.order(s) - } - } - if v != nil { - in.post = append(in.post, v) - } -} - -// assignComments attaches comments to nearby syntax. -func (in *input) assignComments() { - // Generate preorder and postorder lists. - in.order(in.file) - in.assignSuffixComments() - in.assignLineComments() -} - -func (in *input) assignSuffixComments() { - // Assign suffix comments to syntax immediately before. - suffix := in.suffixComments - for i := len(in.post) - 1; i >= 0; i-- { - x := in.post[i] - - // Do not assign suffix comments to file or to block statements - switch x.(type) { - case *File, *DefStmt, *IfStmt, *ForStmt, *CommentBlock: - continue - } - - _, end := x.Span() - xcom := x.Comment() - for len(suffix) > 0 && end.Byte <= suffix[len(suffix)-1].Start.Byte { - xcom.Suffix = append(xcom.Suffix, suffix[len(suffix)-1]) - suffix = suffix[:len(suffix)-1] - } - } - - // We assigned suffix comments in reverse. - // If multiple suffix comments were appended to the same - // expression node, they are now in reverse. Fix that. - for _, x := range in.post { - reverseComments(x.Comment().Suffix) - } - - // Remaining suffix comments go at beginning of file. - in.file.Before = append(in.file.Before, suffix...) -} - -func (in *input) assignLineComments() { - // Assign line comments to syntax immediately following. - line := in.lineComments - for _, x := range in.pre { - start, _ := x.Span() - xcom := x.Comment() - for len(line) > 0 && start.Byte >= line[0].Start.Byte { - xcom.Before = append(xcom.Before, line[0]) - line = line[1:] - } - // Line comments can be sorted in a wrong order because they get assigned from different - // parts of the lexer and the parser. Restore the original order. - sort.SliceStable(xcom.Before, func(i, j int) bool { - return xcom.Before[i].Start.Byte < xcom.Before[j].Start.Byte - }) - } - - // Remaining line comments go at end of file. - in.file.After = append(in.file.After, line...) -} - -// reverseComments reverses the []Comment list. -func reverseComments(list []Comment) { - for i, j := 0, len(list)-1; i < j; i, j = i+1, j-1 { - list[i], list[j] = list[j], list[i] - } -} diff --git a/vendor/github.com/bazelbuild/buildtools/build/parse.y b/vendor/github.com/bazelbuild/buildtools/build/parse.y deleted file mode 100644 index aa7590ebe51..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/build/parse.y +++ /dev/null @@ -1,1217 +0,0 @@ -// BUILD file parser. - -// This is a yacc grammar. Its lexer is in lex.go. -// -// For a good introduction to writing yacc grammars, see -// Kernighan and Pike's book The Unix Programming Environment. -// -// The definitive yacc manual is -// Stephen C. Johnson and Ravi Sethi, "Yacc: A Parser Generator", -// online at http://plan9.bell-labs.com/sys/doc/yacc.pdf. - -%{ -package build -%} - -// The generated parser puts these fields in a struct named yySymType. -// (The name %union is historical, but it is inaccurate for Go.) -%union { - // input tokens - tok string // raw input syntax - str string // decoding of quoted string - pos Position // position of token - triple bool // was string triple quoted? - - // partial syntax trees - expr Expr - exprs []Expr - string *StringExpr - strings []*StringExpr - ifstmt *IfStmt - loadarg *struct{from Ident; to Ident} - loadargs []*struct{from Ident; to Ident} - - // supporting information - comma Position // position of trailing comma in list, if present - lastStmt Expr // most recent rule, to attach line comments to -} - -// These declarations set the type for a $ reference ($$, $1, $2, ...) -// based on the kind of symbol it refers to. Other fields can be referred -// to explicitly, as in $1. -// -// %token is for input tokens generated by the lexer. -// %type is for higher-level grammar rules defined here. -// -// It is possible to put multiple tokens per line, but it is easier to -// keep ordered using a sparser one-per-line list. - -%token '%' -%token '(' -%token ')' -%token '*' -%token '+' -%token ',' -%token '-' -%token '.' -%token '/' -%token ':' -%token '<' -%token '=' -%token '>' -%token '[' -%token ']' -%token '{' -%token '}' -%token '|' -%token '&' -%token '^' -%token '~' - -// By convention, yacc token names are all caps. -// However, we do not want to export them from the Go package -// we are creating, so prefix them all with underscores. - -%token _AUGM // augmented assignment -%token _AND // keyword and -%token _COMMENT // top-level # comment -%token _EOF // end of file -%token _EQ // operator == -%token _FOR // keyword for -%token _GE // operator >= -%token _IDENT // non-keyword identifier -%token _NUMBER // number -%token _IF // keyword if -%token _ELSE // keyword else -%token _ELIF // keyword elif -%token _IN // keyword in -%token _IS // keyword is -%token _LAMBDA // keyword lambda -%token _LOAD // keyword load -%token _LE // operator <= -%token _NE // operator != -%token _STAR_STAR // operator ** -%token _INT_DIV // operator // -%token _BIT_LSH // bitwise operator << -%token _BIT_RSH // bitwise operator >> -%token _NOT // keyword not -%token _OR // keyword or -%token _STRING // quoted string -%token _DEF // keyword def -%token _RETURN // keyword return -%token _PASS // keyword pass -%token _BREAK // keyword break -%token _CONTINUE // keyword continue -%token _INDENT // indentation -%token _UNINDENT // unindentation - -%type comma_opt -%type argument -%type arguments -%type arguments_opt -%type parameter -%type parameters -%type parameters_opt -%type test -%type test_opt -%type tests_opt -%type primary_expr -%type expr -%type expr_opt -%type tests -%type exprs -%type exprs_opt -%type loop_vars -%type for_clause -%type for_clause_with_if_clauses_opt -%type for_clauses_with_if_clauses_opt -%type ident -%type number -%type stmts -%type stmt // a simple_stmt or a for/if/def block -%type block_stmt // a single for/if/def statement -%type if_else_block // a complete if-elif-else block -%type if_chain // an elif-elif-else chain -%type elif // `elif` or `else if` token(s) -%type simple_stmt // One or many small_stmts on one line, e.g. 'a = f(x); return str(a)' -%type small_stmt // A single statement, e.g. 'a = f(x)' -%type small_stmts_continuation // A sequence of `';' small_stmt` -%type keyvalue -%type keyvalues -%type keyvalues_no_comma -%type string -%type strings -%type suite -%type comments -%type load_argument -%type load_arguments - -// Operator precedence. -// Operators listed lower in the table bind tighter. - -// We tag rules with this fake, low precedence to indicate -// that when the rule is involved in a shift/reduce -// conflict, we prefer that the parser shift (try for a longer parse). -// Shifting is the default resolution anyway, but stating it explicitly -// silences yacc's warning for that specific case. -%left ShiftInstead - -%left '\n' -%left _ASSERT -// '=' and augmented assignments have the lowest precedence -// e.g. "x = a if c > 0 else 'bar'" -// followed by -// 'if' and 'else' which have lower precedence than all other operators. -// e.g. "a, b if c > 0 else 'foo'" is either a tuple of (a,b) or 'foo' -// and not a tuple of "(a, (b if ... ))" -%left '=' _AUGM -%left _IF _ELSE _ELIF -%left ',' -%left ':' -%left _IS -%left _OR -%left _AND -%left '<' '>' _EQ _NE _LE _GE _NOT _IN -%left '|' -%left '^' -%left '&' -%left _BIT_LSH _BIT_RSH -%left '+' '-' -%left '*' '/' '%' _INT_DIV -%left '.' '[' '(' -%right _UNARY -%left _STRING - -%% - -// Grammar rules. -// -// A note on names: if foo is a rule, then foos is a sequence of foos -// (with interleaved commas or other syntax as appropriate) -// and foo_opt is an optional foo. - -file: - stmts _EOF - { - yylex.(*input).file = &File{Stmt: $1} - return 0 - } - -suite: - '\n' comments _INDENT stmts _UNINDENT - { - statements := $4 - if $2 != nil { - // $2 can only contain *CommentBlock objects, each of them contains a non-empty After slice - cb := $2[len($2)-1].(*CommentBlock) - // $4 can't be empty and can't start with a comment - stmt := $4[0] - start, _ := stmt.Span() - if start.Line - cb.After[len(cb.After)-1].Start.Line == 1 { - // The first statement of $4 starts on the next line after the last comment of $2. - // Attach the last comment to the first statement - stmt.Comment().Before = cb.After - $2 = $2[:len($2)-1] - } - statements = append($2, $4...) - } - $$ = statements - $$ = $4 - } -| simple_stmt linebreaks_opt - { - $$ = $1 - } - -linebreaks_opt: -| linebreaks_opt '\n' - -comments: - { - $$ = nil - $$ = nil - } -| comments _COMMENT '\n' - { - $$ = $1 - $$ = $1 - if $$ == nil { - cb := &CommentBlock{Start: $2} - $$ = append($$, cb) - $$ = cb - } - com := $$.Comment() - com.After = append(com.After, Comment{Start: $2, Token: $2}) - } -| comments '\n' - { - $$ = $1 - $$ = nil - } - -stmts: - { - $$ = nil - $$ = nil - } -| stmts stmt - { - // If this statement follows a comment block, - // attach the comments to the statement. - if cb, ok := $1.(*CommentBlock); ok { - $$ = append($1[:len($1)-1], $2...) - $2[0].Comment().Before = cb.After - $$ = $2 - break - } - - // Otherwise add to list. - $$ = append($1, $2...) - $$ = $2 - - // Consider this input: - // - // foo() - // # bar - // baz() - // - // If we've just parsed baz(), the # bar is attached to - // foo() as an After comment. Make it a Before comment - // for baz() instead. - if x := $1; x != nil { - com := x.Comment() - // stmt is never empty - $2[0].Comment().Before = com.After - com.After = nil - } - } -| stmts '\n' - { - // Blank line; sever last rule from future comments. - $$ = $1 - $$ = nil - } -| stmts _COMMENT '\n' - { - $$ = $1 - $$ = $1 - if $$ == nil { - cb := &CommentBlock{Start: $2} - $$ = append($$, cb) - $$ = cb - } - com := $$.Comment() - com.After = append(com.After, Comment{Start: $2, Token: $2}) - } - -stmt: - simple_stmt - { - $$ = $1 - $$ = $1[len($1)-1] - } -| block_stmt - { - $$ = []Expr{$1} - $$ = $1 - if cbs := extractTrailingComments($1); len(cbs) > 0 { - $$ = append($$, cbs...) - $$ = cbs[len(cbs)-1] - if $1 == nil { - $$ = nil - } - } - } - -block_stmt: - _DEF _IDENT '(' parameters_opt ')' ':' suite - { - $$ = &DefStmt{ - Function: Function{ - StartPos: $1, - Params: $4, - Body: $7, - }, - Name: $2, - ColonPos: $6, - ForceCompact: forceCompact($3, $4, $5), - ForceMultiLine: forceMultiLine($3, $4, $5), - } - $$ = $7 - } -| _FOR loop_vars _IN expr ':' suite - { - $$ = &ForStmt{ - For: $1, - Vars: $2, - X: $4, - Body: $6, - } - $$ = $6 - } -| if_else_block - { - $$ = $1 - $$ = $1 - } - -// One or several if-elif-elif statements -if_chain: - _IF expr ':' suite - { - $$ = &IfStmt{ - If: $1, - Cond: $2, - True: $4, - } - $$ = $4 - } -| if_chain elif expr ':' suite - { - $$ = $1 - inner := $1 - for len(inner.False) == 1 { - inner = inner.False[0].(*IfStmt) - } - inner.ElsePos = End{Pos: $2} - inner.False = []Expr{ - &IfStmt{ - If: $2, - Cond: $3, - True: $5, - }, - } - $$ = $5 - } - -// A complete if-elif-elif-else chain -if_else_block: - if_chain -| if_chain _ELSE ':' suite - { - $$ = $1 - inner := $1 - for len(inner.False) == 1 { - inner = inner.False[0].(*IfStmt) - } - inner.ElsePos = End{Pos: $2} - inner.False = $4 - $$ = $4 - } - -elif: - _ELSE _IF -| _ELIF - -simple_stmt: - small_stmt small_stmts_continuation semi_opt '\n' - { - $$ = append([]Expr{$1}, $2...) - $$ = $$[len($$)-1] - } - -small_stmts_continuation: - { - $$ = []Expr{} - } -| small_stmts_continuation ';' small_stmt - { - $$ = append($1, $3) - } - -small_stmt: - expr %prec ShiftInstead -| _RETURN expr - { - $$ = &ReturnStmt{ - Return: $1, - Result: $2, - } - } -| _RETURN - { - $$ = &ReturnStmt{ - Return: $1, - } - } -| expr '=' expr { $$ = binary($1, $2, $2, $3) } -| expr _AUGM expr { $$ = binary($1, $2, $2, $3) } -| _PASS - { - $$ = &BranchStmt{ - Token: $1, - TokenPos: $1, - } - } -| _BREAK - { - $$ = &BranchStmt{ - Token: $1, - TokenPos: $1, - } - } -| _CONTINUE - { - $$ = &BranchStmt{ - Token: $1, - TokenPos: $1, - } - } - -semi_opt: -| ';' - -primary_expr: - ident -| number -| primary_expr '.' _IDENT - { - $$ = &DotExpr{ - X: $1, - Dot: $2, - NamePos: $3, - Name: $3, - } - } -| _LOAD '(' string ',' load_arguments comma_opt ')' - { - load := &LoadStmt{ - Load: $1, - Module: $3, - Rparen: End{Pos: $7}, - ForceCompact: $1.Line == $7.Line, - } - for _, arg := range $5 { - load.From = append(load.From, &arg.from) - load.To = append(load.To, &arg.to) - } - $$ = load - } -| primary_expr '(' arguments_opt ')' - { - $$ = &CallExpr{ - X: $1, - ListStart: $2, - List: $3, - End: End{Pos: $4}, - ForceCompact: forceCompact($2, $3, $4), - ForceMultiLine: forceMultiLine($2, $3, $4), - } - } -| primary_expr '[' expr ']' - { - $$ = &IndexExpr{ - X: $1, - IndexStart: $2, - Y: $3, - End: $4, - } - } -| primary_expr '[' expr_opt ':' test_opt ']' - { - $$ = &SliceExpr{ - X: $1, - SliceStart: $2, - From: $3, - FirstColon: $4, - To: $5, - End: $6, - } - } -| primary_expr '[' expr_opt ':' test_opt ':' test_opt ']' - { - $$ = &SliceExpr{ - X: $1, - SliceStart: $2, - From: $3, - FirstColon: $4, - To: $5, - SecondColon: $6, - Step: $7, - End: $8, - } - } -| strings %prec ShiftInstead - { - if len($1) == 1 { - $$ = $1[0] - break - } - $$ = $1[0] - for _, x := range $1[1:] { - _, end := $$.Span() - $$ = binary($$, end, "+", x) - } - } -| '[' tests_opt ']' - { - $$ = &ListExpr{ - Start: $1, - List: $2, - End: End{Pos: $3}, - ForceMultiLine: forceMultiLine($1, $2, $3), - } - } -| '[' test for_clauses_with_if_clauses_opt ']' - { - $$ = &Comprehension{ - Curly: false, - Lbrack: $1, - Body: $2, - Clauses: $3, - End: End{Pos: $4}, - ForceMultiLine: forceMultiLineComprehension($1, $2, $3, $4), - } - } -| '{' keyvalue for_clauses_with_if_clauses_opt '}' - { - $$ = &Comprehension{ - Curly: true, - Lbrack: $1, - Body: $2, - Clauses: $3, - End: End{Pos: $4}, - ForceMultiLine: forceMultiLineComprehension($1, $2, $3, $4), - } - } -| '{' keyvalues '}' - { - $$ = &DictExpr{ - Start: $1, - List: $2, - End: End{Pos: $3}, - ForceMultiLine: forceMultiLine($1, $2, $3), - } - } -| '{' tests comma_opt '}' // TODO: remove, not supported - { - $$ = &SetExpr{ - Start: $1, - List: $2, - End: End{Pos: $4}, - ForceMultiLine: forceMultiLine($1, $2, $4), - } - } -| '(' tests_opt ')' - { - if len($2) == 1 && $2.Line == 0 { - // Just a parenthesized expression, not a tuple. - $$ = &ParenExpr{ - Start: $1, - X: $2[0], - End: End{Pos: $3}, - ForceMultiLine: forceMultiLine($1, $2, $3), - } - } else { - $$ = &TupleExpr{ - Start: $1, - List: $2, - End: End{Pos: $3}, - ForceCompact: forceCompact($1, $2, $3), - ForceMultiLine: forceMultiLine($1, $2, $3), - } - } - } - -arguments_opt: - { - $$ = nil - } -| arguments comma_opt - { - $$ = $1 - } - -arguments: - argument - { - $$ = []Expr{$1} - } -| arguments ',' argument - { - $$ = append($1, $3) - } - -argument: - test -| ident '=' test - { - $$ = binary($1, $2, $2, $3) - } -| '*' test - { - $$ = unary($1, $1, $2) - } -| _STAR_STAR test - { - $$ = unary($1, $1, $2) - } - -load_arguments: - load_argument { - $$ = []*struct{from Ident; to Ident}{$1} - } -| load_arguments ',' load_argument - { - $1 = append($1, $3) - $$ = $1 - } - -load_argument: - string { - start := $1.Start.add("'") - if $1.TripleQuote { - start = start.add("''") - } - $$ = &struct{from Ident; to Ident}{ - from: Ident{ - Name: $1.Value, - NamePos: start, - }, - to: Ident{ - Name: $1.Value, - NamePos: start, - }, - } - } -| ident '=' string - { - start := $3.Start.add("'") - if $3.TripleQuote { - start = start.add("''") - } - $$ = &struct{from Ident; to Ident}{ - from: Ident{ - Name: $3.Value, - NamePos: start, - }, - to: *$1.(*Ident), - } - } - -parameters_opt: - { - $$ = nil - } -| parameters comma_opt - { - $$ = $1 - } - -parameters: - parameter - { - $$ = []Expr{$1} - } -| parameters ',' parameter - { - $$ = append($1, $3) - } - -parameter: - ident -| ident '=' test - { - $$ = binary($1, $2, $2, $3) - } -| '*' ident - { - $$ = unary($1, $1, $2) - } -| '*' - { - $$ = unary($1, $1, nil) - } -| _STAR_STAR ident - { - $$ = unary($1, $1, $2) - } - -expr: - test -| expr ',' test - { - tuple, ok := $1.(*TupleExpr) - if !ok || !tuple.NoBrackets { - tuple = &TupleExpr{ - List: []Expr{$1}, - NoBrackets: true, - ForceCompact: true, - ForceMultiLine: false, - } - } - tuple.List = append(tuple.List, $3) - $$ = tuple - } - -expr_opt: - { - $$ = nil - } -| expr - -exprs: - expr - { - $$ = []Expr{$1} - } -| exprs ',' expr - { - $$ = append($1, $3) - } - -exprs_opt: - { - $$ = nil - } -| exprs comma_opt - { - $$ = $1 - } - -test: - primary_expr -| _LAMBDA exprs_opt ':' expr // TODO: remove, not supported - { - $$ = &LambdaExpr{ - Function: Function{ - StartPos: $1, - Params: $2, - Body: []Expr{$4}, - }, - } - } -| _NOT test %prec _UNARY { $$ = unary($1, $1, $2) } -| '-' test %prec _UNARY { $$ = unary($1, $1, $2) } -| '+' test %prec _UNARY { $$ = unary($1, $1, $2) } -| '~' test %prec _UNARY { $$ = unary($1, $1, $2) } -| test '*' test { $$ = binary($1, $2, $2, $3) } -| test '%' test { $$ = binary($1, $2, $2, $3) } -| test '/' test { $$ = binary($1, $2, $2, $3) } -| test _INT_DIV test { $$ = binary($1, $2, $2, $3) } -| test '+' test { $$ = binary($1, $2, $2, $3) } -| test '-' test { $$ = binary($1, $2, $2, $3) } -| test '<' test { $$ = binary($1, $2, $2, $3) } -| test '>' test { $$ = binary($1, $2, $2, $3) } -| test _EQ test { $$ = binary($1, $2, $2, $3) } -| test _LE test { $$ = binary($1, $2, $2, $3) } -| test _NE test { $$ = binary($1, $2, $2, $3) } -| test _GE test { $$ = binary($1, $2, $2, $3) } -| test _IN test { $$ = binary($1, $2, $2, $3) } -| test _NOT _IN test { $$ = binary($1, $2, "not in", $4) } -| test _OR test { $$ = binary($1, $2, $2, $3) } -| test _AND test { $$ = binary($1, $2, $2, $3) } -| test '|' test { $$ = binary($1, $2, $2, $3) } -| test '&' test { $$ = binary($1, $2, $2, $3) } -| test '^' test { $$ = binary($1, $2, $2, $3) } -| test _BIT_LSH test { $$ = binary($1, $2, $2, $3) } -| test _BIT_RSH test { $$ = binary($1, $2, $2, $3) } -| test _IS test - { - if b, ok := $3.(*UnaryExpr); ok && b.Op == "not" { - $$ = binary($1, $2, "is not", b.X) - } else { - $$ = binary($1, $2, $2, $3) - } - } -| test _IF test _ELSE test - { - $$ = &ConditionalExpr{ - Then: $1, - IfStart: $2, - Test: $3, - ElseStart: $4, - Else: $5, - } - } - -tests: - test - { - $$ = []Expr{$1} - } -| tests ',' test - { - $$ = append($1, $3) - } - -test_opt: - { - $$ = nil - } -| test - -tests_opt: - { - $$, $$ = nil, Position{} - } -| tests comma_opt - { - $$, $$ = $1, $2 - } - -// comma_opt is an optional comma. If the comma is present, -// the rule's value is the position of the comma. Otherwise -// the rule's value is the zero position. Tracking this -// lets us distinguish (x) and (x,). -comma_opt: - { - $$ = Position{} - } -| ',' - -keyvalue: - test ':' test { - $$ = &KeyValueExpr{ - Key: $1, - Colon: $2, - Value: $3, - } - } - -keyvalues_no_comma: - keyvalue - { - $$ = []Expr{$1} - } -| keyvalues_no_comma ',' keyvalue - { - $$ = append($1, $3) - } - -keyvalues: - { - $$ = nil - } -| keyvalues_no_comma - { - $$ = $1 - } -| keyvalues_no_comma ',' - { - $$ = $1 - } - -loop_vars: - primary_expr -| loop_vars ',' primary_expr - { - tuple, ok := $1.(*TupleExpr) - if !ok || !tuple.NoBrackets { - tuple = &TupleExpr{ - List: []Expr{$1}, - NoBrackets: true, - ForceCompact: true, - ForceMultiLine: false, - } - } - tuple.List = append(tuple.List, $3) - $$ = tuple - } - -string: - _STRING - { - $$ = &StringExpr{ - Start: $1, - Value: $1, - TripleQuote: $1, - End: $1.add($1), - Token: $1, - } - } - -strings: - string - { - $$ = []*StringExpr{$1} - } -| strings string - { - $$ = append($1, $2) - } - -ident: - _IDENT - { - $$ = &Ident{NamePos: $1, Name: $1} - } - -number: - _NUMBER - { - $$ = &LiteralExpr{Start: $1, Token: $1} - } - -for_clause: - _FOR loop_vars _IN test - { - $$ = &ForClause{ - For: $1, - Vars: $2, - In: $3, - X: $4, - } - } - -for_clause_with_if_clauses_opt: - for_clause { - $$ = []Expr{$1} - } -| for_clause_with_if_clauses_opt _IF test { - $$ = append($1, &IfClause{ - If: $2, - Cond: $3, - }) - } - -for_clauses_with_if_clauses_opt: - for_clause_with_if_clauses_opt - { - $$ = $1 - } -| for_clauses_with_if_clauses_opt for_clause_with_if_clauses_opt { - $$ = append($1, $2...) - } - -%% - -// Go helper code. - -// unary returns a unary expression with the given -// position, operator, and subexpression. -func unary(pos Position, op string, x Expr) Expr { - return &UnaryExpr{ - OpStart: pos, - Op: op, - X: x, - } -} - -// binary returns a binary expression with the given -// operands, position, and operator. -func binary(x Expr, pos Position, op string, y Expr) Expr { - _, xend := x.Span() - ystart, _ := y.Span() - - switch op { - case "=", "+=", "-=", "*=", "/=", "//=", "%=", "|=": - return &AssignExpr{ - LHS: x, - OpPos: pos, - Op: op, - LineBreak: xend.Line < ystart.Line, - RHS: y, - } - } - - return &BinaryExpr{ - X: x, - OpStart: pos, - Op: op, - LineBreak: xend.Line < ystart.Line, - Y: y, - } -} - -// isSimpleExpression returns whether an expression is simple and allowed to exist in -// compact forms of sequences. -// The formal criteria are the following: an expression is considered simple if it's -// a literal (variable, string or a number), a literal with a unary operator or an empty sequence. -func isSimpleExpression(expr *Expr) bool { - switch x := (*expr).(type) { - case *LiteralExpr, *StringExpr, *Ident: - return true - case *UnaryExpr: - _, literal := x.X.(*LiteralExpr) - _, ident := x.X.(*Ident) - return literal || ident - case *ListExpr: - return len(x.List) == 0 - case *TupleExpr: - return len(x.List) == 0 - case *DictExpr: - return len(x.List) == 0 - case *SetExpr: - return len(x.List) == 0 - default: - return false - } -} - -// forceCompact returns the setting for the ForceCompact field for a call or tuple. -// -// NOTE 1: The field is called ForceCompact, not ForceSingleLine, -// because it only affects the formatting associated with the call or tuple syntax, -// not the formatting of the arguments. For example: -// -// call([ -// 1, -// 2, -// 3, -// ]) -// -// is still a compact call even though it runs on multiple lines. -// -// In contrast the multiline form puts a linebreak after the (. -// -// call( -// [ -// 1, -// 2, -// 3, -// ], -// ) -// -// NOTE 2: Because of NOTE 1, we cannot use start and end on the -// same line as a signal for compact mode: the formatting of an -// embedded list might move the end to a different line, which would -// then look different on rereading and cause buildifier not to be -// idempotent. Instead, we have to look at properties guaranteed -// to be preserved by the reformatting, namely that the opening -// paren and the first expression are on the same line and that -// each subsequent expression begins on the same line as the last -// one ended (no line breaks after comma). -func forceCompact(start Position, list []Expr, end Position) bool { - if len(list) <= 1 { - // The call or tuple will probably be compact anyway; don't force it. - return false - } - - // If there are any named arguments or non-string, non-literal - // arguments, cannot force compact mode. - line := start.Line - for _, x := range list { - start, end := x.Span() - if start.Line != line { - return false - } - line = end.Line - if !isSimpleExpression(&x) { - return false - } - } - return end.Line == line -} - -// forceMultiLine returns the setting for the ForceMultiLine field. -func forceMultiLine(start Position, list []Expr, end Position) bool { - if len(list) > 1 { - // The call will be multiline anyway, because it has multiple elements. Don't force it. - return false - } - - if len(list) == 0 { - // Empty list: use position of brackets. - return start.Line != end.Line - } - - // Single-element list. - // Check whether opening bracket is on different line than beginning of - // element, or closing bracket is on different line than end of element. - elemStart, elemEnd := list[0].Span() - return start.Line != elemStart.Line || end.Line != elemEnd.Line -} - -// forceMultiLineComprehension returns the setting for the ForceMultiLine field for a comprehension. -func forceMultiLineComprehension(start Position, expr Expr, clauses []Expr, end Position) bool { - // Return true if there's at least one line break between start, expr, each clause, and end - exprStart, exprEnd := expr.Span() - if start.Line != exprStart.Line { - return true - } - previousEnd := exprEnd - for _, clause := range clauses { - clauseStart, clauseEnd := clause.Span() - if previousEnd.Line != clauseStart.Line { - return true - } - previousEnd = clauseEnd - } - return previousEnd.Line != end.Line -} - -// extractTrailingComments extracts trailing comments of an indented block starting with the first -// comment line with indentation less than the block indentation. -// The comments can either belong to CommentBlock statements or to the last non-comment statement -// as After-comments. -func extractTrailingComments(stmt Expr) []Expr { - body := getLastBody(stmt) - var comments []Expr - if body != nil && len(*body) > 0 { - // Get the current indentation level - start, _ := (*body)[0].Span() - indentation := start.LineRune - - // Find the last non-comment statement - lastNonCommentIndex := -1 - for i, stmt := range *body { - if _, ok := stmt.(*CommentBlock); !ok { - lastNonCommentIndex = i - } - } - if lastNonCommentIndex == -1 { - return comments - } - - // Iterate over the trailing comments, find the first comment line that's not indented enough, - // dedent it and all the following comments. - for i := lastNonCommentIndex; i < len(*body); i++ { - stmt := (*body)[i] - if comment := extractDedentedComment(stmt, indentation); comment != nil { - // This comment and all the following CommentBlock statements are to be extracted. - comments = append(comments, comment) - comments = append(comments, (*body)[i+1:]...) - *body = (*body)[:i+1] - // If the current statement is a CommentBlock statement without any comment lines - // it should be removed too. - if i > lastNonCommentIndex && len(stmt.Comment().After) == 0 { - *body = (*body)[:i] - } - } - } - } - return comments -} - -// extractDedentedComment extract the first comment line from `stmt` which indentation is smaller -// than `indentation`, and all following comment lines, and returns them in a newly created -// CommentBlock statement. -func extractDedentedComment(stmt Expr, indentation int) Expr { - for i, line := range stmt.Comment().After { - // line.Start.LineRune == 0 can't exist in parsed files, it indicates that the comment line - // has been added by an AST modification. Don't take such lines into account. - if line.Start.LineRune > 0 && line.Start.LineRune < indentation { - // This and all the following lines should be dedented - cb := &CommentBlock{ - Start: line.Start, - Comments: Comments{After: stmt.Comment().After[i:]}, - } - stmt.Comment().After = stmt.Comment().After[:i] - return cb - } - } - return nil -} - -// getLastBody returns the last body of a block statement (the only body for For- and DefStmt -// objects, the last in a if-elif-else chain -func getLastBody(stmt Expr) *[]Expr { - switch block := stmt.(type) { - case *DefStmt: - return &block.Body - case *ForStmt: - return &block.Body - case *IfStmt: - if len(block.False) == 0 { - return &block.True - } else if len(block.False) == 1 { - if next, ok := block.False[0].(*IfStmt); ok { - // Recursively find the last block of the chain - return getLastBody(next) - } - } - return &block.False - } - return nil -} diff --git a/vendor/github.com/bazelbuild/buildtools/build/parse.y.go b/vendor/github.com/bazelbuild/buildtools/build/parse.y.go deleted file mode 100644 index ae72e87ac2c..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/build/parse.y.go +++ /dev/null @@ -1,1986 +0,0 @@ -//line build/parse.y:13 -package build - -import __yyfmt__ "fmt" - -//line build/parse.y:13 - -//line build/parse.y:18 -type yySymType struct { - yys int - // input tokens - tok string // raw input syntax - str string // decoding of quoted string - pos Position // position of token - triple bool // was string triple quoted? - - // partial syntax trees - expr Expr - exprs []Expr - string *StringExpr - strings []*StringExpr - ifstmt *IfStmt - loadarg *struct { - from Ident - to Ident - } - loadargs []*struct { - from Ident - to Ident - } - - // supporting information - comma Position // position of trailing comma in list, if present - lastStmt Expr // most recent rule, to attach line comments to -} - -const _AUGM = 57346 -const _AND = 57347 -const _COMMENT = 57348 -const _EOF = 57349 -const _EQ = 57350 -const _FOR = 57351 -const _GE = 57352 -const _IDENT = 57353 -const _NUMBER = 57354 -const _IF = 57355 -const _ELSE = 57356 -const _ELIF = 57357 -const _IN = 57358 -const _IS = 57359 -const _LAMBDA = 57360 -const _LOAD = 57361 -const _LE = 57362 -const _NE = 57363 -const _STAR_STAR = 57364 -const _INT_DIV = 57365 -const _BIT_LSH = 57366 -const _BIT_RSH = 57367 -const _NOT = 57368 -const _OR = 57369 -const _STRING = 57370 -const _DEF = 57371 -const _RETURN = 57372 -const _PASS = 57373 -const _BREAK = 57374 -const _CONTINUE = 57375 -const _INDENT = 57376 -const _UNINDENT = 57377 -const ShiftInstead = 57378 -const _ASSERT = 57379 -const _UNARY = 57380 - -var yyToknames = [...]string{ - "$end", - "error", - "$unk", - "'%'", - "'('", - "')'", - "'*'", - "'+'", - "','", - "'-'", - "'.'", - "'/'", - "':'", - "'<'", - "'='", - "'>'", - "'['", - "']'", - "'{'", - "'}'", - "'|'", - "'&'", - "'^'", - "'~'", - "_AUGM", - "_AND", - "_COMMENT", - "_EOF", - "_EQ", - "_FOR", - "_GE", - "_IDENT", - "_NUMBER", - "_IF", - "_ELSE", - "_ELIF", - "_IN", - "_IS", - "_LAMBDA", - "_LOAD", - "_LE", - "_NE", - "_STAR_STAR", - "_INT_DIV", - "_BIT_LSH", - "_BIT_RSH", - "_NOT", - "_OR", - "_STRING", - "_DEF", - "_RETURN", - "_PASS", - "_BREAK", - "_CONTINUE", - "_INDENT", - "_UNINDENT", - "ShiftInstead", - "'\\n'", - "_ASSERT", - "_UNARY", - "';'", -} -var yyStatenames = [...]string{} - -const yyEofCode = 1 -const yyErrCode = 2 -const yyInitialStackSize = 16 - -//line build/parse.y:977 - -// Go helper code. - -// unary returns a unary expression with the given -// position, operator, and subexpression. -func unary(pos Position, op string, x Expr) Expr { - return &UnaryExpr{ - OpStart: pos, - Op: op, - X: x, - } -} - -// binary returns a binary expression with the given -// operands, position, and operator. -func binary(x Expr, pos Position, op string, y Expr) Expr { - _, xend := x.Span() - ystart, _ := y.Span() - - switch op { - case "=", "+=", "-=", "*=", "/=", "//=", "%=", "|=": - return &AssignExpr{ - LHS: x, - OpPos: pos, - Op: op, - LineBreak: xend.Line < ystart.Line, - RHS: y, - } - } - - return &BinaryExpr{ - X: x, - OpStart: pos, - Op: op, - LineBreak: xend.Line < ystart.Line, - Y: y, - } -} - -// isSimpleExpression returns whether an expression is simple and allowed to exist in -// compact forms of sequences. -// The formal criteria are the following: an expression is considered simple if it's -// a literal (variable, string or a number), a literal with a unary operator or an empty sequence. -func isSimpleExpression(expr *Expr) bool { - switch x := (*expr).(type) { - case *LiteralExpr, *StringExpr, *Ident: - return true - case *UnaryExpr: - _, literal := x.X.(*LiteralExpr) - _, ident := x.X.(*Ident) - return literal || ident - case *ListExpr: - return len(x.List) == 0 - case *TupleExpr: - return len(x.List) == 0 - case *DictExpr: - return len(x.List) == 0 - case *SetExpr: - return len(x.List) == 0 - default: - return false - } -} - -// forceCompact returns the setting for the ForceCompact field for a call or tuple. -// -// NOTE 1: The field is called ForceCompact, not ForceSingleLine, -// because it only affects the formatting associated with the call or tuple syntax, -// not the formatting of the arguments. For example: -// -// call([ -// 1, -// 2, -// 3, -// ]) -// -// is still a compact call even though it runs on multiple lines. -// -// In contrast the multiline form puts a linebreak after the (. -// -// call( -// [ -// 1, -// 2, -// 3, -// ], -// ) -// -// NOTE 2: Because of NOTE 1, we cannot use start and end on the -// same line as a signal for compact mode: the formatting of an -// embedded list might move the end to a different line, which would -// then look different on rereading and cause buildifier not to be -// idempotent. Instead, we have to look at properties guaranteed -// to be preserved by the reformatting, namely that the opening -// paren and the first expression are on the same line and that -// each subsequent expression begins on the same line as the last -// one ended (no line breaks after comma). -func forceCompact(start Position, list []Expr, end Position) bool { - if len(list) <= 1 { - // The call or tuple will probably be compact anyway; don't force it. - return false - } - - // If there are any named arguments or non-string, non-literal - // arguments, cannot force compact mode. - line := start.Line - for _, x := range list { - start, end := x.Span() - if start.Line != line { - return false - } - line = end.Line - if !isSimpleExpression(&x) { - return false - } - } - return end.Line == line -} - -// forceMultiLine returns the setting for the ForceMultiLine field. -func forceMultiLine(start Position, list []Expr, end Position) bool { - if len(list) > 1 { - // The call will be multiline anyway, because it has multiple elements. Don't force it. - return false - } - - if len(list) == 0 { - // Empty list: use position of brackets. - return start.Line != end.Line - } - - // Single-element list. - // Check whether opening bracket is on different line than beginning of - // element, or closing bracket is on different line than end of element. - elemStart, elemEnd := list[0].Span() - return start.Line != elemStart.Line || end.Line != elemEnd.Line -} - -// forceMultiLineComprehension returns the setting for the ForceMultiLine field for a comprehension. -func forceMultiLineComprehension(start Position, expr Expr, clauses []Expr, end Position) bool { - // Return true if there's at least one line break between start, expr, each clause, and end - exprStart, exprEnd := expr.Span() - if start.Line != exprStart.Line { - return true - } - previousEnd := exprEnd - for _, clause := range clauses { - clauseStart, clauseEnd := clause.Span() - if previousEnd.Line != clauseStart.Line { - return true - } - previousEnd = clauseEnd - } - return previousEnd.Line != end.Line -} - -// extractTrailingComments extracts trailing comments of an indented block starting with the first -// comment line with indentation less than the block indentation. -// The comments can either belong to CommentBlock statements or to the last non-comment statement -// as After-comments. -func extractTrailingComments(stmt Expr) []Expr { - body := getLastBody(stmt) - var comments []Expr - if body != nil && len(*body) > 0 { - // Get the current indentation level - start, _ := (*body)[0].Span() - indentation := start.LineRune - - // Find the last non-comment statement - lastNonCommentIndex := -1 - for i, stmt := range *body { - if _, ok := stmt.(*CommentBlock); !ok { - lastNonCommentIndex = i - } - } - if lastNonCommentIndex == -1 { - return comments - } - - // Iterate over the trailing comments, find the first comment line that's not indented enough, - // dedent it and all the following comments. - for i := lastNonCommentIndex; i < len(*body); i++ { - stmt := (*body)[i] - if comment := extractDedentedComment(stmt, indentation); comment != nil { - // This comment and all the following CommentBlock statements are to be extracted. - comments = append(comments, comment) - comments = append(comments, (*body)[i+1:]...) - *body = (*body)[:i+1] - // If the current statement is a CommentBlock statement without any comment lines - // it should be removed too. - if i > lastNonCommentIndex && len(stmt.Comment().After) == 0 { - *body = (*body)[:i] - } - } - } - } - return comments -} - -// extractDedentedComment extract the first comment line from `stmt` which indentation is smaller -// than `indentation`, and all following comment lines, and returns them in a newly created -// CommentBlock statement. -func extractDedentedComment(stmt Expr, indentation int) Expr { - for i, line := range stmt.Comment().After { - // line.Start.LineRune == 0 can't exist in parsed files, it indicates that the comment line - // has been added by an AST modification. Don't take such lines into account. - if line.Start.LineRune > 0 && line.Start.LineRune < indentation { - // This and all the following lines should be dedented - cb := &CommentBlock{ - Start: line.Start, - Comments: Comments{After: stmt.Comment().After[i:]}, - } - stmt.Comment().After = stmt.Comment().After[:i] - return cb - } - } - return nil -} - -// getLastBody returns the last body of a block statement (the only body for For- and DefStmt -// objects, the last in a if-elif-else chain -func getLastBody(stmt Expr) *[]Expr { - switch block := stmt.(type) { - case *DefStmt: - return &block.Body - case *ForStmt: - return &block.Body - case *IfStmt: - if len(block.False) == 0 { - return &block.True - } else if len(block.False) == 1 { - if next, ok := block.False[0].(*IfStmt); ok { - // Recursively find the last block of the chain - return getLastBody(next) - } - } - return &block.False - } - return nil -} - -//line yacctab:1 -var yyExca = [...]int{ - -1, 1, - 1, -1, - -2, 0, -} - -const yyPrivate = 57344 - -const yyLast = 818 - -var yyAct = [...]int{ - - 19, 212, 27, 171, 36, 209, 7, 2, 162, 134, - 143, 147, 89, 41, 9, 97, 21, 169, 146, 222, - 233, 224, 158, 38, 80, 81, 82, 83, 42, 37, - 120, 34, 87, 92, 95, 85, 188, 51, 34, 164, - 50, 54, 131, 55, 40, 52, 103, 221, 37, 149, - 223, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 34, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 192, 165, 135, 53, 136, 33, - 51, 153, 13, 50, 48, 49, 88, 100, 52, 144, - 100, 31, 51, 32, 86, 50, 54, 46, 55, 151, - 52, 163, 154, 73, 105, 79, 34, 35, 152, 66, - 67, 68, 159, 45, 29, 216, 239, 167, 99, 91, - 53, 172, 181, 37, 186, 106, 101, 102, 94, 45, - 104, 191, 53, 69, 70, 43, 149, 226, 179, 180, - 75, 149, 225, 145, 176, 44, 74, 229, 174, 199, - 45, 190, 76, 178, 202, 217, 193, 195, 187, 139, - 182, 45, 141, 189, 187, 168, 42, 200, 201, 194, - 228, 45, 197, 198, 206, 130, 185, 177, 135, 208, - 136, 45, 166, 210, 156, 150, 203, 207, 214, 215, - 213, 142, 235, 196, 175, 157, 98, 84, 96, 205, - 219, 163, 1, 211, 204, 51, 30, 218, 50, 54, - 93, 55, 90, 52, 39, 47, 18, 230, 12, 8, - 220, 4, 227, 67, 183, 184, 28, 210, 148, 232, - 236, 214, 234, 213, 237, 231, 7, 33, 77, 78, - 25, 140, 24, 160, 161, 53, 69, 70, 132, 31, - 133, 32, 0, 0, 0, 0, 26, 0, 0, 6, - 0, 0, 11, 0, 34, 35, 20, 0, 0, 0, - 0, 22, 29, 0, 0, 33, 0, 0, 25, 23, - 24, 37, 10, 14, 15, 16, 17, 31, 238, 32, - 5, 0, 0, 0, 26, 0, 0, 6, 3, 0, - 11, 0, 34, 35, 20, 0, 0, 0, 0, 22, - 29, 0, 0, 33, 0, 0, 25, 23, 24, 37, - 10, 14, 15, 16, 17, 31, 0, 32, 5, 0, - 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, - 34, 35, 0, 0, 0, 0, 0, 22, 29, 0, - 0, 0, 0, 0, 0, 23, 0, 37, 0, 14, - 15, 16, 17, 0, 51, 0, 170, 50, 54, 0, - 55, 0, 52, 155, 56, 0, 57, 0, 0, 0, - 0, 66, 67, 68, 0, 0, 65, 0, 0, 58, - 0, 61, 0, 0, 72, 0, 0, 62, 71, 0, - 0, 59, 60, 0, 53, 69, 70, 63, 64, 51, - 0, 0, 50, 54, 0, 55, 0, 52, 0, 56, - 0, 57, 0, 0, 0, 0, 66, 67, 68, 0, - 0, 65, 0, 0, 58, 0, 61, 0, 0, 72, - 173, 0, 62, 71, 0, 0, 59, 60, 0, 53, - 69, 70, 63, 64, 51, 0, 0, 50, 54, 0, - 55, 0, 52, 0, 56, 0, 57, 0, 0, 0, - 0, 66, 67, 68, 0, 0, 65, 0, 0, 58, - 149, 61, 0, 0, 72, 0, 0, 62, 71, 0, - 0, 59, 60, 0, 53, 69, 70, 63, 64, 51, - 0, 0, 50, 54, 0, 55, 0, 52, 0, 56, - 0, 57, 0, 0, 0, 0, 66, 67, 68, 0, - 0, 65, 0, 0, 58, 0, 61, 0, 0, 72, - 0, 0, 62, 71, 0, 0, 59, 60, 0, 53, - 69, 70, 63, 64, 51, 0, 0, 50, 54, 0, - 55, 0, 52, 0, 56, 0, 57, 0, 0, 0, - 0, 66, 67, 68, 51, 0, 65, 50, 54, 58, - 55, 61, 52, 0, 0, 0, 0, 62, 71, 0, - 0, 59, 60, 0, 53, 69, 70, 63, 64, 33, - 0, 0, 25, 0, 24, 0, 0, 0, 0, 0, - 0, 31, 0, 32, 53, 69, 70, 0, 26, 0, - 0, 0, 0, 0, 0, 0, 34, 35, 0, 0, - 0, 0, 51, 22, 29, 50, 54, 0, 55, 0, - 52, 23, 56, 37, 57, 14, 15, 16, 17, 66, - 67, 68, 0, 0, 65, 0, 0, 58, 0, 61, - 0, 0, 0, 0, 0, 62, 0, 0, 0, 59, - 60, 0, 53, 69, 70, 63, 64, 51, 0, 0, - 50, 54, 0, 55, 0, 52, 0, 56, 0, 57, - 0, 0, 0, 0, 66, 67, 68, 0, 0, 65, - 0, 0, 58, 0, 61, 0, 0, 0, 0, 0, - 62, 0, 0, 0, 59, 60, 0, 53, 69, 70, - 63, 51, 0, 0, 50, 54, 0, 55, 0, 52, - 0, 56, 0, 57, 0, 0, 0, 0, 66, 67, - 68, 0, 0, 0, 0, 0, 58, 0, 61, 0, - 0, 0, 0, 0, 62, 0, 0, 0, 59, 60, - 0, 53, 69, 70, 63, 33, 0, 137, 25, 0, - 24, 0, 51, 0, 0, 50, 54, 31, 55, 32, - 52, 0, 0, 33, 26, 0, 25, 0, 24, 0, - 67, 68, 34, 35, 0, 31, 0, 32, 0, 22, - 29, 0, 26, 138, 0, 0, 0, 23, 0, 37, - 34, 35, 53, 69, 70, 0, 0, 22, 29, 0, - 0, 0, 0, 0, 0, 23, 0, 37, -} -var yyPact = [...]int{ - - -1000, -1000, 270, -1000, -1000, -1000, -35, -1000, -1000, -1000, - 12, 74, -1000, 120, 768, -1000, -1000, -1000, 49, 495, - 768, 135, 768, 768, 768, 768, 768, -1000, -1000, 192, - -20, 768, 768, 768, -1000, -1000, -1000, -1000, -1000, -46, - 191, 81, 135, 768, 768, 768, 172, 768, 91, -1000, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, -7, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 162, 10, 750, 768, 149, 182, 172, - -1000, -1000, -1000, -1000, -20, -1000, 125, 450, 176, 19, - 61, 176, 360, 175, 189, 495, -36, 584, 32, 768, - 74, 172, 172, 540, 152, 308, -1000, -1000, -1000, -1000, - -1000, 76, 76, 88, 88, 88, 88, 88, 88, 88, - 768, 663, 707, 758, 560, 201, 33, 33, 618, 405, - 308, -1000, 188, 168, -1000, 495, 138, 768, 768, 104, - 147, 768, 768, -1000, 167, -1000, 106, 2, -1000, 74, - 768, -1000, 111, -1000, 54, 768, 768, -1000, -1000, -1000, - 187, 164, -1000, 134, 6, 6, 141, 135, 308, -1000, - -1000, -1000, 88, 768, -1000, -1000, -1000, 750, 768, 495, - 495, -1000, 768, -1000, -1000, -1, -1000, 2, 768, 78, - 495, -1000, -1000, 495, -1000, 360, 142, -1000, 32, 768, - -1000, -1000, 308, -1000, -8, -37, 540, -1000, 495, 124, - 495, 161, -1000, -1000, 132, 540, 768, 308, -1000, 495, - -1000, -1000, -38, -1000, -1000, -1000, 768, 186, -1, -20, - 540, -1000, 232, -1000, 98, -1000, -1000, -1000, -1000, -1000, -} -var yyPgo = [...]int{ - - 0, 10, 9, 250, 248, 8, 244, 243, 0, 5, - 94, 16, 82, 241, 86, 239, 238, 13, 228, 11, - 18, 2, 226, 7, 221, 219, 218, 216, 215, 3, - 14, 214, 12, 212, 210, 4, 206, 17, 204, 1, - 203, 202, 199, 198, -} -var yyR1 = [...]int{ - - 0, 41, 37, 37, 42, 42, 38, 38, 38, 23, - 23, 23, 23, 24, 24, 25, 25, 25, 27, 27, - 26, 26, 28, 28, 29, 31, 31, 30, 30, 30, - 30, 30, 30, 30, 30, 43, 43, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 4, 4, 3, 3, 2, 2, 2, 2, - 40, 40, 39, 39, 7, 7, 6, 6, 5, 5, - 5, 5, 5, 12, 12, 13, 13, 15, 15, 16, - 16, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 14, 14, 9, 9, 10, 10, 1, 1, 32, 34, - 34, 33, 33, 33, 17, 17, 35, 36, 36, 21, - 22, 18, 19, 19, 20, 20, -} -var yyR2 = [...]int{ - - 0, 2, 5, 2, 0, 2, 0, 3, 2, 0, - 2, 2, 3, 1, 1, 7, 6, 1, 4, 5, - 1, 4, 2, 1, 4, 0, 3, 1, 2, 1, - 3, 3, 1, 1, 1, 0, 1, 1, 1, 3, - 7, 4, 4, 6, 8, 1, 3, 4, 4, 3, - 4, 3, 0, 2, 1, 3, 1, 3, 2, 2, - 1, 3, 1, 3, 0, 2, 1, 3, 1, 3, - 2, 1, 2, 1, 3, 0, 1, 1, 3, 0, - 2, 1, 4, 2, 2, 2, 2, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 4, 3, 3, 3, 3, 3, 3, 3, 3, 5, - 1, 3, 0, 1, 0, 2, 0, 1, 3, 1, - 3, 0, 1, 2, 1, 3, 1, 1, 2, 1, - 1, 4, 1, 3, 1, 2, -} -var yyChk = [...]int{ - - -1000, -41, -23, 28, -24, 58, 27, -29, -25, -30, - 50, 30, -26, -12, 51, 52, 53, 54, -27, -8, - 34, -11, 39, 47, 10, 8, 24, -21, -22, 40, - -36, 17, 19, 5, 32, 33, -35, 49, 58, -31, - 32, -17, -11, 15, 25, 9, -12, -28, 35, 36, - 7, 4, 12, 44, 8, 10, 14, 16, 29, 41, - 42, 31, 37, 47, 48, 26, 21, 22, 23, 45, - 46, 38, 34, -12, 11, 5, 17, -16, -15, -12, - -8, -8, -8, -8, 5, -35, -10, -8, -14, -32, - -33, -14, -8, -34, -10, -8, -43, 61, 5, 37, - 9, -12, -12, -8, -12, 13, 34, -8, -8, -8, - -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, - 37, -8, -8, -8, -8, -8, -8, -8, -8, -8, - 13, 32, -4, -3, -2, -8, -21, 7, 43, -12, - -13, 13, 9, -1, -35, 18, -20, -19, -18, 30, - 9, -1, -20, 20, -1, 13, 9, 6, 58, -30, - -7, -6, -5, -21, 7, 43, -12, -11, 13, -37, - 58, -29, -8, 35, -37, 6, -1, 9, 15, -8, - -8, 18, 13, -12, -12, 9, 18, -19, 34, -17, - -8, 20, 20, -8, -32, -8, 6, -1, 9, 15, - -21, -21, 13, -37, -38, -42, -8, -2, -8, -9, - -8, -40, -39, -35, -21, -8, 37, 13, -5, -8, - -37, 55, 27, 58, 58, 18, 13, -1, 9, 15, - -8, -37, -23, 58, -9, 6, -39, -35, 56, 18, -} -var yyDef = [...]int{ - - 9, -2, 0, 1, 10, 11, 0, 13, 14, 25, - 0, 0, 17, 27, 29, 32, 33, 34, 20, 73, - 0, 81, 79, 0, 0, 0, 0, 37, 38, 0, - 45, 114, 121, 114, 129, 130, 127, 126, 12, 35, - 0, 0, 124, 0, 0, 0, 28, 0, 0, 23, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 52, 75, 0, 116, 77, - 83, 84, 85, 86, 0, 128, 0, 110, 116, 119, - 0, 116, 110, 122, 0, 110, 0, 36, 64, 0, - 0, 30, 31, 74, 0, 0, 22, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 0, 101, 102, 103, 104, 105, 106, 107, 108, 0, - 0, 39, 0, 116, 54, 56, 37, 0, 0, 76, - 0, 0, 117, 80, 0, 46, 0, 134, 132, 0, - 117, 115, 0, 49, 0, 0, 123, 51, 24, 26, - 0, 116, 66, 68, 71, 0, 0, 125, 0, 21, - 6, 4, 100, 0, 18, 41, 53, 117, 0, 58, - 59, 42, 112, 82, 78, 0, 47, 135, 0, 0, - 111, 48, 50, 118, 120, 0, 0, 65, 117, 0, - 70, 72, 0, 19, 0, 3, 109, 55, 57, 0, - 113, 116, 60, 62, 0, 133, 0, 0, 67, 69, - 16, 9, 0, 8, 5, 43, 112, 0, 117, 0, - 131, 15, 0, 7, 0, 40, 61, 63, 2, 44, -} -var yyTok1 = [...]int{ - - 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 58, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 4, 22, 3, - 5, 6, 7, 8, 9, 10, 11, 12, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 13, 61, - 14, 15, 16, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 17, 3, 18, 23, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 19, 21, 20, 24, -} -var yyTok2 = [...]int{ - - 2, 3, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 59, 60, -} -var yyTok3 = [...]int{ - 0, -} - -var yyErrorMessages = [...]struct { - state int - token int - msg string -}{} - -//line yaccpar:1 - -/* parser for yacc output */ - -var ( - yyDebug = 0 - yyErrorVerbose = false -) - -type yyLexer interface { - Lex(lval *yySymType) int - Error(s string) -} - -type yyParser interface { - Parse(yyLexer) int - Lookahead() int -} - -type yyParserImpl struct { - lval yySymType - stack [yyInitialStackSize]yySymType - char int -} - -func (p *yyParserImpl) Lookahead() int { - return p.char -} - -func yyNewParser() yyParser { - return &yyParserImpl{} -} - -const yyFlag = -1000 - -func yyTokname(c int) string { - if c >= 1 && c-1 < len(yyToknames) { - if yyToknames[c-1] != "" { - return yyToknames[c-1] - } - } - return __yyfmt__.Sprintf("tok-%v", c) -} - -func yyStatname(s int) string { - if s >= 0 && s < len(yyStatenames) { - if yyStatenames[s] != "" { - return yyStatenames[s] - } - } - return __yyfmt__.Sprintf("state-%v", s) -} - -func yyErrorMessage(state, lookAhead int) string { - const TOKSTART = 4 - - if !yyErrorVerbose { - return "syntax error" - } - - for _, e := range yyErrorMessages { - if e.state == state && e.token == lookAhead { - return "syntax error: " + e.msg - } - } - - res := "syntax error: unexpected " + yyTokname(lookAhead) - - // To match Bison, suggest at most four expected tokens. - expected := make([]int, 0, 4) - - // Look for shiftable tokens. - base := yyPact[state] - for tok := TOKSTART; tok-1 < len(yyToknames); tok++ { - if n := base + tok; n >= 0 && n < yyLast && yyChk[yyAct[n]] == tok { - if len(expected) == cap(expected) { - return res - } - expected = append(expected, tok) - } - } - - if yyDef[state] == -2 { - i := 0 - for yyExca[i] != -1 || yyExca[i+1] != state { - i += 2 - } - - // Look for tokens that we accept or reduce. - for i += 2; yyExca[i] >= 0; i += 2 { - tok := yyExca[i] - if tok < TOKSTART || yyExca[i+1] == 0 { - continue - } - if len(expected) == cap(expected) { - return res - } - expected = append(expected, tok) - } - - // If the default action is to accept or reduce, give up. - if yyExca[i+1] != 0 { - return res - } - } - - for i, tok := range expected { - if i == 0 { - res += ", expecting " - } else { - res += " or " - } - res += yyTokname(tok) - } - return res -} - -func yylex1(lex yyLexer, lval *yySymType) (char, token int) { - token = 0 - char = lex.Lex(lval) - if char <= 0 { - token = yyTok1[0] - goto out - } - if char < len(yyTok1) { - token = yyTok1[char] - goto out - } - if char >= yyPrivate { - if char < yyPrivate+len(yyTok2) { - token = yyTok2[char-yyPrivate] - goto out - } - } - for i := 0; i < len(yyTok3); i += 2 { - token = yyTok3[i+0] - if token == char { - token = yyTok3[i+1] - goto out - } - } - -out: - if token == 0 { - token = yyTok2[1] /* unknown char */ - } - if yyDebug >= 3 { - __yyfmt__.Printf("lex %s(%d)\n", yyTokname(token), uint(char)) - } - return char, token -} - -func yyParse(yylex yyLexer) int { - return yyNewParser().Parse(yylex) -} - -func (yyrcvr *yyParserImpl) Parse(yylex yyLexer) int { - var yyn int - var yyVAL yySymType - var yyDollar []yySymType - _ = yyDollar // silence set and not used - yyS := yyrcvr.stack[:] - - Nerrs := 0 /* number of errors */ - Errflag := 0 /* error recovery flag */ - yystate := 0 - yyrcvr.char = -1 - yytoken := -1 // yyrcvr.char translated into internal numbering - defer func() { - // Make sure we report no lookahead when not parsing. - yystate = -1 - yyrcvr.char = -1 - yytoken = -1 - }() - yyp := -1 - goto yystack - -ret0: - return 0 - -ret1: - return 1 - -yystack: - /* put a state and value onto the stack */ - if yyDebug >= 4 { - __yyfmt__.Printf("char %v in %v\n", yyTokname(yytoken), yyStatname(yystate)) - } - - yyp++ - if yyp >= len(yyS) { - nyys := make([]yySymType, len(yyS)*2) - copy(nyys, yyS) - yyS = nyys - } - yyS[yyp] = yyVAL - yyS[yyp].yys = yystate - -yynewstate: - yyn = yyPact[yystate] - if yyn <= yyFlag { - goto yydefault /* simple state */ - } - if yyrcvr.char < 0 { - yyrcvr.char, yytoken = yylex1(yylex, &yyrcvr.lval) - } - yyn += yytoken - if yyn < 0 || yyn >= yyLast { - goto yydefault - } - yyn = yyAct[yyn] - if yyChk[yyn] == yytoken { /* valid shift */ - yyrcvr.char = -1 - yytoken = -1 - yyVAL = yyrcvr.lval - yystate = yyn - if Errflag > 0 { - Errflag-- - } - goto yystack - } - -yydefault: - /* default state action */ - yyn = yyDef[yystate] - if yyn == -2 { - if yyrcvr.char < 0 { - yyrcvr.char, yytoken = yylex1(yylex, &yyrcvr.lval) - } - - /* look through exception table */ - xi := 0 - for { - if yyExca[xi+0] == -1 && yyExca[xi+1] == yystate { - break - } - xi += 2 - } - for xi += 2; ; xi += 2 { - yyn = yyExca[xi+0] - if yyn < 0 || yyn == yytoken { - break - } - } - yyn = yyExca[xi+1] - if yyn < 0 { - goto ret0 - } - } - if yyn == 0 { - /* error ... attempt to resume parsing */ - switch Errflag { - case 0: /* brand new error */ - yylex.Error(yyErrorMessage(yystate, yytoken)) - Nerrs++ - if yyDebug >= 1 { - __yyfmt__.Printf("%s", yyStatname(yystate)) - __yyfmt__.Printf(" saw %s\n", yyTokname(yytoken)) - } - fallthrough - - case 1, 2: /* incompletely recovered error ... try again */ - Errflag = 3 - - /* find a state where "error" is a legal shift action */ - for yyp >= 0 { - yyn = yyPact[yyS[yyp].yys] + yyErrCode - if yyn >= 0 && yyn < yyLast { - yystate = yyAct[yyn] /* simulate a shift of "error" */ - if yyChk[yystate] == yyErrCode { - goto yystack - } - } - - /* the current p has no shift on "error", pop stack */ - if yyDebug >= 2 { - __yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys) - } - yyp-- - } - /* there is no state on the stack with an error shift ... abort */ - goto ret1 - - case 3: /* no shift yet; clobber input char */ - if yyDebug >= 2 { - __yyfmt__.Printf("error recovery discards %s\n", yyTokname(yytoken)) - } - if yytoken == yyEofCode { - goto ret1 - } - yyrcvr.char = -1 - yytoken = -1 - goto yynewstate /* try again in the same state */ - } - } - - /* reduction by production yyn */ - if yyDebug >= 2 { - __yyfmt__.Printf("reduce %v in:\n\t%v\n", yyn, yyStatname(yystate)) - } - - yynt := yyn - yypt := yyp - _ = yypt // guard against "declared and not used" - - yyp -= yyR2[yyn] - // yyp is now the index of $0. Perform the default action. Iff the - // reduced production is ε, $1 is possibly out of range. - if yyp+1 >= len(yyS) { - nyys := make([]yySymType, len(yyS)*2) - copy(nyys, yyS) - yyS = nyys - } - yyVAL = yyS[yyp+1] - - /* consult goto table to find next state */ - yyn = yyR1[yyn] - yyg := yyPgo[yyn] - yyj := yyg + yyS[yyp].yys + 1 - - if yyj >= yyLast { - yystate = yyAct[yyg] - } else { - yystate = yyAct[yyj] - if yyChk[yystate] != -yyn { - yystate = yyAct[yyg] - } - } - // dummy call; replaced with literal code - switch yynt { - - case 1: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:195 - { - yylex.(*input).file = &File{Stmt: yyDollar[1].exprs} - return 0 - } - case 2: - yyDollar = yyS[yypt-5 : yypt+1] -//line build/parse.y:202 - { - statements := yyDollar[4].exprs - if yyDollar[2].exprs != nil { - // $2 can only contain *CommentBlock objects, each of them contains a non-empty After slice - cb := yyDollar[2].exprs[len(yyDollar[2].exprs)-1].(*CommentBlock) - // $4 can't be empty and can't start with a comment - stmt := yyDollar[4].exprs[0] - start, _ := stmt.Span() - if start.Line-cb.After[len(cb.After)-1].Start.Line == 1 { - // The first statement of $4 starts on the next line after the last comment of $2. - // Attach the last comment to the first statement - stmt.Comment().Before = cb.After - yyDollar[2].exprs = yyDollar[2].exprs[:len(yyDollar[2].exprs)-1] - } - statements = append(yyDollar[2].exprs, yyDollar[4].exprs...) - } - yyVAL.exprs = statements - yyVAL.lastStmt = yyDollar[4].lastStmt - } - case 3: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:222 - { - yyVAL.exprs = yyDollar[1].exprs - } - case 6: - yyDollar = yyS[yypt-0 : yypt+1] -//line build/parse.y:230 - { - yyVAL.exprs = nil - yyVAL.lastStmt = nil - } - case 7: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:235 - { - yyVAL.exprs = yyDollar[1].exprs - yyVAL.lastStmt = yyDollar[1].lastStmt - if yyVAL.lastStmt == nil { - cb := &CommentBlock{Start: yyDollar[2].pos} - yyVAL.exprs = append(yyVAL.exprs, cb) - yyVAL.lastStmt = cb - } - com := yyVAL.lastStmt.Comment() - com.After = append(com.After, Comment{Start: yyDollar[2].pos, Token: yyDollar[2].tok}) - } - case 8: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:247 - { - yyVAL.exprs = yyDollar[1].exprs - yyVAL.lastStmt = nil - } - case 9: - yyDollar = yyS[yypt-0 : yypt+1] -//line build/parse.y:253 - { - yyVAL.exprs = nil - yyVAL.lastStmt = nil - } - case 10: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:258 - { - // If this statement follows a comment block, - // attach the comments to the statement. - if cb, ok := yyDollar[1].lastStmt.(*CommentBlock); ok { - yyVAL.exprs = append(yyDollar[1].exprs[:len(yyDollar[1].exprs)-1], yyDollar[2].exprs...) - yyDollar[2].exprs[0].Comment().Before = cb.After - yyVAL.lastStmt = yyDollar[2].lastStmt - break - } - - // Otherwise add to list. - yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[2].exprs...) - yyVAL.lastStmt = yyDollar[2].lastStmt - - // Consider this input: - // - // foo() - // # bar - // baz() - // - // If we've just parsed baz(), the # bar is attached to - // foo() as an After comment. Make it a Before comment - // for baz() instead. - if x := yyDollar[1].lastStmt; x != nil { - com := x.Comment() - // stmt is never empty - yyDollar[2].exprs[0].Comment().Before = com.After - com.After = nil - } - } - case 11: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:289 - { - // Blank line; sever last rule from future comments. - yyVAL.exprs = yyDollar[1].exprs - yyVAL.lastStmt = nil - } - case 12: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:295 - { - yyVAL.exprs = yyDollar[1].exprs - yyVAL.lastStmt = yyDollar[1].lastStmt - if yyVAL.lastStmt == nil { - cb := &CommentBlock{Start: yyDollar[2].pos} - yyVAL.exprs = append(yyVAL.exprs, cb) - yyVAL.lastStmt = cb - } - com := yyVAL.lastStmt.Comment() - com.After = append(com.After, Comment{Start: yyDollar[2].pos, Token: yyDollar[2].tok}) - } - case 13: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:309 - { - yyVAL.exprs = yyDollar[1].exprs - yyVAL.lastStmt = yyDollar[1].exprs[len(yyDollar[1].exprs)-1] - } - case 14: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:314 - { - yyVAL.exprs = []Expr{yyDollar[1].expr} - yyVAL.lastStmt = yyDollar[1].expr - if cbs := extractTrailingComments(yyDollar[1].expr); len(cbs) > 0 { - yyVAL.exprs = append(yyVAL.exprs, cbs...) - yyVAL.lastStmt = cbs[len(cbs)-1] - if yyDollar[1].lastStmt == nil { - yyVAL.lastStmt = nil - } - } - } - case 15: - yyDollar = yyS[yypt-7 : yypt+1] -//line build/parse.y:328 - { - yyVAL.expr = &DefStmt{ - Function: Function{ - StartPos: yyDollar[1].pos, - Params: yyDollar[4].exprs, - Body: yyDollar[7].exprs, - }, - Name: yyDollar[2].tok, - ColonPos: yyDollar[6].pos, - ForceCompact: forceCompact(yyDollar[3].pos, yyDollar[4].exprs, yyDollar[5].pos), - ForceMultiLine: forceMultiLine(yyDollar[3].pos, yyDollar[4].exprs, yyDollar[5].pos), - } - yyVAL.lastStmt = yyDollar[7].lastStmt - } - case 16: - yyDollar = yyS[yypt-6 : yypt+1] -//line build/parse.y:343 - { - yyVAL.expr = &ForStmt{ - For: yyDollar[1].pos, - Vars: yyDollar[2].expr, - X: yyDollar[4].expr, - Body: yyDollar[6].exprs, - } - yyVAL.lastStmt = yyDollar[6].lastStmt - } - case 17: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:353 - { - yyVAL.expr = yyDollar[1].ifstmt - yyVAL.lastStmt = yyDollar[1].lastStmt - } - case 18: - yyDollar = yyS[yypt-4 : yypt+1] -//line build/parse.y:361 - { - yyVAL.ifstmt = &IfStmt{ - If: yyDollar[1].pos, - Cond: yyDollar[2].expr, - True: yyDollar[4].exprs, - } - yyVAL.lastStmt = yyDollar[4].lastStmt - } - case 19: - yyDollar = yyS[yypt-5 : yypt+1] -//line build/parse.y:370 - { - yyVAL.ifstmt = yyDollar[1].ifstmt - inner := yyDollar[1].ifstmt - for len(inner.False) == 1 { - inner = inner.False[0].(*IfStmt) - } - inner.ElsePos = End{Pos: yyDollar[2].pos} - inner.False = []Expr{ - &IfStmt{ - If: yyDollar[2].pos, - Cond: yyDollar[3].expr, - True: yyDollar[5].exprs, - }, - } - yyVAL.lastStmt = yyDollar[5].lastStmt - } - case 21: - yyDollar = yyS[yypt-4 : yypt+1] -//line build/parse.y:391 - { - yyVAL.ifstmt = yyDollar[1].ifstmt - inner := yyDollar[1].ifstmt - for len(inner.False) == 1 { - inner = inner.False[0].(*IfStmt) - } - inner.ElsePos = End{Pos: yyDollar[2].pos} - inner.False = yyDollar[4].exprs - yyVAL.lastStmt = yyDollar[4].lastStmt - } - case 24: - yyDollar = yyS[yypt-4 : yypt+1] -//line build/parse.y:408 - { - yyVAL.exprs = append([]Expr{yyDollar[1].expr}, yyDollar[2].exprs...) - yyVAL.lastStmt = yyVAL.exprs[len(yyVAL.exprs)-1] - } - case 25: - yyDollar = yyS[yypt-0 : yypt+1] -//line build/parse.y:414 - { - yyVAL.exprs = []Expr{} - } - case 26: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:418 - { - yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr) - } - case 28: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:425 - { - yyVAL.expr = &ReturnStmt{ - Return: yyDollar[1].pos, - Result: yyDollar[2].expr, - } - } - case 29: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:432 - { - yyVAL.expr = &ReturnStmt{ - Return: yyDollar[1].pos, - } - } - case 30: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:437 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 31: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:438 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 32: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:440 - { - yyVAL.expr = &BranchStmt{ - Token: yyDollar[1].tok, - TokenPos: yyDollar[1].pos, - } - } - case 33: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:447 - { - yyVAL.expr = &BranchStmt{ - Token: yyDollar[1].tok, - TokenPos: yyDollar[1].pos, - } - } - case 34: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:454 - { - yyVAL.expr = &BranchStmt{ - Token: yyDollar[1].tok, - TokenPos: yyDollar[1].pos, - } - } - case 39: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:468 - { - yyVAL.expr = &DotExpr{ - X: yyDollar[1].expr, - Dot: yyDollar[2].pos, - NamePos: yyDollar[3].pos, - Name: yyDollar[3].tok, - } - } - case 40: - yyDollar = yyS[yypt-7 : yypt+1] -//line build/parse.y:477 - { - load := &LoadStmt{ - Load: yyDollar[1].pos, - Module: yyDollar[3].string, - Rparen: End{Pos: yyDollar[7].pos}, - ForceCompact: yyDollar[1].pos.Line == yyDollar[7].pos.Line, - } - for _, arg := range yyDollar[5].loadargs { - load.From = append(load.From, &arg.from) - load.To = append(load.To, &arg.to) - } - yyVAL.expr = load - } - case 41: - yyDollar = yyS[yypt-4 : yypt+1] -//line build/parse.y:491 - { - yyVAL.expr = &CallExpr{ - X: yyDollar[1].expr, - ListStart: yyDollar[2].pos, - List: yyDollar[3].exprs, - End: End{Pos: yyDollar[4].pos}, - ForceCompact: forceCompact(yyDollar[2].pos, yyDollar[3].exprs, yyDollar[4].pos), - ForceMultiLine: forceMultiLine(yyDollar[2].pos, yyDollar[3].exprs, yyDollar[4].pos), - } - } - case 42: - yyDollar = yyS[yypt-4 : yypt+1] -//line build/parse.y:502 - { - yyVAL.expr = &IndexExpr{ - X: yyDollar[1].expr, - IndexStart: yyDollar[2].pos, - Y: yyDollar[3].expr, - End: yyDollar[4].pos, - } - } - case 43: - yyDollar = yyS[yypt-6 : yypt+1] -//line build/parse.y:511 - { - yyVAL.expr = &SliceExpr{ - X: yyDollar[1].expr, - SliceStart: yyDollar[2].pos, - From: yyDollar[3].expr, - FirstColon: yyDollar[4].pos, - To: yyDollar[5].expr, - End: yyDollar[6].pos, - } - } - case 44: - yyDollar = yyS[yypt-8 : yypt+1] -//line build/parse.y:522 - { - yyVAL.expr = &SliceExpr{ - X: yyDollar[1].expr, - SliceStart: yyDollar[2].pos, - From: yyDollar[3].expr, - FirstColon: yyDollar[4].pos, - To: yyDollar[5].expr, - SecondColon: yyDollar[6].pos, - Step: yyDollar[7].expr, - End: yyDollar[8].pos, - } - } - case 45: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:535 - { - if len(yyDollar[1].strings) == 1 { - yyVAL.expr = yyDollar[1].strings[0] - break - } - yyVAL.expr = yyDollar[1].strings[0] - for _, x := range yyDollar[1].strings[1:] { - _, end := yyVAL.expr.Span() - yyVAL.expr = binary(yyVAL.expr, end, "+", x) - } - } - case 46: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:547 - { - yyVAL.expr = &ListExpr{ - Start: yyDollar[1].pos, - List: yyDollar[2].exprs, - End: End{Pos: yyDollar[3].pos}, - ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos), - } - } - case 47: - yyDollar = yyS[yypt-4 : yypt+1] -//line build/parse.y:556 - { - yyVAL.expr = &Comprehension{ - Curly: false, - Lbrack: yyDollar[1].pos, - Body: yyDollar[2].expr, - Clauses: yyDollar[3].exprs, - End: End{Pos: yyDollar[4].pos}, - ForceMultiLine: forceMultiLineComprehension(yyDollar[1].pos, yyDollar[2].expr, yyDollar[3].exprs, yyDollar[4].pos), - } - } - case 48: - yyDollar = yyS[yypt-4 : yypt+1] -//line build/parse.y:567 - { - yyVAL.expr = &Comprehension{ - Curly: true, - Lbrack: yyDollar[1].pos, - Body: yyDollar[2].expr, - Clauses: yyDollar[3].exprs, - End: End{Pos: yyDollar[4].pos}, - ForceMultiLine: forceMultiLineComprehension(yyDollar[1].pos, yyDollar[2].expr, yyDollar[3].exprs, yyDollar[4].pos), - } - } - case 49: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:578 - { - yyVAL.expr = &DictExpr{ - Start: yyDollar[1].pos, - List: yyDollar[2].exprs, - End: End{Pos: yyDollar[3].pos}, - ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos), - } - } - case 50: - yyDollar = yyS[yypt-4 : yypt+1] -//line build/parse.y:587 - { - yyVAL.expr = &SetExpr{ - Start: yyDollar[1].pos, - List: yyDollar[2].exprs, - End: End{Pos: yyDollar[4].pos}, - ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[4].pos), - } - } - case 51: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:596 - { - if len(yyDollar[2].exprs) == 1 && yyDollar[2].comma.Line == 0 { - // Just a parenthesized expression, not a tuple. - yyVAL.expr = &ParenExpr{ - Start: yyDollar[1].pos, - X: yyDollar[2].exprs[0], - End: End{Pos: yyDollar[3].pos}, - ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos), - } - } else { - yyVAL.expr = &TupleExpr{ - Start: yyDollar[1].pos, - List: yyDollar[2].exprs, - End: End{Pos: yyDollar[3].pos}, - ForceCompact: forceCompact(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos), - ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos), - } - } - } - case 52: - yyDollar = yyS[yypt-0 : yypt+1] -//line build/parse.y:617 - { - yyVAL.exprs = nil - } - case 53: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:621 - { - yyVAL.exprs = yyDollar[1].exprs - } - case 54: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:627 - { - yyVAL.exprs = []Expr{yyDollar[1].expr} - } - case 55: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:631 - { - yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr) - } - case 57: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:638 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 58: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:642 - { - yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr) - } - case 59: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:646 - { - yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr) - } - case 60: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:651 - { - yyVAL.loadargs = []*struct { - from Ident - to Ident - }{yyDollar[1].loadarg} - } - case 61: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:655 - { - yyDollar[1].loadargs = append(yyDollar[1].loadargs, yyDollar[3].loadarg) - yyVAL.loadargs = yyDollar[1].loadargs - } - case 62: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:661 - { - start := yyDollar[1].string.Start.add("'") - if yyDollar[1].string.TripleQuote { - start = start.add("''") - } - yyVAL.loadarg = &struct { - from Ident - to Ident - }{ - from: Ident{ - Name: yyDollar[1].string.Value, - NamePos: start, - }, - to: Ident{ - Name: yyDollar[1].string.Value, - NamePos: start, - }, - } - } - case 63: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:678 - { - start := yyDollar[3].string.Start.add("'") - if yyDollar[3].string.TripleQuote { - start = start.add("''") - } - yyVAL.loadarg = &struct { - from Ident - to Ident - }{ - from: Ident{ - Name: yyDollar[3].string.Value, - NamePos: start, - }, - to: *yyDollar[1].expr.(*Ident), - } - } - case 64: - yyDollar = yyS[yypt-0 : yypt+1] -//line build/parse.y:693 - { - yyVAL.exprs = nil - } - case 65: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:697 - { - yyVAL.exprs = yyDollar[1].exprs - } - case 66: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:703 - { - yyVAL.exprs = []Expr{yyDollar[1].expr} - } - case 67: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:707 - { - yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr) - } - case 69: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:714 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 70: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:718 - { - yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr) - } - case 71: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:722 - { - yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, nil) - } - case 72: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:726 - { - yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr) - } - case 74: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:733 - { - tuple, ok := yyDollar[1].expr.(*TupleExpr) - if !ok || !tuple.NoBrackets { - tuple = &TupleExpr{ - List: []Expr{yyDollar[1].expr}, - NoBrackets: true, - ForceCompact: true, - ForceMultiLine: false, - } - } - tuple.List = append(tuple.List, yyDollar[3].expr) - yyVAL.expr = tuple - } - case 75: - yyDollar = yyS[yypt-0 : yypt+1] -//line build/parse.y:748 - { - yyVAL.expr = nil - } - case 77: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:755 - { - yyVAL.exprs = []Expr{yyDollar[1].expr} - } - case 78: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:759 - { - yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr) - } - case 79: - yyDollar = yyS[yypt-0 : yypt+1] -//line build/parse.y:764 - { - yyVAL.exprs = nil - } - case 80: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:768 - { - yyVAL.exprs = yyDollar[1].exprs - } - case 82: - yyDollar = yyS[yypt-4 : yypt+1] -//line build/parse.y:775 - { - yyVAL.expr = &LambdaExpr{ - Function: Function{ - StartPos: yyDollar[1].pos, - Params: yyDollar[2].exprs, - Body: []Expr{yyDollar[4].expr}, - }, - } - } - case 83: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:784 - { - yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr) - } - case 84: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:785 - { - yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr) - } - case 85: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:786 - { - yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr) - } - case 86: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:787 - { - yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr) - } - case 87: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:788 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 88: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:789 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 89: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:790 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 90: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:791 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 91: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:792 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 92: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:793 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 93: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:794 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 94: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:795 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 95: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:796 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 96: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:797 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 97: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:798 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 98: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:799 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 99: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:800 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 100: - yyDollar = yyS[yypt-4 : yypt+1] -//line build/parse.y:801 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, "not in", yyDollar[4].expr) - } - case 101: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:802 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 102: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:803 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 103: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:804 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 104: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:805 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 105: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:806 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 106: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:807 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 107: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:808 - { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - case 108: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:810 - { - if b, ok := yyDollar[3].expr.(*UnaryExpr); ok && b.Op == "not" { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, "is not", b.X) - } else { - yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr) - } - } - case 109: - yyDollar = yyS[yypt-5 : yypt+1] -//line build/parse.y:818 - { - yyVAL.expr = &ConditionalExpr{ - Then: yyDollar[1].expr, - IfStart: yyDollar[2].pos, - Test: yyDollar[3].expr, - ElseStart: yyDollar[4].pos, - Else: yyDollar[5].expr, - } - } - case 110: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:830 - { - yyVAL.exprs = []Expr{yyDollar[1].expr} - } - case 111: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:834 - { - yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr) - } - case 112: - yyDollar = yyS[yypt-0 : yypt+1] -//line build/parse.y:839 - { - yyVAL.expr = nil - } - case 114: - yyDollar = yyS[yypt-0 : yypt+1] -//line build/parse.y:845 - { - yyVAL.exprs, yyVAL.comma = nil, Position{} - } - case 115: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:849 - { - yyVAL.exprs, yyVAL.comma = yyDollar[1].exprs, yyDollar[2].pos - } - case 116: - yyDollar = yyS[yypt-0 : yypt+1] -//line build/parse.y:858 - { - yyVAL.pos = Position{} - } - case 118: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:864 - { - yyVAL.expr = &KeyValueExpr{ - Key: yyDollar[1].expr, - Colon: yyDollar[2].pos, - Value: yyDollar[3].expr, - } - } - case 119: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:874 - { - yyVAL.exprs = []Expr{yyDollar[1].expr} - } - case 120: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:878 - { - yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr) - } - case 121: - yyDollar = yyS[yypt-0 : yypt+1] -//line build/parse.y:883 - { - yyVAL.exprs = nil - } - case 122: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:887 - { - yyVAL.exprs = yyDollar[1].exprs - } - case 123: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:891 - { - yyVAL.exprs = yyDollar[1].exprs - } - case 125: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:898 - { - tuple, ok := yyDollar[1].expr.(*TupleExpr) - if !ok || !tuple.NoBrackets { - tuple = &TupleExpr{ - List: []Expr{yyDollar[1].expr}, - NoBrackets: true, - ForceCompact: true, - ForceMultiLine: false, - } - } - tuple.List = append(tuple.List, yyDollar[3].expr) - yyVAL.expr = tuple - } - case 126: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:914 - { - yyVAL.string = &StringExpr{ - Start: yyDollar[1].pos, - Value: yyDollar[1].str, - TripleQuote: yyDollar[1].triple, - End: yyDollar[1].pos.add(yyDollar[1].tok), - Token: yyDollar[1].tok, - } - } - case 127: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:926 - { - yyVAL.strings = []*StringExpr{yyDollar[1].string} - } - case 128: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:930 - { - yyVAL.strings = append(yyDollar[1].strings, yyDollar[2].string) - } - case 129: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:936 - { - yyVAL.expr = &Ident{NamePos: yyDollar[1].pos, Name: yyDollar[1].tok} - } - case 130: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:942 - { - yyVAL.expr = &LiteralExpr{Start: yyDollar[1].pos, Token: yyDollar[1].tok} - } - case 131: - yyDollar = yyS[yypt-4 : yypt+1] -//line build/parse.y:948 - { - yyVAL.expr = &ForClause{ - For: yyDollar[1].pos, - Vars: yyDollar[2].expr, - In: yyDollar[3].pos, - X: yyDollar[4].expr, - } - } - case 132: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:958 - { - yyVAL.exprs = []Expr{yyDollar[1].expr} - } - case 133: - yyDollar = yyS[yypt-3 : yypt+1] -//line build/parse.y:961 - { - yyVAL.exprs = append(yyDollar[1].exprs, &IfClause{ - If: yyDollar[2].pos, - Cond: yyDollar[3].expr, - }) - } - case 134: - yyDollar = yyS[yypt-1 : yypt+1] -//line build/parse.y:970 - { - yyVAL.exprs = yyDollar[1].exprs - } - case 135: - yyDollar = yyS[yypt-2 : yypt+1] -//line build/parse.y:973 - { - yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[2].exprs...) - } - } - goto yystack /* stack new state and value */ -} diff --git a/vendor/github.com/bazelbuild/buildtools/build/print.go b/vendor/github.com/bazelbuild/buildtools/build/print.go deleted file mode 100644 index 900e39f067f..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/build/print.go +++ /dev/null @@ -1,926 +0,0 @@ -/* -Copyright 2016 Google 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. -*/ -// Printing of syntax trees. - -package build - -import ( - "bytes" - "fmt" - "strings" -) - -const ( - nestedIndentation = 4 // Indentation of nested blocks - listIndentation = 4 // Indentation of multiline expressions - defIndentation = 8 // Indentation of multiline function definitions -) - -// Format returns the formatted form of the given BUILD or bzl file. -func Format(f *File) []byte { - pr := &printer{fileType: f.Type} - pr.file(f) - return pr.Bytes() -} - -// FormatString returns the string form of the given expression. -func FormatString(x Expr) string { - fileType := TypeBuild // for compatibility - if file, ok := x.(*File); ok { - fileType = file.Type - } - - pr := &printer{fileType: fileType} - switch x := x.(type) { - case *File: - pr.file(x) - default: - pr.expr(x, precLow) - } - return pr.String() -} - -// A printer collects the state during printing of a file or expression. -type printer struct { - fileType FileType // different rules can be applied to different file types. - bytes.Buffer // output buffer - comment []Comment // pending end-of-line comments - margin int // left margin (indent), a number of spaces - depth int // nesting depth inside ( ) [ ] { } - level int // nesting level of def-, if-else- and for-blocks - needsNewLine bool // true if the next statement needs a new line before it -} - -// printf prints to the buffer. -func (p *printer) printf(format string, args ...interface{}) { - fmt.Fprintf(p, format, args...) -} - -// indent returns the position on the current line, in bytes, 0-indexed. -func (p *printer) indent() int { - b := p.Bytes() - n := 0 - for n < len(b) && b[len(b)-1-n] != '\n' { - n++ - } - return n -} - -// newline ends the current line, flushing end-of-line comments. -// It must only be called when printing a newline is known to be safe: -// when not inside an expression or when p.depth > 0. -// To break a line inside an expression that might not be enclosed -// in brackets of some kind, use breakline instead. -func (p *printer) newline() { - p.needsNewLine = false - if len(p.comment) > 0 { - p.printf(" ") - for i, com := range p.comment { - if i > 0 { - p.trim() - p.printf("\n%*s", p.margin, "") - } - p.printf("%s", strings.TrimSpace(com.Token)) - } - p.comment = p.comment[:0] - } - - p.trim() - p.printf("\n%*s", p.margin, "") -} - -// softNewline postpones a call to newline to the next call of p.newlineIfNeeded() -// If softNewline is called several times, just one newline is printed. -// Usecase: if there are several nested blocks ending at the same time, for instance -// -// if True: -// for a in b: -// pass -// foo() -// -// the last statement (`pass`) doesn't end with a newline, each block ends with a lazy newline -// which actually gets printed only once when right before the next statement (`foo()`) is printed. -func (p *printer) softNewline() { - p.needsNewLine = true -} - -// newlineIfNeeded calls newline if softNewline() has previously been called -func (p *printer) newlineIfNeeded() { - if p.needsNewLine == true { - p.newline() - } -} - -// breakline breaks the current line, inserting a continuation \ if needed. -// If no continuation \ is needed, breakline flushes end-of-line comments. -func (p *printer) breakline() { - if p.depth == 0 { - // Cannot have both final \ and comments. - p.printf(" \\\n%*s", p.margin, "") - return - } - - // Safe to use newline. - p.newline() -} - -// trim removes trailing spaces from the current line. -func (p *printer) trim() { - // Remove trailing space from line we're about to end. - b := p.Bytes() - n := len(b) - for n > 0 && b[n-1] == ' ' { - n-- - } - p.Truncate(n) -} - -// file formats the given file into the print buffer. -func (p *printer) file(f *File) { - for _, com := range f.Before { - p.printf("%s", strings.TrimSpace(com.Token)) - p.newline() - } - - p.statements(f.Stmt) - - for _, com := range f.After { - p.printf("%s", strings.TrimSpace(com.Token)) - p.newline() - } - - p.newlineIfNeeded() -} - -func (p *printer) nestedStatements(stmts []Expr) { - p.margin += nestedIndentation - p.level++ - p.newline() - - p.statements(stmts) - - p.margin -= nestedIndentation - p.level-- -} - -func (p *printer) statements(rawStmts []Expr) { - // rawStmts may contain nils if a refactoring tool replaces an actual statement with nil. - // It means the statements don't exist anymore, just ignore them. - - stmts := []Expr{} - for _, stmt := range rawStmts { - if stmt != nil { - stmts = append(stmts, stmt) - } - } - - for i, stmt := range stmts { - switch stmt := stmt.(type) { - case *CommentBlock: - // comments already handled - - default: - p.expr(stmt, precLow) - } - - // A CommentBlock is an empty statement without a body, - // it doesn't need an line break after the body - if _, ok := stmt.(*CommentBlock); !ok { - p.softNewline() - } - - for _, com := range stmt.Comment().After { - p.newlineIfNeeded() - p.printf("%s", strings.TrimSpace(com.Token)) - p.softNewline() - } - - // Print an empty line break after the statement unless it's the last statement in the sequence. - // In that case a line break should be printed when the block or the file ends. - if i < len(stmts)-1 { - p.newline() - } - - if i+1 < len(stmts) && !p.compactStmt(stmt, stmts[i+1]) { - p.newline() - } - } -} - -// compactStmt reports whether the pair of statements s1, s2 -// should be printed without an intervening blank line. -// We omit the blank line when both are subinclude statements -// and the second one has no leading comments. -func (p *printer) compactStmt(s1, s2 Expr) bool { - if len(s2.Comment().Before) > 0 { - return false - } else if isLoad(s1) && isLoad(s2) { - // Load statements should be compact - return true - } else if isLoad(s1) || isLoad(s2) { - // Load statements should be separated from anything else - return false - } else if isCommentBlock(s1) || isCommentBlock(s2) { - // Standalone comment blocks shouldn't be attached to other statements - return false - } else if (p.fileType == TypeBuild || p.fileType == TypeWorkspace) && p.level == 0 { - // Top-level statements in a BUILD or WORKSPACE file - return false - } else if isFunctionDefinition(s1) || isFunctionDefinition(s2) { - // On of the statements is a function definition - return false - } else { - // Depend on how the statements have been printed in the original file - _, end := s1.Span() - start, _ := s2.Span() - return start.Line-end.Line <= 1 - } -} - -// isLoad reports whether x is a load statement. -func isLoad(x Expr) bool { - _, ok := x.(*LoadStmt) - return ok -} - -// isCommentBlock reports whether x is a comment block node. -func isCommentBlock(x Expr) bool { - _, ok := x.(*CommentBlock) - return ok -} - -// isFunctionDefinition checks if the statement is a def code block -func isFunctionDefinition(x Expr) bool { - _, ok := x.(*DefStmt) - return ok -} - -// isDifferentLines reports whether two positions belong to different lines. -// If one of the positions is null (Line == 0), it's not a real position but probably an indicator -// of manually inserted node. Return false in this case -func isDifferentLines(p1, p2 *Position) bool { - if p1.Line == 0 || p2.Line == 0 { - return false - } - return p1.Line != p2.Line -} - -// Expression formatting. - -// The expression formatter must introduce parentheses to force the -// meaning described by the parse tree. We preserve parentheses in the -// input, so extra parentheses are only needed if we have edited the tree. -// -// For example consider these expressions: -// (1) "x" "y" % foo -// (2) "x" + "y" % foo -// (3) "x" + ("y" % foo) -// (4) ("x" + "y") % foo -// When we parse (1), we represent the concatenation as an addition. -// However, if we print the addition back out without additional parens, -// as in (2), it has the same meaning as (3), which is not the original -// meaning. To preserve the original meaning we must add parens as in (4). -// -// To allow arbitrary rewrites to be formatted properly, we track full -// operator precedence while printing instead of just handling this one -// case of string concatenation. -// -// The precedences are assigned values low to high. A larger number -// binds tighter than a smaller number. All binary operators bind -// left-to-right. -const ( - precLow = iota - precAssign - precColon - precIfElse - precOr - precAnd - precCmp - precBitwiseOr - precBitwiseXor - precBitwiseAnd - precBitwiseShift - precAdd - precMultiply - precUnary - precSuffix -) - -// opPrec gives the precedence for operators found in a BinaryExpr. -var opPrec = map[string]int{ - "or": precOr, - "and": precAnd, - "in": precCmp, - "not in": precCmp, - "<": precCmp, - ">": precCmp, - "==": precCmp, - "!=": precCmp, - "<=": precCmp, - ">=": precCmp, - "+": precAdd, - "-": precAdd, - "*": precMultiply, - "/": precMultiply, - "//": precMultiply, - "%": precMultiply, - "|": precBitwiseOr, - "&": precBitwiseAnd, - "^": precBitwiseXor, - "<<": precBitwiseShift, - ">>": precBitwiseShift, -} - -// expr prints the expression v to the print buffer. -// The value outerPrec gives the precedence of the operator -// outside expr. If that operator binds tighter than v's operator, -// expr must introduce parentheses to preserve the meaning -// of the parse tree (see above). -func (p *printer) expr(v Expr, outerPrec int) { - // Emit line-comments preceding this expression. - // If we are in the middle of an expression but not inside ( ) [ ] { } - // then we cannot just break the line: we'd have to end it with a \. - // However, even then we can't emit line comments since that would - // end the expression. This is only a concern if we have rewritten - // the parse tree. If comments were okay before this expression in - // the original input they're still okay now, in the absense of rewrites. - // - // TODO(bazel-team): Check whether it is valid to emit comments right now, - // and if not, insert them earlier in the output instead, at the most - // recent \n not following a \ line. - p.newlineIfNeeded() - - if before := v.Comment().Before; len(before) > 0 { - // Want to print a line comment. - // Line comments must be at the current margin. - p.trim() - if p.indent() > 0 { - // There's other text on the line. Start a new line. - p.printf("\n") - } - // Re-indent to margin. - p.printf("%*s", p.margin, "") - for _, com := range before { - p.printf("%s", strings.TrimSpace(com.Token)) - p.newline() - } - } - - // Do we introduce parentheses? - // The result depends on the kind of expression. - // Each expression type that might need parentheses - // calls addParen with its own precedence. - // If parentheses are necessary, addParen prints the - // opening parenthesis and sets parenthesized so that - // the code after the switch can print the closing one. - parenthesized := false - addParen := func(prec int) { - if prec < outerPrec { - p.printf("(") - p.depth++ - parenthesized = true - } - } - - switch v := v.(type) { - default: - panic(fmt.Errorf("printer: unexpected type %T", v)) - - case *LiteralExpr: - p.printf("%s", v.Token) - - case *Ident: - p.printf("%s", v.Name) - - case *BranchStmt: - p.printf("%s", v.Token) - - case *StringExpr: - // If the Token is a correct quoting of Value and has double quotes, use it, - // also use it if it has single quotes and the value itself contains a double quote symbol. - // This preserves the specific escaping choices that BUILD authors have made. - s, triple, err := Unquote(v.Token) - if s == v.Value && triple == v.TripleQuote && err == nil { - if strings.HasPrefix(v.Token, `"`) || strings.ContainsRune(v.Value, '"') { - p.printf("%s", v.Token) - break - } - } - - p.printf("%s", quote(v.Value, v.TripleQuote)) - - case *DotExpr: - addParen(precSuffix) - p.expr(v.X, precSuffix) - _, xEnd := v.X.Span() - isMultiline := isDifferentLines(&v.NamePos, &xEnd) - if isMultiline { - p.margin += listIndentation - p.breakline() - } - p.printf(".%s", v.Name) - if isMultiline { - p.margin -= listIndentation - } - - case *IndexExpr: - addParen(precSuffix) - p.expr(v.X, precSuffix) - p.printf("[") - p.expr(v.Y, precLow) - p.printf("]") - - case *KeyValueExpr: - p.expr(v.Key, precLow) - p.printf(": ") - p.expr(v.Value, precLow) - - case *SliceExpr: - addParen(precSuffix) - p.expr(v.X, precSuffix) - p.printf("[") - if v.From != nil { - p.expr(v.From, precLow) - } - p.printf(":") - if v.To != nil { - p.expr(v.To, precLow) - } - if v.SecondColon.Byte != 0 { - p.printf(":") - if v.Step != nil { - p.expr(v.Step, precLow) - } - } - p.printf("]") - - case *UnaryExpr: - addParen(precUnary) - if v.Op == "not" { - p.printf("not ") // Requires a space after it. - } else { - p.printf("%s", v.Op) - } - // Use the next precedence level (precSuffix), so that nested unary expressions are parenthesized, - // for example: `not (-(+(~foo)))` instead of `not -+~foo` - if v.X != nil { - p.expr(v.X, precSuffix) - } - - case *LambdaExpr: - addParen(precColon) - p.printf("lambda ") - for i, param := range v.Params { - if i > 0 { - p.printf(", ") - } - p.expr(param, precLow) - } - p.printf(": ") - p.expr(v.Body[0], precLow) // lambdas should have exactly one statement - - case *BinaryExpr: - // Precedence: use the precedence of the operator. - // Since all binary expressions format left-to-right, - // it is okay for the left side to reuse the same operator - // without parentheses, so we use prec for v.X. - // For the same reason, the right side cannot reuse the same - // operator, or else a parse tree for a + (b + c), where the ( ) are - // not present in the source, will format as a + b + c, which - // means (a + b) + c. Treat the right expression as appearing - // in a context one precedence level higher: use prec+1 for v.Y. - // - // Line breaks: if we are to break the line immediately after - // the operator, introduce a margin at the current column, - // so that the second operand lines up with the first one and - // also so that neither operand can use space to the left. - // If the operator is an =, indent the right side another 4 spaces. - prec := opPrec[v.Op] - addParen(prec) - m := p.margin - if v.LineBreak { - p.margin = p.indent() - } - - p.expr(v.X, prec) - p.printf(" %s", v.Op) - if v.LineBreak { - p.breakline() - } else { - p.printf(" ") - } - p.expr(v.Y, prec+1) - p.margin = m - - case *AssignExpr: - addParen(precAssign) - m := p.margin - if v.LineBreak { - p.margin = p.indent() + listIndentation - } - - p.expr(v.LHS, precAssign) - p.printf(" %s", v.Op) - if v.LineBreak { - p.breakline() - } else { - p.printf(" ") - } - p.expr(v.RHS, precAssign+1) - p.margin = m - - case *ParenExpr: - p.seq("()", &v.Start, &[]Expr{v.X}, &v.End, modeParen, false, v.ForceMultiLine) - - case *CallExpr: - addParen(precSuffix) - p.expr(v.X, precSuffix) - p.seq("()", &v.ListStart, &v.List, &v.End, modeCall, v.ForceCompact, v.ForceMultiLine) - - case *LoadStmt: - addParen(precSuffix) - p.printf("load") - args := []Expr{v.Module} - for i := range v.From { - from := v.From[i] - to := v.To[i] - var arg Expr - if from.Name == to.Name { - // Suffix comments are attached to the `to` token, - // Before comments are attached to the `from` token, - // they need to be combined. - arg = from.asString() - arg.Comment().Before = to.Comment().Before - } else { - arg = &AssignExpr{ - LHS: to, - Op: "=", - RHS: from.asString(), - } - } - args = append(args, arg) - } - p.seq("()", &v.Load, &args, &v.Rparen, modeLoad, v.ForceCompact, false) - - case *ListExpr: - p.seq("[]", &v.Start, &v.List, &v.End, modeList, false, v.ForceMultiLine) - - case *SetExpr: - p.seq("{}", &v.Start, &v.List, &v.End, modeList, false, v.ForceMultiLine) - - case *TupleExpr: - mode := modeTuple - if v.NoBrackets { - mode = modeSeq - } - p.seq("()", &v.Start, &v.List, &v.End, mode, v.ForceCompact, v.ForceMultiLine) - - case *DictExpr: - var list []Expr - for _, x := range v.List { - list = append(list, x) - } - p.seq("{}", &v.Start, &list, &v.End, modeDict, false, v.ForceMultiLine) - - case *Comprehension: - p.listFor(v) - - case *ConditionalExpr: - addParen(precSuffix) - p.expr(v.Then, precIfElse) - p.printf(" if ") - p.expr(v.Test, precIfElse) - p.printf(" else ") - p.expr(v.Else, precIfElse) - - case *ReturnStmt: - p.printf("return") - if v.Result != nil { - p.printf(" ") - p.expr(v.Result, precLow) - } - - case *DefStmt: - p.printf("def ") - p.printf(v.Name) - p.seq("()", &v.StartPos, &v.Params, nil, modeDef, v.ForceCompact, v.ForceMultiLine) - p.printf(":") - p.nestedStatements(v.Body) - - case *ForStmt: - p.printf("for ") - p.expr(v.Vars, precLow) - p.printf(" in ") - p.expr(v.X, precLow) - p.printf(":") - p.nestedStatements(v.Body) - - case *IfStmt: - block := v - isFirst := true - needsEmptyLine := false - for { - p.newlineIfNeeded() - if !isFirst { - if needsEmptyLine { - p.newline() - } - p.printf("el") - } - p.printf("if ") - p.expr(block.Cond, precLow) - p.printf(":") - p.nestedStatements(block.True) - - isFirst = false - _, end := block.True[len(block.True)-1].Span() - needsEmptyLine = block.ElsePos.Pos.Line-end.Line > 1 - - // If the else-block contains just one statement which is an IfStmt, flatten it as a part - // of if-elif chain. - // Don't do it if the "else" statement has a suffix comment or if the next "if" statement - // has a before-comment. - if len(block.False) != 1 { - break - } - next, ok := block.False[0].(*IfStmt) - if !ok { - break - } - if len(block.ElsePos.Comment().Suffix) == 0 && len(next.Comment().Before) == 0 { - block = next - continue - } - break - } - - if len(block.False) > 0 { - p.newlineIfNeeded() - if needsEmptyLine { - p.newline() - } - p.printf("else:") - p.comment = append(p.comment, block.ElsePos.Comment().Suffix...) - p.nestedStatements(block.False) - } - case *ForClause: - p.printf("for ") - p.expr(v.Vars, precLow) - p.printf(" in ") - p.expr(v.X, precLow) - case *IfClause: - p.printf("if ") - p.expr(v.Cond, precLow) - } - - // Add closing parenthesis if needed. - if parenthesized { - p.depth-- - p.printf(")") - } - - // Queue end-of-line comments for printing when we - // reach the end of the line. - p.comment = append(p.comment, v.Comment().Suffix...) -} - -// A seqMode describes a formatting mode for a sequence of values, -// like a list or call arguments. -type seqMode int - -const ( - _ seqMode = iota - - modeCall // f(x) - modeList // [x] - modeTuple // (x,) - modeParen // (x) - modeDict // {x:y} - modeSeq // x, y - modeDef // def f(x, y) - modeLoad // load(a, b, c) -) - -// useCompactMode reports whether a sequence should be formatted in a compact mode -func (p *printer) useCompactMode(start *Position, list *[]Expr, end *End, mode seqMode, forceCompact, forceMultiLine bool) bool { - // If there are line comments, use multiline - // so we can print the comments before the closing bracket. - for _, x := range *list { - if len(x.Comment().Before) > 0 || (len(x.Comment().Suffix) > 0 && mode != modeDef) { - return false - } - } - if end != nil && len(end.Before) > 0 { - return false - } - - // Implicit tuples are always compact - if mode == modeSeq { - return true - } - - // In the Default and .bzl printing modes try to keep the original printing style. - // Non-top-level statements and lists of arguments of a function definition - // should also keep the original style regardless of the mode. - if (p.level != 0 || p.fileType == TypeDefault || p.fileType == TypeBzl || mode == modeDef) && mode != modeLoad { - // If every element (including the brackets) ends on the same line where the next element starts, - // use the compact mode, otherwise use multiline mode. - // If an node's line number is 0, it means it doesn't appear in the original file, - // its position shouldn't be taken into account. Unless a sequence is new, - // then use multiline mode if ForceMultiLine mode was set. - previousEnd := start - isNewSeq := start.Line == 0 - for _, x := range *list { - start, end := x.Span() - isNewSeq = isNewSeq && start.Line == 0 - if isDifferentLines(&start, previousEnd) { - return false - } - if end.Line != 0 { - previousEnd = &end - } - } - if end != nil { - isNewSeq = isNewSeq && end.Pos.Line == 0 - if isDifferentLines(previousEnd, &end.Pos) { - return false - } - } - if !isNewSeq { - return true - } - // Use the forceMultiline value for new sequences. - return !forceMultiLine - } - // In Build mode, use the forceMultiline and forceCompact values - if forceMultiLine { - return false - } - if forceCompact { - return true - } - // If neither of the flags are set, use compact mode only for empty or 1-element sequences - return len(*list) <= 1 -} - -// seq formats a list of values inside a given bracket pair (brack = "()", "[]", "{}"). -// The end node holds any trailing comments to be printed just before the -// closing bracket. -// The mode parameter specifies the sequence mode (see above). -// If multiLine is true, seq avoids the compact form even -// for 0- and 1-element sequences. -func (p *printer) seq(brack string, start *Position, list *[]Expr, end *End, mode seqMode, forceCompact, forceMultiLine bool) { - if mode != modeSeq { - p.printf("%s", brack[:1]) - } - p.depth++ - defer func() { - p.depth-- - if mode != modeSeq { - p.printf("%s", brack[1:]) - } - }() - - if p.useCompactMode(start, list, end, mode, forceCompact, forceMultiLine) { - for i, x := range *list { - if i > 0 { - p.printf(", ") - } - p.expr(x, precLow) - } - // Single-element tuple must end with comma, to mark it as a tuple. - if len(*list) == 1 && mode == modeTuple { - p.printf(",") - } - return - } - // Multi-line form. - indentation := listIndentation - if mode == modeDef { - indentation = defIndentation - } - p.margin += indentation - - for i, x := range *list { - // If we are about to break the line before the first - // element and there are trailing end-of-line comments - // waiting to be printed, delay them and print them as - // whole-line comments preceding that element. - // Do this by printing a newline ourselves and positioning - // so that the end-of-line comment, with the two spaces added, - // will line up with the current margin. - if i == 0 && len(p.comment) > 0 { - p.printf("\n%*s", p.margin-2, "") - } - - p.newline() - p.expr(x, precLow) - - if i+1 < len(*list) || needsTrailingComma(mode, x) { - p.printf(",") - } - } - // Final comments. - if end != nil { - for _, com := range end.Before { - p.newline() - p.printf("%s", strings.TrimSpace(com.Token)) - } - } - p.margin -= indentation - // in modeDef print the closing bracket on the same line - if mode != modeDef { - p.newline() - } -} - -func needsTrailingComma(mode seqMode, v Expr) bool { - switch mode { - case modeDef: - return false - case modeParen: - return false - case modeCall: - // *args and **kwargs in fn calls - switch v := v.(type) { - case *UnaryExpr: - if v.Op == "*" || v.Op == "**" { - return false - } - } - } - return true -} - -// listFor formats a ListForExpr (list comprehension). -// The single-line form is: -// [x for y in z if c] -// -// and the multi-line form is: -// [ -// x -// for y in z -// if c -// ] -// -func (p *printer) listFor(v *Comprehension) { - multiLine := v.ForceMultiLine || len(v.End.Before) > 0 - - // space breaks the line in multiline mode - // or else prints a space. - space := func() { - if multiLine { - p.breakline() - } else { - p.printf(" ") - } - } - - open, close := "[", "]" - if v.Curly { - open, close = "{", "}" - } - p.depth++ - p.printf("%s", open) - - if multiLine { - p.margin += listIndentation - p.newline() - } - - p.expr(v.Body, precLow) - - for _, c := range v.Clauses { - space() - p.expr(c, precLow) - } - - if multiLine { - for _, com := range v.End.Before { - p.newline() - p.printf("%s", strings.TrimSpace(com.Token)) - } - p.margin -= listIndentation - p.newline() - } - - p.printf("%s", close) - p.depth-- -} - -func (p *printer) isTopLevel() bool { - return p.margin == 0 -} diff --git a/vendor/github.com/bazelbuild/buildtools/build/quote.go b/vendor/github.com/bazelbuild/buildtools/build/quote.go deleted file mode 100644 index 901f16bc68c..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/build/quote.go +++ /dev/null @@ -1,262 +0,0 @@ -/* -Copyright 2016 Google 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. -*/ -// Python quoted strings. - -package build - -import ( - "bytes" - "fmt" - "strconv" - "strings" -) - -// unesc maps single-letter chars following \ to their actual values. -var unesc = [256]byte{ - 'a': '\a', - 'b': '\b', - 'f': '\f', - 'n': '\n', - 'r': '\r', - 't': '\t', - 'v': '\v', - '\\': '\\', - '\'': '\'', - '"': '"', -} - -// esc maps escape-worthy bytes to the char that should follow \. -var esc = [256]byte{ - '\a': 'a', - '\b': 'b', - '\f': 'f', - '\n': 'n', - '\r': 'r', - '\t': 't', - '\v': 'v', - '\\': '\\', - '\'': '\'', - '"': '"', -} - -// notEsc is a list of characters that can follow a \ in a string value -// without having to escape the \. That is, since ( is in this list, we -// quote the Go string "foo\\(bar" as the Python literal "foo\(bar". -// This really does happen in BUILD files, especially in strings -// being used as shell arguments containing regular expressions. -const notEsc = " !#$%&()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~" - -// Unquote unquotes the quoted string, returning the actual -// string value, whether the original was triple-quoted, and -// an error describing invalid input. -func Unquote(quoted string) (s string, triple bool, err error) { - // Check for raw prefix: means don't interpret the inner \. - raw := false - if strings.HasPrefix(quoted, "r") { - raw = true - quoted = quoted[1:] - } - - if len(quoted) < 2 { - err = fmt.Errorf("string literal too short") - return - } - - if quoted[0] != '"' && quoted[0] != '\'' || quoted[0] != quoted[len(quoted)-1] { - err = fmt.Errorf("string literal has invalid quotes") - } - - // Check for triple quoted string. - quote := quoted[0] - if len(quoted) >= 6 && quoted[1] == quote && quoted[2] == quote && quoted[:3] == quoted[len(quoted)-3:] { - triple = true - quoted = quoted[3 : len(quoted)-3] - } else { - quoted = quoted[1 : len(quoted)-1] - } - - // Now quoted is the quoted data, but no quotes. - // If we're in raw mode or there are no escapes, we're done. - if raw || !strings.Contains(quoted, `\`) { - s = quoted - return - } - - // Otherwise process quoted string. - // Each iteration processes one escape sequence along with the - // plain text leading up to it. - var buf bytes.Buffer - for { - // Remove prefix before escape sequence. - i := strings.Index(quoted, `\`) - if i < 0 { - i = len(quoted) - } - buf.WriteString(quoted[:i]) - quoted = quoted[i:] - - if len(quoted) == 0 { - break - } - - // Process escape sequence. - if len(quoted) == 1 { - err = fmt.Errorf(`truncated escape sequence \`) - return - } - - switch quoted[1] { - default: - // In Python, if \z (for some byte z) is not a known escape sequence - // then it appears as literal text in the string. - buf.WriteString(quoted[:2]) - quoted = quoted[2:] - - case '\n': - // Ignore the escape and the line break. - quoted = quoted[2:] - - case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '\'', '"': - // One-char escape - buf.WriteByte(unesc[quoted[1]]) - quoted = quoted[2:] - - case '0', '1', '2', '3', '4', '5', '6', '7': - // Octal escape, up to 3 digits. - n := int(quoted[1] - '0') - quoted = quoted[2:] - for i := 1; i < 3; i++ { - if len(quoted) == 0 || quoted[0] < '0' || '7' < quoted[0] { - break - } - n = n*8 + int(quoted[0]-'0') - quoted = quoted[1:] - } - if n >= 256 { - // NOTE: Python silently discards the high bit, - // so that '\541' == '\141' == 'a'. - // Let's see if we can avoid doing that in BUILD files. - err = fmt.Errorf(`invalid escape sequence \%03o`, n) - return - } - buf.WriteByte(byte(n)) - - case 'x': - // Hexadecimal escape, exactly 2 digits. - if len(quoted) < 4 { - err = fmt.Errorf(`truncated escape sequence %s`, quoted) - return - } - n, err1 := strconv.ParseInt(quoted[2:4], 16, 0) - if err1 != nil { - err = fmt.Errorf(`invalid escape sequence %s`, quoted[:4]) - return - } - buf.WriteByte(byte(n)) - quoted = quoted[4:] - } - } - - s = buf.String() - return -} - -// indexByte returns the index of the first instance of b in s, or else -1. -func indexByte(s string, b byte) int { - for i := 0; i < len(s); i++ { - if s[i] == b { - return i - } - } - return -1 -} - -// hex is a list of the hexadecimal digits, for use in quoting. -// We always print lower-case hexadecimal. -const hex = "0123456789abcdef" - -// quote returns the quoted form of the string value "x". -// If triple is true, quote uses the triple-quoted form """x""". -func quote(unquoted string, triple bool) string { - q := `"` - if triple { - q = `"""` - } - - var buf bytes.Buffer - buf.WriteString(q) - - for i := 0; i < len(unquoted); i++ { - c := unquoted[i] - if c == '"' && triple && (i+1 < len(unquoted) && unquoted[i+1] != '"' || i+2 < len(unquoted) && unquoted[i+2] != '"') { - // Can pass up to two quotes through, because they are followed by a non-quote byte. - buf.WriteByte(c) - if i+1 < len(unquoted) && unquoted[i+1] == '"' { - buf.WriteByte(c) - i++ - } - continue - } - if triple && c == '\n' { - // Can allow newline in triple-quoted string. - buf.WriteByte(c) - continue - } - if c == '\'' { - // Can allow ' since we always use ". - buf.WriteByte(c) - continue - } - if c == '\\' { - if i+1 < len(unquoted) && indexByte(notEsc, unquoted[i+1]) >= 0 { - // Can pass \ through when followed by a byte that - // known not to be a valid escape sequence and also - // that does not trigger an escape sequence of its own. - // Use this, because various BUILD files do. - buf.WriteByte('\\') - buf.WriteByte(unquoted[i+1]) - i++ - continue - } - } - if esc[c] != 0 { - buf.WriteByte('\\') - buf.WriteByte(esc[c]) - continue - } - if c < 0x20 || c >= 0x80 { - // BUILD files are supposed to be Latin-1, so escape all control and high bytes. - // I'd prefer to use \x here, but Blaze does not implement - // \x in quoted strings (b/7272572). - buf.WriteByte('\\') - buf.WriteByte(hex[c>>6]) // actually octal but reusing hex digits 0-7. - buf.WriteByte(hex[(c>>3)&7]) - buf.WriteByte(hex[c&7]) - /* - buf.WriteByte('\\') - buf.WriteByte('x') - buf.WriteByte(hex[c>>4]) - buf.WriteByte(hex[c&0xF]) - */ - continue - } - buf.WriteByte(c) - continue - } - - buf.WriteString(q) - return buf.String() -} diff --git a/vendor/github.com/bazelbuild/buildtools/build/rewrite.go b/vendor/github.com/bazelbuild/buildtools/build/rewrite.go deleted file mode 100644 index 50fb7015a1a..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/build/rewrite.go +++ /dev/null @@ -1,1002 +0,0 @@ -/* -Copyright 2016 Google 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. -*/ -// Rewriting of high-level (not purely syntactic) BUILD constructs. - -package build - -import ( - "github.com/bazelbuild/buildtools/tables" - "path" - "path/filepath" - "regexp" - "sort" - "strings" -) - -// For debugging: flag to disable certain rewrites. -var DisableRewrites []string - -// disabled reports whether the named rewrite is disabled. -func disabled(name string) bool { - for _, x := range DisableRewrites { - if name == x { - return true - } - } - return false -} - -// For debugging: allow sorting of these lists even with sorting otherwise disabled. -var AllowSort []string - -// allowedSort reports whether sorting is allowed in the named context. -func allowedSort(name string) bool { - for _, x := range AllowSort { - if name == x { - return true - } - } - return false -} - -// Rewrite applies the high-level Buildifier rewrites to f, modifying it in place. -// If info is non-nil, Rewrite updates it with information about the rewrite. -func Rewrite(f *File, info *RewriteInfo) { - // Allocate an info so that helpers can assume it's there. - if info == nil { - info = new(RewriteInfo) - } - - for _, r := range rewrites { - if !disabled(r.name) { - if f.Type&r.scope != 0 { - r.fn(f, info) - } - } - } -} - -// RewriteInfo collects information about what Rewrite did. -type RewriteInfo struct { - EditLabel int // number of label strings edited - NameCall int // number of calls with argument names added - SortCall int // number of call argument lists sorted - SortStringList int // number of string lists sorted - UnsafeSort int // number of unsafe string lists sorted - SortLoad int // number of load argument lists sorted - FormatDocstrings int // number of reindented docstrings - ReorderArguments int // number of reordered function call arguments - EditOctal int // number of edited octals - Log []string // log entries - may change -} - -// Stats returns a map with statistics about applied rewrites -func (info *RewriteInfo) Stats() map[string]int { - return map[string]int{ - "label": info.EditLabel, - "callname": info.NameCall, - "callsort": info.SortCall, - "listsort": info.SortStringList, - "unsafesort": info.UnsafeSort, - "sortload": info.SortLoad, - "formatdocstrings": info.FormatDocstrings, - "reorderarguments": info.ReorderArguments, - "editoctal": info.EditOctal, - } -} - -// Each rewrite function can be either applied for BUILD files, other files (such as .bzl), -// or all files. -const ( - scopeDefault = TypeDefault | TypeBzl // .bzl and generic Starlark files - scopeBuild = TypeBuild | TypeWorkspace // BUILD and WORKSPACE files - scopeBoth = scopeDefault | scopeBuild -) - -// rewrites is the list of all Buildifier rewrites, in the order in which they are applied. -// The order here matters: for example, label canonicalization must happen -// before sorting lists of strings. -var rewrites = []struct { - name string - fn func(*File, *RewriteInfo) - scope FileType -}{ - {"callsort", sortCallArgs, scopeBuild}, - {"label", fixLabels, scopeBuild}, - {"listsort", sortStringLists, scopeBoth}, - {"multiplus", fixMultilinePlus, scopeBuild}, - {"loadsort", sortAllLoadArgs, scopeBoth}, - {"formatdocstrings", formatDocstrings, scopeBoth}, - {"reorderarguments", reorderArguments, scopeBoth}, - {"editoctal", editOctals, scopeBoth}, -} - -// DisableLoadSortForBuildFiles disables the loadsort transformation for BUILD files. -// This is a temporary function for backward compatibility, can be called if there's plenty of -// already formatted BUILD files that shouldn't be changed by the transformation. -func DisableLoadSortForBuildFiles() { - for i := range rewrites { - if rewrites[i].name == "loadsort" { - rewrites[i].scope = scopeDefault - break - } - } -} - -// leaveAlone reports whether any of the nodes on the stack are marked -// with a comment containing "buildifier: leave-alone". -func leaveAlone(stk []Expr, final Expr) bool { - for _, x := range stk { - if leaveAlone1(x) { - return true - } - } - if final != nil && leaveAlone1(final) { - return true - } - return false -} - -// hasComment reports whether x is marked with a comment that -// after being converted to lower case, contains the specified text. -func hasComment(x Expr, text string) bool { - for _, com := range x.Comment().Before { - if strings.Contains(strings.ToLower(com.Token), text) { - return true - } - } - return false -} - -// leaveAlone1 reports whether x is marked with a comment containing -// "buildifier: leave-alone", case-insensitive. -func leaveAlone1(x Expr) bool { - return hasComment(x, "buildifier: leave-alone") -} - -// doNotSort reports whether x is marked with a comment containing -// "do not sort", case-insensitive. -func doNotSort(x Expr) bool { - return hasComment(x, "do not sort") -} - -// keepSorted reports whether x is marked with a comment containing -// "keep sorted", case-insensitive. -func keepSorted(x Expr) bool { - return hasComment(x, "keep sorted") -} - -// fixLabels rewrites labels into a canonical form. -// -// First, it joins labels written as string addition, turning -// "//x" + ":y" (usually split across multiple lines) into "//x:y". -// -// Second, it removes redundant target qualifiers, turning labels like -// "//third_party/m4:m4" into "//third_party/m4" as well as ones like -// "@foo//:foo" into "@foo". -// -func fixLabels(f *File, info *RewriteInfo) { - joinLabel := func(p *Expr) { - add, ok := (*p).(*BinaryExpr) - if !ok || add.Op != "+" { - return - } - str1, ok := add.X.(*StringExpr) - if !ok || !strings.HasPrefix(str1.Value, "//") || strings.Contains(str1.Value, " ") { - return - } - str2, ok := add.Y.(*StringExpr) - if !ok || strings.Contains(str2.Value, " ") { - return - } - info.EditLabel++ - str1.Value += str2.Value - - // Deleting nodes add and str2. - // Merge comments from add, str1, and str2 and save in str1. - com1 := add.Comment() - com2 := str1.Comment() - com3 := str2.Comment() - com1.Before = append(com1.Before, com2.Before...) - com1.Before = append(com1.Before, com3.Before...) - com1.Suffix = append(com1.Suffix, com2.Suffix...) - com1.Suffix = append(com1.Suffix, com3.Suffix...) - *str1.Comment() = *com1 - - *p = str1 - } - - labelPrefix := "//" - if tables.StripLabelLeadingSlashes { - labelPrefix = "" - } - // labelRE matches label strings, e.g. @r//x/y/z:abc - // where $1 is @r//x/y/z, $2 is @r//, $3 is r, $4 is z, $5 is abc. - labelRE := regexp.MustCompile(`^(((?:@(\w+))?//|` + labelPrefix + `)(?:.+/)?([^:]*))(?::([^:]+))?$`) - - shortenLabel := func(v Expr) { - str, ok := v.(*StringExpr) - if !ok { - return - } - editPerformed := false - - if tables.StripLabelLeadingSlashes && strings.HasPrefix(str.Value, "//") { - if filepath.Dir(f.Path) == "." || !strings.HasPrefix(str.Value, "//:") { - editPerformed = true - str.Value = str.Value[2:] - } - } - - if tables.ShortenAbsoluteLabelsToRelative { - thisPackage := labelPrefix + filepath.Dir(f.Path) - // filepath.Dir on Windows uses backslashes as separators, while labels always have slashes. - if filepath.Separator != '/' { - thisPackage = strings.Replace(thisPackage, string(filepath.Separator), "/", -1) - } - - if str.Value == thisPackage { - editPerformed = true - str.Value = ":" + path.Base(str.Value) - } else if strings.HasPrefix(str.Value, thisPackage+":") { - editPerformed = true - str.Value = str.Value[len(thisPackage):] - } - } - - m := labelRE.FindStringSubmatch(str.Value) - if m == nil { - return - } - if m[4] != "" && m[4] == m[5] { // e.g. //foo:foo - editPerformed = true - str.Value = m[1] - } else if m[3] != "" && m[4] == "" && m[3] == m[5] { // e.g. @foo//:foo - editPerformed = true - str.Value = "@" + m[3] - } - if editPerformed { - info.EditLabel++ - } - } - - Walk(f, func(v Expr, stk []Expr) { - switch v := v.(type) { - case *CallExpr: - if leaveAlone(stk, v) { - return - } - for i := range v.List { - if leaveAlone1(v.List[i]) { - continue - } - as, ok := v.List[i].(*AssignExpr) - if !ok { - continue - } - key, ok := as.LHS.(*Ident) - if !ok || !tables.IsLabelArg[key.Name] || tables.LabelBlacklist[callName(v)+"."+key.Name] { - continue - } - if leaveAlone1(as.RHS) { - continue - } - if list, ok := as.RHS.(*ListExpr); ok { - for i := range list.List { - if leaveAlone1(list.List[i]) { - continue - } - joinLabel(&list.List[i]) - shortenLabel(list.List[i]) - } - } - if set, ok := as.RHS.(*SetExpr); ok { - for i := range set.List { - if leaveAlone1(set.List[i]) { - continue - } - joinLabel(&set.List[i]) - shortenLabel(set.List[i]) - } - } else { - joinLabel(&as.RHS) - shortenLabel(as.RHS) - } - } - } - }) -} - -// callName returns the name of the rule being called by call. -// If the call is not to a literal rule name, callName returns "". -func callName(call *CallExpr) string { - rule, ok := call.X.(*Ident) - if !ok { - return "" - } - return rule.Name -} - -// sortCallArgs sorts lists of named arguments to a call. -func sortCallArgs(f *File, info *RewriteInfo) { - Walk(f, func(v Expr, stk []Expr) { - call, ok := v.(*CallExpr) - if !ok { - return - } - if leaveAlone(stk, call) { - return - } - rule := callName(call) - if rule == "" { - return - } - - // Find the tail of the argument list with named arguments. - start := len(call.List) - for start > 0 && argName(call.List[start-1]) != "" { - start-- - } - - // Record information about each arg into a sortable list. - var args namedArgs - for i, x := range call.List[start:] { - name := argName(x) - args = append(args, namedArg{ruleNamePriority(rule, name), name, i, x}) - } - - // Sort the list and put the args back in the new order. - if sort.IsSorted(args) { - return - } - info.SortCall++ - sort.Sort(args) - for i, x := range args { - call.List[start+i] = x.expr - } - }) -} - -// ruleNamePriority maps a rule argument name to its sorting priority. -// It could use the auto-generated per-rule tables but for now it just -// falls back to the original list. -func ruleNamePriority(rule, arg string) int { - ruleArg := rule + "." + arg - if val, ok := tables.NamePriority[ruleArg]; ok { - return val - } - return tables.NamePriority[arg] - /* - list := ruleArgOrder[rule] - if len(list) == 0 { - return tables.NamePriority[arg] - } - for i, x := range list { - if x == arg { - return i - } - } - return len(list) - */ -} - -// If x is of the form key=value, argName returns the string key. -// Otherwise argName returns "". -func argName(x Expr) string { - if as, ok := x.(*AssignExpr); ok { - if id, ok := as.LHS.(*Ident); ok { - return id.Name - } - } - return "" -} - -// A namedArg records information needed for sorting -// a named call argument into its proper position. -type namedArg struct { - priority int // kind of name; first sort key - name string // name; second sort key - index int // original index; final sort key - expr Expr // name=value argument -} - -// namedArgs is a slice of namedArg that implements sort.Interface -type namedArgs []namedArg - -func (x namedArgs) Len() int { return len(x) } -func (x namedArgs) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -func (x namedArgs) Less(i, j int) bool { - p := x[i] - q := x[j] - if p.priority != q.priority { - return p.priority < q.priority - } - if p.name != q.name { - return p.name < q.name - } - return p.index < q.index -} - -// sortStringLists sorts lists of string literals used as specific rule arguments. -func sortStringLists(f *File, info *RewriteInfo) { - Walk(f, func(v Expr, stk []Expr) { - switch v := v.(type) { - case *CallExpr: - if leaveAlone(stk, v) { - return - } - rule := callName(v) - for _, arg := range v.List { - if leaveAlone1(arg) { - continue - } - as, ok := arg.(*AssignExpr) - if !ok || leaveAlone1(as) || doNotSort(as) { - continue - } - key, ok := as.LHS.(*Ident) - if !ok { - continue - } - context := rule + "." + key.Name - if !tables.IsSortableListArg[key.Name] || tables.SortableBlacklist[context] || f.Type == TypeDefault || f.Type == TypeBzl { - continue - } - if disabled("unsafesort") && !tables.SortableWhitelist[context] && !allowedSort(context) { - continue - } - sortStringList(as.RHS, info, context) - } - case *AssignExpr: - if disabled("unsafesort") { - return - } - // "keep sorted" comment on x = list forces sorting of list. - as := v - if keepSorted(as) { - sortStringList(as.RHS, info, "?") - } - case *KeyValueExpr: - if disabled("unsafesort") { - return - } - // "keep sorted" before key: list also forces sorting of list. - if keepSorted(v) { - sortStringList(v.Value, info, "?") - } - case *ListExpr: - if disabled("unsafesort") { - return - } - // "keep sorted" comment above first list element also forces sorting of list. - if len(v.List) > 0 && (keepSorted(v) || keepSorted(v.List[0])) { - sortStringList(v, info, "?") - } - } - }) -} - -// SortStringList sorts x, a list of strings. -func SortStringList(x Expr) { - sortStringList(x, nil, "") -} - -// sortStringList sorts x, a list of strings. -// The list is broken by non-strings and by blank lines and comments into chunks. -// Each chunk is sorted in place. -func sortStringList(x Expr, info *RewriteInfo, context string) { - list, ok := x.(*ListExpr) - if !ok || len(list.List) < 2 || doNotSort(list.List[0]) { - return - } - - forceSort := keepSorted(list) || keepSorted(list.List[0]) - - // TODO(bazel-team): Decide how to recognize lists that cannot - // be sorted. Avoiding all lists with comments avoids sorting - // lists that say explicitly, in some form or another, why they - // cannot be sorted. For example, many cc_test rules require - // certain order in their deps attributes. - if !forceSort { - if line, _ := hasComments(list); line { - return - } - } - - // Sort chunks of the list with no intervening blank lines or comments. - for i := 0; i < len(list.List); { - if _, ok := list.List[i].(*StringExpr); !ok { - i++ - continue - } - - j := i + 1 - for ; j < len(list.List); j++ { - if str, ok := list.List[j].(*StringExpr); !ok || len(str.Before) > 0 { - break - } - } - - var chunk []stringSortKey - for index, x := range list.List[i:j] { - chunk = append(chunk, makeSortKey(index, x.(*StringExpr))) - } - if !sort.IsSorted(byStringExpr(chunk)) || !isUniq(chunk) { - if info != nil { - info.SortStringList++ - if !tables.SortableWhitelist[context] { - info.UnsafeSort++ - info.Log = append(info.Log, "sort:"+context) - } - } - before := chunk[0].x.Comment().Before - chunk[0].x.Comment().Before = nil - - sort.Sort(byStringExpr(chunk)) - chunk = uniq(chunk) - - chunk[0].x.Comment().Before = before - for offset, key := range chunk { - list.List[i+offset] = key.x - } - list.List = append(list.List[:(i+len(chunk))], list.List[j:]...) - } - - i = j - } -} - -// uniq removes duplicates from a list, which must already be sorted. -// It edits the list in place. -func uniq(sortedList []stringSortKey) []stringSortKey { - out := sortedList[:0] - for _, sk := range sortedList { - if len(out) == 0 || sk.value != out[len(out)-1].value { - out = append(out, sk) - } - } - return out -} - -// isUniq reports whether the sorted list only contains unique elements. -func isUniq(list []stringSortKey) bool { - for i := range list { - if i+1 < len(list) && list[i].value == list[i+1].value { - return false - } - } - return true -} - -// If stk describes a call argument like rule(arg=...), callArgName -// returns the name of that argument, formatted as "rule.arg". -func callArgName(stk []Expr) string { - n := len(stk) - if n < 2 { - return "" - } - arg := argName(stk[n-1]) - if arg == "" { - return "" - } - call, ok := stk[n-2].(*CallExpr) - if !ok { - return "" - } - rule, ok := call.X.(*Ident) - if !ok { - return "" - } - return rule.Name + "." + arg -} - -// A stringSortKey records information about a single string literal to be -// sorted. The strings are first grouped into four phases: most strings, -// strings beginning with ":", strings beginning with "//", and strings -// beginning with "@". The next significant part of the comparison is the list -// of elements in the value, where elements are split at `.' and `:'. Finally -// we compare by value and break ties by original index. -type stringSortKey struct { - phase int - split []string - value string - original int - x Expr -} - -func makeSortKey(index int, x *StringExpr) stringSortKey { - key := stringSortKey{ - value: x.Value, - original: index, - x: x, - } - - switch { - case strings.HasPrefix(x.Value, ":"): - key.phase = 1 - case strings.HasPrefix(x.Value, "//") || (tables.StripLabelLeadingSlashes && !strings.HasPrefix(x.Value, "@")): - key.phase = 2 - case strings.HasPrefix(x.Value, "@"): - key.phase = 3 - } - - key.split = strings.Split(strings.Replace(x.Value, ":", ".", -1), ".") - return key -} - -// byStringExpr implements sort.Interface for a list of stringSortKey. -type byStringExpr []stringSortKey - -func (x byStringExpr) Len() int { return len(x) } -func (x byStringExpr) Swap(i, j int) { x[i], x[j] = x[j], x[i] } - -func (x byStringExpr) Less(i, j int) bool { - xi := x[i] - xj := x[j] - - if xi.phase != xj.phase { - return xi.phase < xj.phase - } - for k := 0; k < len(xi.split) && k < len(xj.split); k++ { - if xi.split[k] != xj.split[k] { - return xi.split[k] < xj.split[k] - } - } - if len(xi.split) != len(xj.split) { - return len(xi.split) < len(xj.split) - } - if xi.value != xj.value { - return xi.value < xj.value - } - return xi.original < xj.original -} - -// fixMultilinePlus turns -// -// ... + -// [ ... ] -// -// ... + -// call(...) -// -// into -// ... + [ -// ... -// ] -// -// ... + call( -// ... -// ) -// -// which typically works better with our aggressively compact formatting. -func fixMultilinePlus(f *File, info *RewriteInfo) { - - // List manipulation helpers. - // As a special case, we treat f([...]) as a list, mainly - // for glob. - - // isList reports whether x is a list. - var isList func(x Expr) bool - isList = func(x Expr) bool { - switch x := x.(type) { - case *ListExpr: - return true - case *CallExpr: - if len(x.List) == 1 { - return isList(x.List[0]) - } - } - return false - } - - // isMultiLine reports whether x is a multiline list. - var isMultiLine func(Expr) bool - isMultiLine = func(x Expr) bool { - switch x := x.(type) { - case *ListExpr: - return x.ForceMultiLine || len(x.List) > 1 - case *CallExpr: - if x.ForceMultiLine || len(x.List) > 1 && !x.ForceCompact { - return true - } - if len(x.List) == 1 { - return isMultiLine(x.List[0]) - } - } - return false - } - - // forceMultiLine tries to force the list x to use a multiline form. - // It reports whether it was successful. - var forceMultiLine func(Expr) bool - forceMultiLine = func(x Expr) bool { - switch x := x.(type) { - case *ListExpr: - // Already multi line? - if x.ForceMultiLine { - return true - } - // If this is a list containing a list, force the - // inner list to be multiline instead. - if len(x.List) == 1 && forceMultiLine(x.List[0]) { - return true - } - x.ForceMultiLine = true - return true - - case *CallExpr: - if len(x.List) == 1 { - return forceMultiLine(x.List[0]) - } - } - return false - } - - skip := map[Expr]bool{} - Walk(f, func(v Expr, stk []Expr) { - if skip[v] { - return - } - bin, ok := v.(*BinaryExpr) - if !ok || bin.Op != "+" { - return - } - - // Found a +. - // w + x + y + z parses as ((w + x) + y) + z, - // so chase down the left side to make a list of - // all the things being added together, separated - // by the BinaryExprs that join them. - // Mark them as "skip" so that when Walk recurses - // into the subexpressions, we won't reprocess them. - var all []Expr - for { - all = append(all, bin.Y, bin) - bin1, ok := bin.X.(*BinaryExpr) - if !ok || bin1.Op != "+" { - break - } - bin = bin1 - skip[bin] = true - } - all = append(all, bin.X) - - // Because the outermost expression was the - // rightmost one, the list is backward. Reverse it. - for i, j := 0, len(all)-1; i < j; i, j = i+1, j-1 { - all[i], all[j] = all[j], all[i] - } - - // The 'all' slice is alternating addends and BinaryExpr +'s: - // w, +, x, +, y, +, z - // If there are no lists involved, don't rewrite anything. - haveList := false - for i := 0; i < len(all); i += 2 { - if isList(all[i]) { - haveList = true - break - } - } - if !haveList { - return - } - - // Okay, there are lists. - // Consider each + next to a line break. - for i := 1; i < len(all); i += 2 { - bin := all[i].(*BinaryExpr) - if !bin.LineBreak { - continue - } - - // We're going to break the line after the +. - // If it is followed by a list, force that to be - // multiline instead. - if forceMultiLine(all[i+1]) { - bin.LineBreak = false - continue - } - - // If the previous list was multiline already, - // don't bother with the line break after - // the +. - if isMultiLine(all[i-1]) { - bin.LineBreak = false - continue - } - } - }) -} - -// sortAllLoadArgs sorts all load arguments in the file -func sortAllLoadArgs(f *File, info *RewriteInfo) { - Walk(f, func(v Expr, stk []Expr) { - if load, ok := v.(*LoadStmt); ok { - if SortLoadArgs(load) { - info.SortLoad++ - } - } - }) -} - -// hasComments reports whether any comments are associated with -// the list or its elements. -func hasComments(list *ListExpr) (line, suffix bool) { - com := list.Comment() - if len(com.Before) > 0 || len(com.After) > 0 || len(list.End.Before) > 0 { - line = true - } - if len(com.Suffix) > 0 { - suffix = true - } - for _, elem := range list.List { - com := elem.Comment() - if len(com.Before) > 0 { - line = true - } - if len(com.Suffix) > 0 { - suffix = true - } - } - return -} - -// A wrapper for a LoadStmt's From and To slices for consistent sorting of their contents. -// It's assumed that the following slices have the same length. The contents are sorted by -// the `To` attribute, but all items with equal "From" and "To" parts are placed before the items -// with different parts. -type loadArgs struct { - From []*Ident - To []*Ident - modified bool -} - -func (args loadArgs) Len() int { - return len(args.From) -} - -func (args loadArgs) Swap(i, j int) { - args.From[i], args.From[j] = args.From[j], args.From[i] - args.To[i], args.To[j] = args.To[j], args.To[i] - args.modified = true -} - -func (args loadArgs) Less(i, j int) bool { - // Arguments with equal "from" and "to" parts are prioritized - equalI := args.From[i].Name == args.To[i].Name - equalJ := args.From[j].Name == args.To[j].Name - if equalI != equalJ { - // If equalI and !equalJ, return true, otherwise false. - // Equivalently, return equalI. - return equalI - } - return args.To[i].Name < args.To[j].Name -} - -// SortLoadArgs sorts a load statement arguments (lexicographically, but positional first) -func SortLoadArgs(load *LoadStmt) bool { - args := loadArgs{From: load.From, To: load.To} - sort.Sort(args) - return args.modified -} - -// formatDocstrings fixes the indentation and trailing whitespace of docstrings -func formatDocstrings(f *File, info *RewriteInfo) { - Walk(f, func(v Expr, stk []Expr) { - def, ok := v.(*DefStmt) - if !ok || len(def.Body) == 0 { - return - } - docstring, ok := def.Body[0].(*StringExpr) - if !ok || !docstring.TripleQuote { - return - } - - oldIndentation := docstring.Start.LineRune - 1 // LineRune starts with 1 - newIndentation := nestedIndentation * len(stk) - - // Operate on Token, not Value, because their line breaks can be different if a line ends with - // a backslash. - updatedToken := formatString(docstring.Token, oldIndentation, newIndentation) - if updatedToken != docstring.Token { - docstring.Token = updatedToken - // Update the value to keep it consistent with Token - docstring.Value, _, _ = Unquote(updatedToken) - info.FormatDocstrings++ - } - }) -} - -// formatString modifies a string value of a docstring to match the new indentation level and -// to remove trailing whitespace from its lines. -func formatString(value string, oldIndentation, newIndentation int) string { - difference := newIndentation - oldIndentation - lines := strings.Split(value, "\n") - for i, line := range lines { - if i == 0 { - // The first line shouldn't be touched because it starts right after ''' or """ - continue - } - if difference > 0 { - line = strings.Repeat(" ", difference) + line - } else { - for i, rune := range line { - if i == -difference || rune != ' ' { - line = line[i:] - break - } - } - } - if i != len(lines)-1 { - // Remove trailing space from the line unless it's the last line that's responsible - // for the indentation of the closing `"""` - line = strings.TrimRight(line, " ") - } - lines[i] = line - } - return strings.Join(lines, "\n") -} - -// argumentType returns an integer by which funcall arguments can be sorted: -// 1 for positional, 2 for named, 3 for *args, 4 for **kwargs -func argumentType(expr Expr) int { - switch expr := expr.(type) { - case *UnaryExpr: - switch expr.Op { - case "**": - return 4 - case "*": - return 3 - } - case *AssignExpr: - return 2 - } - return 1 -} - -// reorderArguments fixes the order of arguments of a function call -// (positional, named, *args, **kwargs) -func reorderArguments(f *File, info *RewriteInfo) { - Walk(f, func(expr Expr, stack []Expr) { - call, ok := expr.(*CallExpr) - if !ok { - return - } - compare := func(i, j int) bool { - return argumentType(call.List[i]) < argumentType(call.List[j]) - } - if !sort.SliceIsSorted(call.List, compare) { - sort.SliceStable(call.List, compare) - info.ReorderArguments++ - } - }) -} - -// editOctals inserts 'o' into octal numbers to make it more obvious they are octal -// 0123 -> 0o123 -func editOctals(f *File, info *RewriteInfo) { - Walk(f, func(expr Expr, stack []Expr) { - l, ok := expr.(*LiteralExpr) - if !ok { - return - } - if len(l.Token) > 1 && l.Token[0] == '0' && l.Token[1] >= '0' && l.Token[1] <= '9' { - l.Token = "0o" + l.Token[1:] - info.EditOctal++ - } - }) -} diff --git a/vendor/github.com/bazelbuild/buildtools/build/rule.go b/vendor/github.com/bazelbuild/buildtools/build/rule.go deleted file mode 100644 index 7fe24344256..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/build/rule.go +++ /dev/null @@ -1,338 +0,0 @@ -/* -Copyright 2016 Google 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. -*/ - -// Rule-level API for inspecting and modifying a build.File syntax tree. - -package build - -import ( - "path/filepath" - "strings" -) - -// A Rule represents a single BUILD rule. -type Rule struct { - Call *CallExpr - ImplicitName string // The name which should be used if the name attribute is not set. See the comment on File.implicitRuleName. -} - -// NewRule is a simple constructor for Rule. -func NewRule(call *CallExpr) *Rule { - return &Rule{call, ""} -} - -func (f *File) Rule(call *CallExpr) *Rule { - r := &Rule{call, ""} - if r.AttrString("name") == "" { - r.ImplicitName = f.implicitRuleName() - } - return r -} - -// Rules returns the rules in the file of the given kind (such as "go_library"). -// If kind == "", Rules returns all rules in the file. -func (f *File) Rules(kind string) []*Rule { - var all []*Rule - - for _, stmt := range f.Stmt { - Walk(stmt, func(x Expr, stk []Expr) { - call, ok := x.(*CallExpr) - if !ok { - return - } - - // Skip nested calls. - for _, frame := range stk { - if _, ok := frame.(*CallExpr); ok { - return - } - } - - // Check if the rule kind is correct. - rule := f.Rule(call) - if kind != "" && rule.Kind() != kind { - return - } - all = append(all, rule) - }) - } - - return all -} - -// RuleAt returns the rule in the file that starts at the specified line, or null if no such rule. -func (f *File) RuleAt(linenum int) *Rule { - - for _, stmt := range f.Stmt { - call, ok := stmt.(*CallExpr) - if !ok { - continue - } - start, end := call.X.Span() - if start.Line <= linenum && linenum <= end.Line { - return f.Rule(call) - } - } - return nil -} - -// DelRules removes rules with the given kind and name from the file. -// An empty kind matches all kinds; an empty name matches all names. -// It returns the number of rules that were deleted. -func (f *File) DelRules(kind, name string) int { - var i int - for _, stmt := range f.Stmt { - if call, ok := stmt.(*CallExpr); ok { - r := f.Rule(call) - if (kind == "" || r.Kind() == kind) && - (name == "" || r.Name() == name) { - continue - } - } - f.Stmt[i] = stmt - i++ - } - n := len(f.Stmt) - i - f.Stmt = f.Stmt[:i] - return n -} - -// If a build file contains exactly one unnamed rule, and no rules in the file explicitly have the -// same name as the name of the directory the build file is in, we treat the unnamed rule as if it -// had the name of the directory containing the BUILD file. -// This is following a convention used in the Pants build system to cut down on boilerplate. -func (f *File) implicitRuleName() string { - // We disallow empty names in the top-level BUILD files. - dir := filepath.Dir(f.Path) - if dir == "." { - return "" - } - sawAnonymousRule := false - possibleImplicitName := filepath.Base(dir) - - for _, stmt := range f.Stmt { - call, ok := stmt.(*CallExpr) - if !ok { - continue - } - temp := &Rule{call, ""} - if temp.AttrString("name") == possibleImplicitName { - // A target explicitly has the name of the dir, so no implicit targets are allowed. - return "" - } - if temp.Kind() != "" && temp.AttrString("name") == "" { - if sawAnonymousRule { - return "" - } - sawAnonymousRule = true - } - } - if sawAnonymousRule { - return possibleImplicitName - } - return "" -} - -// Kind returns the rule's kind (such as "go_library"). -// The kind of the rule may be given by a literal or it may be a sequence of dot expressions that -// begins with a literal, if the call expression does not conform to either of these forms, an -// empty string will be returned -func (r *Rule) Kind() string { - var names []string - expr := r.Call.X - for { - x, ok := expr.(*DotExpr) - if !ok { - break - } - names = append(names, x.Name) - expr = x.X - } - x, ok := expr.(*Ident) - if !ok { - return "" - } - names = append(names, x.Name) - // Reverse the elements since the deepest expression contains the leading literal - for l, r := 0, len(names)-1; l < r; l, r = l+1, r-1 { - names[l], names[r] = names[r], names[l] - } - return strings.Join(names, ".") -} - -// SetKind changes rule's kind (such as "go_library"). -func (r *Rule) SetKind(kind string) { - names := strings.Split(kind, ".") - var expr Expr - expr = &Ident{Name: names[0]} - for _, name := range names[1:] { - expr = &DotExpr{X: expr, Name: name} - } - r.Call.X = expr -} - -// ExplicitName returns the rule's target name if it's explicitly provided as a string value, "" otherwise. -func (r *Rule) ExplicitName() string { - return r.AttrString("name") -} - -// Name returns the rule's target name. -// If the rule has no explicit target name, Name returns the implicit name if there is one, else the empty string. -func (r *Rule) Name() string { - explicitName := r.ExplicitName() - if explicitName == "" && r.Kind() != "package" { - return r.ImplicitName - } - return explicitName -} - -// AttrKeys returns the keys of all the rule's attributes. -func (r *Rule) AttrKeys() []string { - var keys []string - for _, expr := range r.Call.List { - if as, ok := expr.(*AssignExpr); ok { - if keyExpr, ok := as.LHS.(*Ident); ok { - keys = append(keys, keyExpr.Name) - } - } - } - return keys -} - -// AttrDefn returns the AssignExpr defining the rule's attribute with the given key. -// If the rule has no such attribute, AttrDefn returns nil. -func (r *Rule) AttrDefn(key string) *AssignExpr { - for _, kv := range r.Call.List { - as, ok := kv.(*AssignExpr) - if !ok { - continue - } - k, ok := as.LHS.(*Ident) - if !ok || k.Name != key { - continue - } - return as - } - return nil -} - -// Attr returns the value of the rule's attribute with the given key -// (such as "name" or "deps"). -// If the rule has no such attribute, Attr returns nil. -func (r *Rule) Attr(key string) Expr { - as := r.AttrDefn(key) - if as == nil { - return nil - } - return as.RHS -} - -// DelAttr deletes the rule's attribute with the named key. -// It returns the old value of the attribute, or nil if the attribute was not found. -func (r *Rule) DelAttr(key string) Expr { - list := r.Call.List - for i, kv := range list { - as, ok := kv.(*AssignExpr) - if !ok { - continue - } - k, ok := as.LHS.(*Ident) - if !ok || k.Name != key { - continue - } - copy(list[i:], list[i+1:]) - r.Call.List = list[:len(list)-1] - return as.RHS - } - return nil -} - -// SetAttr sets the rule's attribute with the given key to value. -// If the rule has no attribute with the key, SetAttr appends -// one to the end of the rule's attribute list. -func (r *Rule) SetAttr(key string, val Expr) { - as := r.AttrDefn(key) - if as != nil { - as.RHS = val - return - } - - r.Call.List = append(r.Call.List, - &AssignExpr{ - LHS: &Ident{Name: key}, - Op: "=", - RHS: val, - }, - ) -} - -// AttrLiteral returns the literal form of the rule's attribute -// with the given key (such as "cc_api_version"), only when -// that value is an identifier or number. -// If the rule has no such attribute or the attribute is not an identifier or number, -// AttrLiteral returns "". -func (r *Rule) AttrLiteral(key string) string { - value := r.Attr(key) - if ident, ok := value.(*Ident); ok { - return ident.Name - } - if literal, ok := value.(*LiteralExpr); ok { - return literal.Token - } - return "" -} - -// AttrString returns the value of the rule's attribute -// with the given key (such as "name"), as a string. -// If the rule has no such attribute or the attribute has a non-string value, -// Attr returns the empty string. -func (r *Rule) AttrString(key string) string { - str, ok := r.Attr(key).(*StringExpr) - if !ok { - return "" - } - return str.Value -} - -// AttrStrings returns the value of the rule's attribute -// with the given key (such as "srcs"), as a []string. -// If the rule has no such attribute or the attribute is not -// a list of strings, AttrStrings returns a nil slice. -func (r *Rule) AttrStrings(key string) []string { - return Strings(r.Attr(key)) -} - -// Strings returns expr as a []string. -// If expr is not a list of string literals, -// Strings returns a nil slice instead. -// If expr is an empty list of string literals, -// returns a non-nil empty slice. -// (this allows differentiating between these two cases) -func Strings(expr Expr) []string { - list, ok := expr.(*ListExpr) - if !ok { - return nil - } - all := []string{} // not nil - for _, l := range list.List { - str, ok := l.(*StringExpr) - if !ok { - return nil - } - all = append(all, str.Value) - } - return all -} diff --git a/vendor/github.com/bazelbuild/buildtools/build/syntax.go b/vendor/github.com/bazelbuild/buildtools/build/syntax.go deleted file mode 100644 index b7688219a8e..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/build/syntax.go +++ /dev/null @@ -1,571 +0,0 @@ -/* -Copyright 2016 Google 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 build implements parsing and printing of BUILD files. -package build - -// Syntax data structure definitions. - -import ( - "strings" - "unicode/utf8" -) - -// A Position describes the position between two bytes of input. -type Position struct { - Line int // line in input (starting at 1) - LineRune int // rune in line (starting at 1) - Byte int // byte in input (starting at 0) -} - -// add returns the position at the end of s, assuming it starts at p. -func (p Position) add(s string) Position { - p.Byte += len(s) - if n := strings.Count(s, "\n"); n > 0 { - p.Line += n - s = s[strings.LastIndex(s, "\n")+1:] - p.LineRune = 1 - } - p.LineRune += utf8.RuneCountInString(s) - return p -} - -// An Expr represents an input element. -type Expr interface { - // Span returns the start and end position of the expression, - // excluding leading or trailing comments. - Span() (start, end Position) - - // Comment returns the comments attached to the expression. - // This method would normally be named 'Comments' but that - // would interfere with embedding a type of the same name. - Comment() *Comments -} - -// A Comment represents a single # comment. -type Comment struct { - Start Position - Token string // without trailing newline -} - -// Comments collects the comments associated with an expression. -type Comments struct { - Before []Comment // whole-line comments before this expression - Suffix []Comment // end-of-line comments after this expression - - // For top-level expressions only, After lists whole-line - // comments following the expression. - After []Comment -} - -// Comment returns the receiver. This isn't useful by itself, but -// a Comments struct is embedded into all the expression -// implementation types, and this gives each of those a Comment -// method to satisfy the Expr interface. -func (c *Comments) Comment() *Comments { - return c -} - -// stmtsEnd returns the end position of the last non-nil statement -func stmtsEnd(stmts []Expr) Position { - for i := len(stmts) - 1; i >= 0; i-- { - if stmts[i] != nil { - _, end := stmts[i].Span() - return end - } - } - return Position{} -} - -// A File represents an entire BUILD or .bzl file. -type File struct { - Path string // file path, relative to workspace directory - Pkg string // optional; the package of the file - Type FileType - Comments - Stmt []Expr -} - -// DisplayPath returns the filename if it's not empty, "" otherwise -func (f *File) DisplayPath() string { - if f.Path == "" { - return "" - } - return f.Path -} - -func (f *File) Span() (start, end Position) { - if len(f.Stmt) == 0 { - p := Position{Line: 1, LineRune: 1} - return p, p - } - start = Position{} - end = stmtsEnd(f.Stmt) - return start, end -} - -// A CommentBlock represents a top-level block of comments separate -// from any rule. -type CommentBlock struct { - Comments - Start Position -} - -func (x *CommentBlock) Span() (start, end Position) { - return x.Start, x.Start -} - -// An Ident represents an identifier. -type Ident struct { - Comments - NamePos Position - Name string -} - -func (x *Ident) Span() (start, end Position) { - return x.NamePos, x.NamePos.add(x.Name) -} - -// BranchStmt represents a `pass`, `break`, or `continue` statement. -type BranchStmt struct { - Comments - Token string // pass, break, continue - TokenPos Position -} - -func (x *BranchStmt) Span() (start, end Position) { - return x.TokenPos, x.TokenPos.add(x.Token) -} - -func (x *Ident) asString() *StringExpr { - _, end := x.Span() - return &StringExpr{ - Comments: x.Comments, - Start: x.NamePos, - Value: x.Name, - End: end, - } -} - -// A LiteralExpr represents a literal number. -type LiteralExpr struct { - Comments - Start Position - Token string // identifier token -} - -func (x *LiteralExpr) Span() (start, end Position) { - return x.Start, x.Start.add(x.Token) -} - -// A StringExpr represents a single literal string. -type StringExpr struct { - Comments - Start Position - Value string // string value (decoded) - TripleQuote bool // triple quote output - End Position - - // To allow specific formatting of string literals, - // at least within our requirements, record the - // preferred form of Value. This field is a hint: - // it is only used if it is a valid quoted form for Value. - Token string -} - -func (x *StringExpr) Span() (start, end Position) { - return x.Start, x.End -} - -// An End represents the end of a parenthesized or bracketed expression. -// It is a place to hang comments. -type End struct { - Comments - Pos Position -} - -func (x *End) Span() (start, end Position) { - return x.Pos, x.Pos.add(")") -} - -// A CallExpr represents a function call expression: X(List). -type CallExpr struct { - Comments - X Expr - ListStart Position // position of ( - List []Expr - End // position of ) - ForceCompact bool // force compact (non-multiline) form when printing - ForceMultiLine bool // force multiline form when printing -} - -func (x *CallExpr) Span() (start, end Position) { - start, _ = x.X.Span() - return start, x.End.Pos.add(")") -} - -// A DotExpr represents a field selector: X.Name. -type DotExpr struct { - Comments - X Expr - Dot Position - NamePos Position - Name string -} - -func (x *DotExpr) Span() (start, end Position) { - start, _ = x.X.Span() - return start, x.NamePos.add(x.Name) -} - -// A Comprehension represents a list comprehension expression: [X for ... if ...]. -type Comprehension struct { - Comments - Curly bool // curly braces (as opposed to square brackets) - Lbrack Position - Body Expr - Clauses []Expr // = *ForClause | *IfClause - ForceMultiLine bool // split expression across multiple lines - End -} - -func (x *Comprehension) Span() (start, end Position) { - return x.Lbrack, x.End.Pos.add("]") -} - -// A ForClause represents a for clause in a list comprehension: for Var in Expr. -type ForClause struct { - Comments - For Position - Vars Expr - In Position - X Expr -} - -func (x *ForClause) Span() (start, end Position) { - _, end = x.X.Span() - return x.For, end -} - -// An IfClause represents an if clause in a list comprehension: if Cond. -type IfClause struct { - Comments - If Position - Cond Expr -} - -func (x *IfClause) Span() (start, end Position) { - _, end = x.Cond.Span() - return x.If, end -} - -// A KeyValueExpr represents a dictionary entry: Key: Value. -type KeyValueExpr struct { - Comments - Key Expr - Colon Position - Value Expr -} - -func (x *KeyValueExpr) Span() (start, end Position) { - start, _ = x.Key.Span() - _, end = x.Value.Span() - return start, end -} - -// A DictExpr represents a dictionary literal: { List }. -type DictExpr struct { - Comments - Start Position - List []Expr // all *KeyValueExprs - End - ForceMultiLine bool // force multiline form when printing -} - -func (x *DictExpr) Span() (start, end Position) { - return x.Start, x.End.Pos.add("}") -} - -// A ListExpr represents a list literal: [ List ]. -type ListExpr struct { - Comments - Start Position - List []Expr - End - ForceMultiLine bool // force multiline form when printing -} - -func (x *ListExpr) Span() (start, end Position) { - return x.Start, x.End.Pos.add("]") -} - -// A SetExpr represents a set literal: { List }. -type SetExpr struct { - Comments - Start Position - List []Expr - End - ForceMultiLine bool // force multiline form when printing -} - -func (x *SetExpr) Span() (start, end Position) { - return x.Start, x.End.Pos.add("}") -} - -// A TupleExpr represents a tuple literal: (List) -type TupleExpr struct { - Comments - NoBrackets bool // true if a tuple has no brackets, e.g. `a, b = x` - Start Position - List []Expr - End - ForceCompact bool // force compact (non-multiline) form when printing - ForceMultiLine bool // force multiline form when printing -} - -func (x *TupleExpr) Span() (start, end Position) { - if !x.NoBrackets { - return x.Start, x.End.Pos.add(")") - } - start, _ = x.List[0].Span() - _, end = x.List[len(x.List)-1].Span() - return start, end -} - -// A UnaryExpr represents a unary expression: Op X. -type UnaryExpr struct { - Comments - OpStart Position - Op string - X Expr -} - -func (x *UnaryExpr) Span() (start, end Position) { - if x.X == nil { - return x.OpStart, x.OpStart - } - _, end = x.X.Span() - return x.OpStart, end -} - -// A BinaryExpr represents a binary expression: X Op Y. -type BinaryExpr struct { - Comments - X Expr - OpStart Position - Op string - LineBreak bool // insert line break between Op and Y - Y Expr -} - -func (x *BinaryExpr) Span() (start, end Position) { - start, _ = x.X.Span() - _, end = x.Y.Span() - return start, end -} - -// An AssignExpr represents a binary expression with `=`: LHS = RHS. -type AssignExpr struct { - Comments - LHS Expr - OpPos Position - Op string - LineBreak bool // insert line break between Op and RHS - RHS Expr -} - -func (x *AssignExpr) Span() (start, end Position) { - start, _ = x.LHS.Span() - _, end = x.RHS.Span() - return start, end -} - -// A ParenExpr represents a parenthesized expression: (X). -type ParenExpr struct { - Comments - Start Position - X Expr - End - ForceMultiLine bool // insert line break after opening ( and before closing ) -} - -func (x *ParenExpr) Span() (start, end Position) { - return x.Start, x.End.Pos.add(")") -} - -// A SliceExpr represents a slice expression: expr[from:to] or expr[from:to:step] . -type SliceExpr struct { - Comments - X Expr - SliceStart Position - From Expr - FirstColon Position - To Expr - SecondColon Position - Step Expr - End Position -} - -func (x *SliceExpr) Span() (start, end Position) { - start, _ = x.X.Span() - return start, x.End.add("]") -} - -// An IndexExpr represents an index expression: X[Y]. -type IndexExpr struct { - Comments - X Expr - IndexStart Position - Y Expr - End Position -} - -func (x *IndexExpr) Span() (start, end Position) { - start, _ = x.X.Span() - return start, x.End.add("]") -} - -// A Function represents the common parts of LambdaExpr and DefStmt -type Function struct { - Comments - StartPos Position // position of DEF or LAMBDA token - Params []Expr - Body []Expr -} - -func (x *Function) Span() (start, end Position) { - _, end = x.Body[len(x.Body)-1].Span() - return x.StartPos, end -} - -// A LambdaExpr represents a lambda expression: lambda Var: Expr. -type LambdaExpr struct { - Comments - Function -} - -func (x *LambdaExpr) Span() (start, end Position) { - return x.Function.Span() -} - -// ConditionalExpr represents the conditional: X if TEST else ELSE. -type ConditionalExpr struct { - Comments - Then Expr - IfStart Position - Test Expr - ElseStart Position - Else Expr -} - -// Span returns the start and end position of the expression, -// excluding leading or trailing comments. -func (x *ConditionalExpr) Span() (start, end Position) { - start, _ = x.Then.Span() - _, end = x.Else.Span() - return start, end -} - -// A LoadStmt loads another module and binds names from it: -// load(Module, "x", y="foo"). -// -// The AST is slightly unfaithful to the concrete syntax here because -// Skylark's load statement, so that it can be implemented in Python, -// binds some names (like y above) with an identifier and some (like x) -// without. For consistency we create fake identifiers for all the -// strings. -type LoadStmt struct { - Comments - Load Position - Module *StringExpr - From []*Ident // name defined in loading module - To []*Ident // name in loaded module - Rparen End - ForceCompact bool // force compact (non-multiline) form when printing -} - -func (x *LoadStmt) Span() (start, end Position) { - return x.Load, x.Rparen.Pos.add(")") -} - -// A DefStmt represents a function definition expression: def foo(List):. -type DefStmt struct { - Comments - Function - Name string - ColonPos Position // position of the ":" - ForceCompact bool // force compact (non-multiline) form when printing the arguments - ForceMultiLine bool // force multiline form when printing the arguments -} - -func (x *DefStmt) Span() (start, end Position) { - return x.Function.Span() -} - -// HeaderSpan returns the span of the function header `def f(...):` -func (x *DefStmt) HeaderSpan() (start, end Position) { - return x.Function.StartPos, x.ColonPos -} - -// A ReturnStmt represents a return statement: return f(x). -type ReturnStmt struct { - Comments - Return Position - Result Expr // may be nil -} - -func (x *ReturnStmt) Span() (start, end Position) { - if x.Result == nil { - return x.Return, x.Return.add("return") - } - _, end = x.Result.Span() - return x.Return, end -} - -// A ForStmt represents a for loop block: for x in range(10):. -type ForStmt struct { - Comments - Function - For Position // position of for - Vars Expr - X Expr - Body []Expr -} - -func (x *ForStmt) Span() (start, end Position) { - end = stmtsEnd(x.Body) - return x.For, end -} - -// An IfStmt represents an if-else block: if x: ... else: ... . -// `elif`s are treated as a chain of `IfStmt`s. -type IfStmt struct { - Comments - If Position // position of if - Cond Expr - True []Expr - ElsePos End // position of else or elif - False []Expr // optional -} - -func (x *IfStmt) Span() (start, end Position) { - body := x.False - if body == nil { - body = x.True - } - end = stmtsEnd(body) - return x.If, end -} diff --git a/vendor/github.com/bazelbuild/buildtools/build/walk.go b/vendor/github.com/bazelbuild/buildtools/build/walk.go deleted file mode 100644 index 91d105bda23..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/build/walk.go +++ /dev/null @@ -1,246 +0,0 @@ -/* -Copyright 2016 Google 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 build - -// Walk walks the expression tree v, calling f on all subexpressions -// in a preorder traversal. -// -// The stk argument is the stack of expressions in the recursion above x, -// from outermost to innermost. -// -func Walk(v Expr, f func(x Expr, stk []Expr)) { - var stack []Expr - walk1(&v, &stack, func(x *Expr, stk []Expr) Expr { - f(*x, stk) - return nil - }) -} - -// WalkPointers is the same as Walk but calls the callback function with pointers to nodes. -func WalkPointers(v Expr, f func(x *Expr, stk []Expr)) { - var stack []Expr - walk1(&v, &stack, func(x *Expr, stk []Expr) Expr { - f(x, stk) - return nil - }) -} - -// Edit walks the expression tree v, calling f on all subexpressions -// in a preorder traversal. If f returns a non-nil value, the tree is mutated. -// The new value replaces the old one. -// -// The stk argument is the stack of expressions in the recursion above x, -// from outermost to innermost. -// -func Edit(v Expr, f func(x Expr, stk []Expr) Expr) Expr { - var stack []Expr - return walk1(&v, &stack, func(x *Expr, stk []Expr) Expr { - return f(*x, stk) - }) -} - -// EditChildren is similar to Edit but doesn't visit the initial node, instead goes -// directly to its children. -func EditChildren(v Expr, f func(x Expr, stk []Expr) Expr) { - stack := []Expr{v} - WalkOnce(v, func(x *Expr) { - walk1(x, &stack, func(x *Expr, stk []Expr) Expr { - return f(*x, stk) - }) - }) -} - -// walk1 is a helper function for Walk, WalkWithPostfix, and Edit. -func walk1(v *Expr, stack *[]Expr, f func(x *Expr, stk []Expr) Expr) Expr { - if v == nil { - return nil - } - - if res := f(v, *stack); res != nil { - *v = res - } - *stack = append(*stack, *v) - - WalkOnce(*v, func(x *Expr) { - walk1(x, stack, f) - }) - - *stack = (*stack)[:len(*stack)-1] - return *v -} - -// WalkOnce calls f on every child of v. -func WalkOnce(v Expr, f func(x *Expr)) { - switch v := v.(type) { - case *File: - for i := range v.Stmt { - f(&v.Stmt[i]) - } - case *DotExpr: - f(&v.X) - case *IndexExpr: - f(&v.X) - f(&v.Y) - case *KeyValueExpr: - f(&v.Key) - f(&v.Value) - case *SliceExpr: - f(&v.X) - if v.From != nil { - f(&v.From) - } - if v.To != nil { - f(&v.To) - } - if v.Step != nil { - f(&v.Step) - } - case *ParenExpr: - f(&v.X) - case *UnaryExpr: - f(&v.X) - case *BinaryExpr: - f(&v.X) - f(&v.Y) - case *AssignExpr: - f(&v.LHS) - f(&v.RHS) - case *LambdaExpr: - for i := range v.Params { - f(&v.Params[i]) - } - for i := range v.Body { - f(&v.Body[i]) - } - case *CallExpr: - f(&v.X) - for i := range v.List { - f(&v.List[i]) - } - case *ListExpr: - for i := range v.List { - f(&v.List[i]) - } - case *SetExpr: - for i := range v.List { - f(&v.List[i]) - } - case *TupleExpr: - for i := range v.List { - f(&v.List[i]) - } - case *DictExpr: - for i := range v.List { - f(&v.List[i]) - } - case *Comprehension: - f(&v.Body) - for _, c := range v.Clauses { - f(&c) - } - case *IfClause: - f(&v.Cond) - case *ForClause: - f(&v.Vars) - f(&v.X) - case *ConditionalExpr: - f(&v.Then) - f(&v.Test) - f(&v.Else) - case *LoadStmt: - module := (Expr)(v.Module) - f(&module) - v.Module = module.(*StringExpr) - for i := range v.From { - from := (Expr)(v.From[i]) - f(&from) - v.From[i] = from.(*Ident) - to := (Expr)(v.To[i]) - f(&to) - v.To[i] = to.(*Ident) - } - case *DefStmt: - for i := range v.Params { - f(&v.Params[i]) - } - for i := range v.Body { - f(&v.Body[i]) - } - case *IfStmt: - f(&v.Cond) - for i := range v.True { - f(&v.True[i]) - } - for i := range v.False { - f(&v.False[i]) - } - case *ForStmt: - f(&v.Vars) - f(&v.X) - for i := range v.Body { - f(&v.Body[i]) - } - case *ReturnStmt: - if v.Result != nil { - f(&v.Result) - } - } -} - -// walkStatements is a helper function for WalkStatements -func walkStatements(v Expr, stack *[]Expr, f func(x Expr, stk []Expr)) { - if v == nil { - return - } - - f(v, *stack) - *stack = append(*stack, v) - - traverse := func(x Expr) { - walkStatements(x, stack, f) - } - - switch expr := v.(type) { - case *File: - for _, s := range expr.Stmt { - traverse(s) - } - case *DefStmt: - for _, s := range expr.Body { - traverse(s) - } - case *IfStmt: - for _, s := range expr.True { - traverse(s) - } - for _, s := range expr.False { - traverse(s) - } - case *ForStmt: - for _, s := range expr.Body { - traverse(s) - } - } - - *stack = (*stack)[:len(*stack)-1] -} - -// WalkStatements traverses sub statements (not all nodes) -func WalkStatements(v Expr, f func(x Expr, stk []Expr)) { - var stack []Expr - walkStatements(v, &stack, f) -} diff --git a/vendor/github.com/bazelbuild/buildtools/build_proto/BUILD b/vendor/github.com/bazelbuild/buildtools/build_proto/BUILD deleted file mode 100644 index a7ad3a12fa6..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/build_proto/BUILD +++ /dev/null @@ -1,24 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["build.gen.pb.go"], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/buildtools/build_proto", - importpath = "github.com/bazelbuild/buildtools/build_proto", - visibility = ["//visibility:public"], - deps = ["//vendor/github.com/golang/protobuf/proto:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/buildtools/build_proto/build.gen.pb.go b/vendor/github.com/bazelbuild/buildtools/build_proto/build.gen.pb.go deleted file mode 100644 index 50fbe155a85..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/build_proto/build.gen.pb.go +++ /dev/null @@ -1,2566 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: build_proto/build.proto - -package blaze_query - -import ( - fmt "fmt" - proto "github.com/golang/protobuf/proto" - math "math" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -type FilesetEntry_SymlinkBehavior int32 - -const ( - FilesetEntry_COPY FilesetEntry_SymlinkBehavior = 1 - FilesetEntry_DEREFERENCE FilesetEntry_SymlinkBehavior = 2 -) - -var FilesetEntry_SymlinkBehavior_name = map[int32]string{ - 1: "COPY", - 2: "DEREFERENCE", -} - -var FilesetEntry_SymlinkBehavior_value = map[string]int32{ - "COPY": 1, - "DEREFERENCE": 2, -} - -func (x FilesetEntry_SymlinkBehavior) Enum() *FilesetEntry_SymlinkBehavior { - p := new(FilesetEntry_SymlinkBehavior) - *p = x - return p -} - -func (x FilesetEntry_SymlinkBehavior) String() string { - return proto.EnumName(FilesetEntry_SymlinkBehavior_name, int32(x)) -} - -func (x *FilesetEntry_SymlinkBehavior) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FilesetEntry_SymlinkBehavior_value, data, "FilesetEntry_SymlinkBehavior") - if err != nil { - return err - } - *x = FilesetEntry_SymlinkBehavior(value) - return nil -} - -func (FilesetEntry_SymlinkBehavior) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{6, 0} -} - -type Attribute_Discriminator int32 - -const ( - Attribute_INTEGER Attribute_Discriminator = 1 - Attribute_STRING Attribute_Discriminator = 2 - Attribute_LABEL Attribute_Discriminator = 3 - Attribute_OUTPUT Attribute_Discriminator = 4 - Attribute_STRING_LIST Attribute_Discriminator = 5 - Attribute_LABEL_LIST Attribute_Discriminator = 6 - Attribute_OUTPUT_LIST Attribute_Discriminator = 7 - Attribute_DISTRIBUTION_SET Attribute_Discriminator = 8 - Attribute_LICENSE Attribute_Discriminator = 9 - Attribute_STRING_DICT Attribute_Discriminator = 10 - Attribute_FILESET_ENTRY_LIST Attribute_Discriminator = 11 - Attribute_LABEL_LIST_DICT Attribute_Discriminator = 12 - Attribute_STRING_LIST_DICT Attribute_Discriminator = 13 - Attribute_BOOLEAN Attribute_Discriminator = 14 - Attribute_TRISTATE Attribute_Discriminator = 15 - Attribute_INTEGER_LIST Attribute_Discriminator = 16 - Attribute_UNKNOWN Attribute_Discriminator = 18 - Attribute_LABEL_DICT_UNARY Attribute_Discriminator = 19 - Attribute_SELECTOR_LIST Attribute_Discriminator = 20 - Attribute_LABEL_KEYED_STRING_DICT Attribute_Discriminator = 21 - Attribute_DEPRECATED_STRING_DICT_UNARY Attribute_Discriminator = 17 -) - -var Attribute_Discriminator_name = map[int32]string{ - 1: "INTEGER", - 2: "STRING", - 3: "LABEL", - 4: "OUTPUT", - 5: "STRING_LIST", - 6: "LABEL_LIST", - 7: "OUTPUT_LIST", - 8: "DISTRIBUTION_SET", - 9: "LICENSE", - 10: "STRING_DICT", - 11: "FILESET_ENTRY_LIST", - 12: "LABEL_LIST_DICT", - 13: "STRING_LIST_DICT", - 14: "BOOLEAN", - 15: "TRISTATE", - 16: "INTEGER_LIST", - 18: "UNKNOWN", - 19: "LABEL_DICT_UNARY", - 20: "SELECTOR_LIST", - 21: "LABEL_KEYED_STRING_DICT", - 17: "DEPRECATED_STRING_DICT_UNARY", -} - -var Attribute_Discriminator_value = map[string]int32{ - "INTEGER": 1, - "STRING": 2, - "LABEL": 3, - "OUTPUT": 4, - "STRING_LIST": 5, - "LABEL_LIST": 6, - "OUTPUT_LIST": 7, - "DISTRIBUTION_SET": 8, - "LICENSE": 9, - "STRING_DICT": 10, - "FILESET_ENTRY_LIST": 11, - "LABEL_LIST_DICT": 12, - "STRING_LIST_DICT": 13, - "BOOLEAN": 14, - "TRISTATE": 15, - "INTEGER_LIST": 16, - "UNKNOWN": 18, - "LABEL_DICT_UNARY": 19, - "SELECTOR_LIST": 20, - "LABEL_KEYED_STRING_DICT": 21, - "DEPRECATED_STRING_DICT_UNARY": 17, -} - -func (x Attribute_Discriminator) Enum() *Attribute_Discriminator { - p := new(Attribute_Discriminator) - *p = x - return p -} - -func (x Attribute_Discriminator) String() string { - return proto.EnumName(Attribute_Discriminator_name, int32(x)) -} - -func (x *Attribute_Discriminator) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Attribute_Discriminator_value, data, "Attribute_Discriminator") - if err != nil { - return err - } - *x = Attribute_Discriminator(value) - return nil -} - -func (Attribute_Discriminator) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{7, 0} -} - -type Attribute_Tristate int32 - -const ( - Attribute_NO Attribute_Tristate = 0 - Attribute_YES Attribute_Tristate = 1 - Attribute_AUTO Attribute_Tristate = 2 -) - -var Attribute_Tristate_name = map[int32]string{ - 0: "NO", - 1: "YES", - 2: "AUTO", -} - -var Attribute_Tristate_value = map[string]int32{ - "NO": 0, - "YES": 1, - "AUTO": 2, -} - -func (x Attribute_Tristate) Enum() *Attribute_Tristate { - p := new(Attribute_Tristate) - *p = x - return p -} - -func (x Attribute_Tristate) String() string { - return proto.EnumName(Attribute_Tristate_name, int32(x)) -} - -func (x *Attribute_Tristate) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Attribute_Tristate_value, data, "Attribute_Tristate") - if err != nil { - return err - } - *x = Attribute_Tristate(value) - return nil -} - -func (Attribute_Tristate) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{7, 1} -} - -type Target_Discriminator int32 - -const ( - Target_RULE Target_Discriminator = 1 - Target_SOURCE_FILE Target_Discriminator = 2 - Target_GENERATED_FILE Target_Discriminator = 3 - Target_PACKAGE_GROUP Target_Discriminator = 4 - Target_ENVIRONMENT_GROUP Target_Discriminator = 5 -) - -var Target_Discriminator_name = map[int32]string{ - 1: "RULE", - 2: "SOURCE_FILE", - 3: "GENERATED_FILE", - 4: "PACKAGE_GROUP", - 5: "ENVIRONMENT_GROUP", -} - -var Target_Discriminator_value = map[string]int32{ - "RULE": 1, - "SOURCE_FILE": 2, - "GENERATED_FILE": 3, - "PACKAGE_GROUP": 4, - "ENVIRONMENT_GROUP": 5, -} - -func (x Target_Discriminator) Enum() *Target_Discriminator { - p := new(Target_Discriminator) - *p = x - return p -} - -func (x Target_Discriminator) String() string { - return proto.EnumName(Target_Discriminator_name, int32(x)) -} - -func (x *Target_Discriminator) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Target_Discriminator_value, data, "Target_Discriminator") - if err != nil { - return err - } - *x = Target_Discriminator(value) - return nil -} - -func (Target_Discriminator) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{16, 0} -} - -type AllowedRuleClassInfo_AllowedRuleClasses int32 - -const ( - AllowedRuleClassInfo_ANY AllowedRuleClassInfo_AllowedRuleClasses = 1 - AllowedRuleClassInfo_SPECIFIED AllowedRuleClassInfo_AllowedRuleClasses = 2 -) - -var AllowedRuleClassInfo_AllowedRuleClasses_name = map[int32]string{ - 1: "ANY", - 2: "SPECIFIED", -} - -var AllowedRuleClassInfo_AllowedRuleClasses_value = map[string]int32{ - "ANY": 1, - "SPECIFIED": 2, -} - -func (x AllowedRuleClassInfo_AllowedRuleClasses) Enum() *AllowedRuleClassInfo_AllowedRuleClasses { - p := new(AllowedRuleClassInfo_AllowedRuleClasses) - *p = x - return p -} - -func (x AllowedRuleClassInfo_AllowedRuleClasses) String() string { - return proto.EnumName(AllowedRuleClassInfo_AllowedRuleClasses_name, int32(x)) -} - -func (x *AllowedRuleClassInfo_AllowedRuleClasses) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(AllowedRuleClassInfo_AllowedRuleClasses_value, data, "AllowedRuleClassInfo_AllowedRuleClasses") - if err != nil { - return err - } - *x = AllowedRuleClassInfo_AllowedRuleClasses(value) - return nil -} - -func (AllowedRuleClassInfo_AllowedRuleClasses) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{18, 0} -} - -type Event_EventKind int32 - -const ( - Event_ERROR Event_EventKind = 1 - Event_WARNING Event_EventKind = 2 - Event_INFO Event_EventKind = 3 - Event_PROGRESS Event_EventKind = 4 -) - -var Event_EventKind_name = map[int32]string{ - 1: "ERROR", - 2: "WARNING", - 3: "INFO", - 4: "PROGRESS", -} - -var Event_EventKind_value = map[string]int32{ - "ERROR": 1, - "WARNING": 2, - "INFO": 3, - "PROGRESS": 4, -} - -func (x Event_EventKind) Enum() *Event_EventKind { - p := new(Event_EventKind) - *p = x - return p -} - -func (x Event_EventKind) String() string { - return proto.EnumName(Event_EventKind_name, int32(x)) -} - -func (x *Event_EventKind) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(Event_EventKind_value, data, "Event_EventKind") - if err != nil { - return err - } - *x = Event_EventKind(value) - return nil -} - -func (Event_EventKind) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{26, 0} -} - -type License struct { - LicenseType []string `protobuf:"bytes,1,rep,name=license_type,json=licenseType" json:"license_type,omitempty"` - Exception []string `protobuf:"bytes,2,rep,name=exception" json:"exception,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *License) Reset() { *m = License{} } -func (m *License) String() string { return proto.CompactTextString(m) } -func (*License) ProtoMessage() {} -func (*License) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{0} -} - -func (m *License) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_License.Unmarshal(m, b) -} -func (m *License) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_License.Marshal(b, m, deterministic) -} -func (m *License) XXX_Merge(src proto.Message) { - xxx_messageInfo_License.Merge(m, src) -} -func (m *License) XXX_Size() int { - return xxx_messageInfo_License.Size(m) -} -func (m *License) XXX_DiscardUnknown() { - xxx_messageInfo_License.DiscardUnknown(m) -} - -var xxx_messageInfo_License proto.InternalMessageInfo - -func (m *License) GetLicenseType() []string { - if m != nil { - return m.LicenseType - } - return nil -} - -func (m *License) GetException() []string { - if m != nil { - return m.Exception - } - return nil -} - -type StringDictEntry struct { - Key *string `protobuf:"bytes,1,req,name=key" json:"key,omitempty"` - Value *string `protobuf:"bytes,2,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StringDictEntry) Reset() { *m = StringDictEntry{} } -func (m *StringDictEntry) String() string { return proto.CompactTextString(m) } -func (*StringDictEntry) ProtoMessage() {} -func (*StringDictEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{1} -} - -func (m *StringDictEntry) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StringDictEntry.Unmarshal(m, b) -} -func (m *StringDictEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StringDictEntry.Marshal(b, m, deterministic) -} -func (m *StringDictEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_StringDictEntry.Merge(m, src) -} -func (m *StringDictEntry) XXX_Size() int { - return xxx_messageInfo_StringDictEntry.Size(m) -} -func (m *StringDictEntry) XXX_DiscardUnknown() { - xxx_messageInfo_StringDictEntry.DiscardUnknown(m) -} - -var xxx_messageInfo_StringDictEntry proto.InternalMessageInfo - -func (m *StringDictEntry) GetKey() string { - if m != nil && m.Key != nil { - return *m.Key - } - return "" -} - -func (m *StringDictEntry) GetValue() string { - if m != nil && m.Value != nil { - return *m.Value - } - return "" -} - -type LabelDictUnaryEntry struct { - Key *string `protobuf:"bytes,1,req,name=key" json:"key,omitempty"` - Value *string `protobuf:"bytes,2,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LabelDictUnaryEntry) Reset() { *m = LabelDictUnaryEntry{} } -func (m *LabelDictUnaryEntry) String() string { return proto.CompactTextString(m) } -func (*LabelDictUnaryEntry) ProtoMessage() {} -func (*LabelDictUnaryEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{2} -} - -func (m *LabelDictUnaryEntry) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LabelDictUnaryEntry.Unmarshal(m, b) -} -func (m *LabelDictUnaryEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LabelDictUnaryEntry.Marshal(b, m, deterministic) -} -func (m *LabelDictUnaryEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_LabelDictUnaryEntry.Merge(m, src) -} -func (m *LabelDictUnaryEntry) XXX_Size() int { - return xxx_messageInfo_LabelDictUnaryEntry.Size(m) -} -func (m *LabelDictUnaryEntry) XXX_DiscardUnknown() { - xxx_messageInfo_LabelDictUnaryEntry.DiscardUnknown(m) -} - -var xxx_messageInfo_LabelDictUnaryEntry proto.InternalMessageInfo - -func (m *LabelDictUnaryEntry) GetKey() string { - if m != nil && m.Key != nil { - return *m.Key - } - return "" -} - -func (m *LabelDictUnaryEntry) GetValue() string { - if m != nil && m.Value != nil { - return *m.Value - } - return "" -} - -type LabelListDictEntry struct { - Key *string `protobuf:"bytes,1,req,name=key" json:"key,omitempty"` - Value []string `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LabelListDictEntry) Reset() { *m = LabelListDictEntry{} } -func (m *LabelListDictEntry) String() string { return proto.CompactTextString(m) } -func (*LabelListDictEntry) ProtoMessage() {} -func (*LabelListDictEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{3} -} - -func (m *LabelListDictEntry) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LabelListDictEntry.Unmarshal(m, b) -} -func (m *LabelListDictEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LabelListDictEntry.Marshal(b, m, deterministic) -} -func (m *LabelListDictEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_LabelListDictEntry.Merge(m, src) -} -func (m *LabelListDictEntry) XXX_Size() int { - return xxx_messageInfo_LabelListDictEntry.Size(m) -} -func (m *LabelListDictEntry) XXX_DiscardUnknown() { - xxx_messageInfo_LabelListDictEntry.DiscardUnknown(m) -} - -var xxx_messageInfo_LabelListDictEntry proto.InternalMessageInfo - -func (m *LabelListDictEntry) GetKey() string { - if m != nil && m.Key != nil { - return *m.Key - } - return "" -} - -func (m *LabelListDictEntry) GetValue() []string { - if m != nil { - return m.Value - } - return nil -} - -type LabelKeyedStringDictEntry struct { - Key *string `protobuf:"bytes,1,req,name=key" json:"key,omitempty"` - Value *string `protobuf:"bytes,2,req,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *LabelKeyedStringDictEntry) Reset() { *m = LabelKeyedStringDictEntry{} } -func (m *LabelKeyedStringDictEntry) String() string { return proto.CompactTextString(m) } -func (*LabelKeyedStringDictEntry) ProtoMessage() {} -func (*LabelKeyedStringDictEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{4} -} - -func (m *LabelKeyedStringDictEntry) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LabelKeyedStringDictEntry.Unmarshal(m, b) -} -func (m *LabelKeyedStringDictEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LabelKeyedStringDictEntry.Marshal(b, m, deterministic) -} -func (m *LabelKeyedStringDictEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_LabelKeyedStringDictEntry.Merge(m, src) -} -func (m *LabelKeyedStringDictEntry) XXX_Size() int { - return xxx_messageInfo_LabelKeyedStringDictEntry.Size(m) -} -func (m *LabelKeyedStringDictEntry) XXX_DiscardUnknown() { - xxx_messageInfo_LabelKeyedStringDictEntry.DiscardUnknown(m) -} - -var xxx_messageInfo_LabelKeyedStringDictEntry proto.InternalMessageInfo - -func (m *LabelKeyedStringDictEntry) GetKey() string { - if m != nil && m.Key != nil { - return *m.Key - } - return "" -} - -func (m *LabelKeyedStringDictEntry) GetValue() string { - if m != nil && m.Value != nil { - return *m.Value - } - return "" -} - -type StringListDictEntry struct { - Key *string `protobuf:"bytes,1,req,name=key" json:"key,omitempty"` - Value []string `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *StringListDictEntry) Reset() { *m = StringListDictEntry{} } -func (m *StringListDictEntry) String() string { return proto.CompactTextString(m) } -func (*StringListDictEntry) ProtoMessage() {} -func (*StringListDictEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{5} -} - -func (m *StringListDictEntry) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_StringListDictEntry.Unmarshal(m, b) -} -func (m *StringListDictEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_StringListDictEntry.Marshal(b, m, deterministic) -} -func (m *StringListDictEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_StringListDictEntry.Merge(m, src) -} -func (m *StringListDictEntry) XXX_Size() int { - return xxx_messageInfo_StringListDictEntry.Size(m) -} -func (m *StringListDictEntry) XXX_DiscardUnknown() { - xxx_messageInfo_StringListDictEntry.DiscardUnknown(m) -} - -var xxx_messageInfo_StringListDictEntry proto.InternalMessageInfo - -func (m *StringListDictEntry) GetKey() string { - if m != nil && m.Key != nil { - return *m.Key - } - return "" -} - -func (m *StringListDictEntry) GetValue() []string { - if m != nil { - return m.Value - } - return nil -} - -type FilesetEntry struct { - Source *string `protobuf:"bytes,1,req,name=source" json:"source,omitempty"` - DestinationDirectory *string `protobuf:"bytes,2,req,name=destination_directory,json=destinationDirectory" json:"destination_directory,omitempty"` - FilesPresent *bool `protobuf:"varint,7,opt,name=files_present,json=filesPresent" json:"files_present,omitempty"` - File []string `protobuf:"bytes,3,rep,name=file" json:"file,omitempty"` - Exclude []string `protobuf:"bytes,4,rep,name=exclude" json:"exclude,omitempty"` - SymlinkBehavior *FilesetEntry_SymlinkBehavior `protobuf:"varint,5,opt,name=symlink_behavior,json=symlinkBehavior,enum=blaze_query.FilesetEntry_SymlinkBehavior,def=1" json:"symlink_behavior,omitempty"` - StripPrefix *string `protobuf:"bytes,6,opt,name=strip_prefix,json=stripPrefix" json:"strip_prefix,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *FilesetEntry) Reset() { *m = FilesetEntry{} } -func (m *FilesetEntry) String() string { return proto.CompactTextString(m) } -func (*FilesetEntry) ProtoMessage() {} -func (*FilesetEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{6} -} - -func (m *FilesetEntry) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_FilesetEntry.Unmarshal(m, b) -} -func (m *FilesetEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_FilesetEntry.Marshal(b, m, deterministic) -} -func (m *FilesetEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_FilesetEntry.Merge(m, src) -} -func (m *FilesetEntry) XXX_Size() int { - return xxx_messageInfo_FilesetEntry.Size(m) -} -func (m *FilesetEntry) XXX_DiscardUnknown() { - xxx_messageInfo_FilesetEntry.DiscardUnknown(m) -} - -var xxx_messageInfo_FilesetEntry proto.InternalMessageInfo - -const Default_FilesetEntry_SymlinkBehavior FilesetEntry_SymlinkBehavior = FilesetEntry_COPY - -func (m *FilesetEntry) GetSource() string { - if m != nil && m.Source != nil { - return *m.Source - } - return "" -} - -func (m *FilesetEntry) GetDestinationDirectory() string { - if m != nil && m.DestinationDirectory != nil { - return *m.DestinationDirectory - } - return "" -} - -func (m *FilesetEntry) GetFilesPresent() bool { - if m != nil && m.FilesPresent != nil { - return *m.FilesPresent - } - return false -} - -func (m *FilesetEntry) GetFile() []string { - if m != nil { - return m.File - } - return nil -} - -func (m *FilesetEntry) GetExclude() []string { - if m != nil { - return m.Exclude - } - return nil -} - -func (m *FilesetEntry) GetSymlinkBehavior() FilesetEntry_SymlinkBehavior { - if m != nil && m.SymlinkBehavior != nil { - return *m.SymlinkBehavior - } - return Default_FilesetEntry_SymlinkBehavior -} - -func (m *FilesetEntry) GetStripPrefix() string { - if m != nil && m.StripPrefix != nil { - return *m.StripPrefix - } - return "" -} - -type Attribute struct { - Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` - DEPRECATEDParseableLocation *Location `protobuf:"bytes,12,opt,name=DEPRECATED_parseable_location,json=DEPRECATEDParseableLocation" json:"DEPRECATED_parseable_location,omitempty"` - ExplicitlySpecified *bool `protobuf:"varint,13,opt,name=explicitly_specified,json=explicitlySpecified" json:"explicitly_specified,omitempty"` - Nodep *bool `protobuf:"varint,20,opt,name=nodep" json:"nodep,omitempty"` - Type *Attribute_Discriminator `protobuf:"varint,2,req,name=type,enum=blaze_query.Attribute_Discriminator" json:"type,omitempty"` - IntValue *int32 `protobuf:"varint,3,opt,name=int_value,json=intValue" json:"int_value,omitempty"` - StringValue *string `protobuf:"bytes,5,opt,name=string_value,json=stringValue" json:"string_value,omitempty"` - BooleanValue *bool `protobuf:"varint,14,opt,name=boolean_value,json=booleanValue" json:"boolean_value,omitempty"` - TristateValue *Attribute_Tristate `protobuf:"varint,15,opt,name=tristate_value,json=tristateValue,enum=blaze_query.Attribute_Tristate" json:"tristate_value,omitempty"` - StringListValue []string `protobuf:"bytes,6,rep,name=string_list_value,json=stringListValue" json:"string_list_value,omitempty"` - License *License `protobuf:"bytes,7,opt,name=license" json:"license,omitempty"` - StringDictValue []*StringDictEntry `protobuf:"bytes,8,rep,name=string_dict_value,json=stringDictValue" json:"string_dict_value,omitempty"` - FilesetListValue []*FilesetEntry `protobuf:"bytes,9,rep,name=fileset_list_value,json=filesetListValue" json:"fileset_list_value,omitempty"` - LabelListDictValue []*LabelListDictEntry `protobuf:"bytes,10,rep,name=label_list_dict_value,json=labelListDictValue" json:"label_list_dict_value,omitempty"` - StringListDictValue []*StringListDictEntry `protobuf:"bytes,11,rep,name=string_list_dict_value,json=stringListDictValue" json:"string_list_dict_value,omitempty"` - IntListValue []int32 `protobuf:"varint,17,rep,name=int_list_value,json=intListValue" json:"int_list_value,omitempty"` - LabelDictUnaryValue []*LabelDictUnaryEntry `protobuf:"bytes,19,rep,name=label_dict_unary_value,json=labelDictUnaryValue" json:"label_dict_unary_value,omitempty"` - LabelKeyedStringDictValue []*LabelKeyedStringDictEntry `protobuf:"bytes,22,rep,name=label_keyed_string_dict_value,json=labelKeyedStringDictValue" json:"label_keyed_string_dict_value,omitempty"` - SelectorList *Attribute_SelectorList `protobuf:"bytes,21,opt,name=selector_list,json=selectorList" json:"selector_list,omitempty"` - DEPRECATEDGlobCriteria []*DEPRECATED_GlobCriteria `protobuf:"bytes,16,rep,name=DEPRECATED_glob_criteria,json=DEPRECATEDGlobCriteria" json:"DEPRECATED_glob_criteria,omitempty"` - DEPRECATEDStringDictUnaryValue [][]byte `protobuf:"bytes,18,rep,name=DEPRECATED_string_dict_unary_value,json=DEPRECATEDStringDictUnaryValue" json:"DEPRECATED_string_dict_unary_value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Attribute) Reset() { *m = Attribute{} } -func (m *Attribute) String() string { return proto.CompactTextString(m) } -func (*Attribute) ProtoMessage() {} -func (*Attribute) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{7} -} - -func (m *Attribute) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Attribute.Unmarshal(m, b) -} -func (m *Attribute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Attribute.Marshal(b, m, deterministic) -} -func (m *Attribute) XXX_Merge(src proto.Message) { - xxx_messageInfo_Attribute.Merge(m, src) -} -func (m *Attribute) XXX_Size() int { - return xxx_messageInfo_Attribute.Size(m) -} -func (m *Attribute) XXX_DiscardUnknown() { - xxx_messageInfo_Attribute.DiscardUnknown(m) -} - -var xxx_messageInfo_Attribute proto.InternalMessageInfo - -func (m *Attribute) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *Attribute) GetDEPRECATEDParseableLocation() *Location { - if m != nil { - return m.DEPRECATEDParseableLocation - } - return nil -} - -func (m *Attribute) GetExplicitlySpecified() bool { - if m != nil && m.ExplicitlySpecified != nil { - return *m.ExplicitlySpecified - } - return false -} - -func (m *Attribute) GetNodep() bool { - if m != nil && m.Nodep != nil { - return *m.Nodep - } - return false -} - -func (m *Attribute) GetType() Attribute_Discriminator { - if m != nil && m.Type != nil { - return *m.Type - } - return Attribute_INTEGER -} - -func (m *Attribute) GetIntValue() int32 { - if m != nil && m.IntValue != nil { - return *m.IntValue - } - return 0 -} - -func (m *Attribute) GetStringValue() string { - if m != nil && m.StringValue != nil { - return *m.StringValue - } - return "" -} - -func (m *Attribute) GetBooleanValue() bool { - if m != nil && m.BooleanValue != nil { - return *m.BooleanValue - } - return false -} - -func (m *Attribute) GetTristateValue() Attribute_Tristate { - if m != nil && m.TristateValue != nil { - return *m.TristateValue - } - return Attribute_NO -} - -func (m *Attribute) GetStringListValue() []string { - if m != nil { - return m.StringListValue - } - return nil -} - -func (m *Attribute) GetLicense() *License { - if m != nil { - return m.License - } - return nil -} - -func (m *Attribute) GetStringDictValue() []*StringDictEntry { - if m != nil { - return m.StringDictValue - } - return nil -} - -func (m *Attribute) GetFilesetListValue() []*FilesetEntry { - if m != nil { - return m.FilesetListValue - } - return nil -} - -func (m *Attribute) GetLabelListDictValue() []*LabelListDictEntry { - if m != nil { - return m.LabelListDictValue - } - return nil -} - -func (m *Attribute) GetStringListDictValue() []*StringListDictEntry { - if m != nil { - return m.StringListDictValue - } - return nil -} - -func (m *Attribute) GetIntListValue() []int32 { - if m != nil { - return m.IntListValue - } - return nil -} - -func (m *Attribute) GetLabelDictUnaryValue() []*LabelDictUnaryEntry { - if m != nil { - return m.LabelDictUnaryValue - } - return nil -} - -func (m *Attribute) GetLabelKeyedStringDictValue() []*LabelKeyedStringDictEntry { - if m != nil { - return m.LabelKeyedStringDictValue - } - return nil -} - -func (m *Attribute) GetSelectorList() *Attribute_SelectorList { - if m != nil { - return m.SelectorList - } - return nil -} - -func (m *Attribute) GetDEPRECATEDGlobCriteria() []*DEPRECATED_GlobCriteria { - if m != nil { - return m.DEPRECATEDGlobCriteria - } - return nil -} - -func (m *Attribute) GetDEPRECATEDStringDictUnaryValue() [][]byte { - if m != nil { - return m.DEPRECATEDStringDictUnaryValue - } - return nil -} - -type Attribute_SelectorEntry struct { - Label *string `protobuf:"bytes,1,opt,name=label" json:"label,omitempty"` - IsDefaultValue *bool `protobuf:"varint,16,opt,name=is_default_value,json=isDefaultValue" json:"is_default_value,omitempty"` - IntValue *int32 `protobuf:"varint,2,opt,name=int_value,json=intValue" json:"int_value,omitempty"` - StringValue *string `protobuf:"bytes,3,opt,name=string_value,json=stringValue" json:"string_value,omitempty"` - BooleanValue *bool `protobuf:"varint,4,opt,name=boolean_value,json=booleanValue" json:"boolean_value,omitempty"` - TristateValue *Attribute_Tristate `protobuf:"varint,5,opt,name=tristate_value,json=tristateValue,enum=blaze_query.Attribute_Tristate" json:"tristate_value,omitempty"` - StringListValue []string `protobuf:"bytes,6,rep,name=string_list_value,json=stringListValue" json:"string_list_value,omitempty"` - License *License `protobuf:"bytes,7,opt,name=license" json:"license,omitempty"` - StringDictValue []*StringDictEntry `protobuf:"bytes,8,rep,name=string_dict_value,json=stringDictValue" json:"string_dict_value,omitempty"` - FilesetListValue []*FilesetEntry `protobuf:"bytes,9,rep,name=fileset_list_value,json=filesetListValue" json:"fileset_list_value,omitempty"` - LabelListDictValue []*LabelListDictEntry `protobuf:"bytes,10,rep,name=label_list_dict_value,json=labelListDictValue" json:"label_list_dict_value,omitempty"` - StringListDictValue []*StringListDictEntry `protobuf:"bytes,11,rep,name=string_list_dict_value,json=stringListDictValue" json:"string_list_dict_value,omitempty"` - IntListValue []int32 `protobuf:"varint,13,rep,name=int_list_value,json=intListValue" json:"int_list_value,omitempty"` - LabelDictUnaryValue []*LabelDictUnaryEntry `protobuf:"bytes,15,rep,name=label_dict_unary_value,json=labelDictUnaryValue" json:"label_dict_unary_value,omitempty"` - LabelKeyedStringDictValue []*LabelKeyedStringDictEntry `protobuf:"bytes,17,rep,name=label_keyed_string_dict_value,json=labelKeyedStringDictValue" json:"label_keyed_string_dict_value,omitempty"` - DEPRECATEDGlobCriteria []*DEPRECATED_GlobCriteria `protobuf:"bytes,12,rep,name=DEPRECATED_glob_criteria,json=DEPRECATEDGlobCriteria" json:"DEPRECATED_glob_criteria,omitempty"` - DEPRECATEDStringDictUnaryValue [][]byte `protobuf:"bytes,14,rep,name=DEPRECATED_string_dict_unary_value,json=DEPRECATEDStringDictUnaryValue" json:"DEPRECATED_string_dict_unary_value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Attribute_SelectorEntry) Reset() { *m = Attribute_SelectorEntry{} } -func (m *Attribute_SelectorEntry) String() string { return proto.CompactTextString(m) } -func (*Attribute_SelectorEntry) ProtoMessage() {} -func (*Attribute_SelectorEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{7, 0} -} - -func (m *Attribute_SelectorEntry) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Attribute_SelectorEntry.Unmarshal(m, b) -} -func (m *Attribute_SelectorEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Attribute_SelectorEntry.Marshal(b, m, deterministic) -} -func (m *Attribute_SelectorEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_Attribute_SelectorEntry.Merge(m, src) -} -func (m *Attribute_SelectorEntry) XXX_Size() int { - return xxx_messageInfo_Attribute_SelectorEntry.Size(m) -} -func (m *Attribute_SelectorEntry) XXX_DiscardUnknown() { - xxx_messageInfo_Attribute_SelectorEntry.DiscardUnknown(m) -} - -var xxx_messageInfo_Attribute_SelectorEntry proto.InternalMessageInfo - -func (m *Attribute_SelectorEntry) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" -} - -func (m *Attribute_SelectorEntry) GetIsDefaultValue() bool { - if m != nil && m.IsDefaultValue != nil { - return *m.IsDefaultValue - } - return false -} - -func (m *Attribute_SelectorEntry) GetIntValue() int32 { - if m != nil && m.IntValue != nil { - return *m.IntValue - } - return 0 -} - -func (m *Attribute_SelectorEntry) GetStringValue() string { - if m != nil && m.StringValue != nil { - return *m.StringValue - } - return "" -} - -func (m *Attribute_SelectorEntry) GetBooleanValue() bool { - if m != nil && m.BooleanValue != nil { - return *m.BooleanValue - } - return false -} - -func (m *Attribute_SelectorEntry) GetTristateValue() Attribute_Tristate { - if m != nil && m.TristateValue != nil { - return *m.TristateValue - } - return Attribute_NO -} - -func (m *Attribute_SelectorEntry) GetStringListValue() []string { - if m != nil { - return m.StringListValue - } - return nil -} - -func (m *Attribute_SelectorEntry) GetLicense() *License { - if m != nil { - return m.License - } - return nil -} - -func (m *Attribute_SelectorEntry) GetStringDictValue() []*StringDictEntry { - if m != nil { - return m.StringDictValue - } - return nil -} - -func (m *Attribute_SelectorEntry) GetFilesetListValue() []*FilesetEntry { - if m != nil { - return m.FilesetListValue - } - return nil -} - -func (m *Attribute_SelectorEntry) GetLabelListDictValue() []*LabelListDictEntry { - if m != nil { - return m.LabelListDictValue - } - return nil -} - -func (m *Attribute_SelectorEntry) GetStringListDictValue() []*StringListDictEntry { - if m != nil { - return m.StringListDictValue - } - return nil -} - -func (m *Attribute_SelectorEntry) GetIntListValue() []int32 { - if m != nil { - return m.IntListValue - } - return nil -} - -func (m *Attribute_SelectorEntry) GetLabelDictUnaryValue() []*LabelDictUnaryEntry { - if m != nil { - return m.LabelDictUnaryValue - } - return nil -} - -func (m *Attribute_SelectorEntry) GetLabelKeyedStringDictValue() []*LabelKeyedStringDictEntry { - if m != nil { - return m.LabelKeyedStringDictValue - } - return nil -} - -func (m *Attribute_SelectorEntry) GetDEPRECATEDGlobCriteria() []*DEPRECATED_GlobCriteria { - if m != nil { - return m.DEPRECATEDGlobCriteria - } - return nil -} - -func (m *Attribute_SelectorEntry) GetDEPRECATEDStringDictUnaryValue() [][]byte { - if m != nil { - return m.DEPRECATEDStringDictUnaryValue - } - return nil -} - -type Attribute_Selector struct { - Entries []*Attribute_SelectorEntry `protobuf:"bytes,1,rep,name=entries" json:"entries,omitempty"` - HasDefaultValue *bool `protobuf:"varint,2,opt,name=has_default_value,json=hasDefaultValue" json:"has_default_value,omitempty"` - NoMatchError *string `protobuf:"bytes,3,opt,name=no_match_error,json=noMatchError" json:"no_match_error,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Attribute_Selector) Reset() { *m = Attribute_Selector{} } -func (m *Attribute_Selector) String() string { return proto.CompactTextString(m) } -func (*Attribute_Selector) ProtoMessage() {} -func (*Attribute_Selector) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{7, 1} -} - -func (m *Attribute_Selector) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Attribute_Selector.Unmarshal(m, b) -} -func (m *Attribute_Selector) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Attribute_Selector.Marshal(b, m, deterministic) -} -func (m *Attribute_Selector) XXX_Merge(src proto.Message) { - xxx_messageInfo_Attribute_Selector.Merge(m, src) -} -func (m *Attribute_Selector) XXX_Size() int { - return xxx_messageInfo_Attribute_Selector.Size(m) -} -func (m *Attribute_Selector) XXX_DiscardUnknown() { - xxx_messageInfo_Attribute_Selector.DiscardUnknown(m) -} - -var xxx_messageInfo_Attribute_Selector proto.InternalMessageInfo - -func (m *Attribute_Selector) GetEntries() []*Attribute_SelectorEntry { - if m != nil { - return m.Entries - } - return nil -} - -func (m *Attribute_Selector) GetHasDefaultValue() bool { - if m != nil && m.HasDefaultValue != nil { - return *m.HasDefaultValue - } - return false -} - -func (m *Attribute_Selector) GetNoMatchError() string { - if m != nil && m.NoMatchError != nil { - return *m.NoMatchError - } - return "" -} - -type Attribute_SelectorList struct { - Type *Attribute_Discriminator `protobuf:"varint,1,opt,name=type,enum=blaze_query.Attribute_Discriminator" json:"type,omitempty"` - Elements []*Attribute_Selector `protobuf:"bytes,2,rep,name=elements" json:"elements,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Attribute_SelectorList) Reset() { *m = Attribute_SelectorList{} } -func (m *Attribute_SelectorList) String() string { return proto.CompactTextString(m) } -func (*Attribute_SelectorList) ProtoMessage() {} -func (*Attribute_SelectorList) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{7, 2} -} - -func (m *Attribute_SelectorList) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Attribute_SelectorList.Unmarshal(m, b) -} -func (m *Attribute_SelectorList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Attribute_SelectorList.Marshal(b, m, deterministic) -} -func (m *Attribute_SelectorList) XXX_Merge(src proto.Message) { - xxx_messageInfo_Attribute_SelectorList.Merge(m, src) -} -func (m *Attribute_SelectorList) XXX_Size() int { - return xxx_messageInfo_Attribute_SelectorList.Size(m) -} -func (m *Attribute_SelectorList) XXX_DiscardUnknown() { - xxx_messageInfo_Attribute_SelectorList.DiscardUnknown(m) -} - -var xxx_messageInfo_Attribute_SelectorList proto.InternalMessageInfo - -func (m *Attribute_SelectorList) GetType() Attribute_Discriminator { - if m != nil && m.Type != nil { - return *m.Type - } - return Attribute_INTEGER -} - -func (m *Attribute_SelectorList) GetElements() []*Attribute_Selector { - if m != nil { - return m.Elements - } - return nil -} - -type Rule struct { - Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` - RuleClass *string `protobuf:"bytes,2,req,name=rule_class,json=ruleClass" json:"rule_class,omitempty"` - Location *string `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` - Attribute []*Attribute `protobuf:"bytes,4,rep,name=attribute" json:"attribute,omitempty"` - RuleInput []string `protobuf:"bytes,5,rep,name=rule_input,json=ruleInput" json:"rule_input,omitempty"` - RuleOutput []string `protobuf:"bytes,6,rep,name=rule_output,json=ruleOutput" json:"rule_output,omitempty"` - DefaultSetting []string `protobuf:"bytes,7,rep,name=default_setting,json=defaultSetting" json:"default_setting,omitempty"` - DEPRECATEDParseableLocation *Location `protobuf:"bytes,8,opt,name=DEPRECATED_parseable_location,json=DEPRECATEDParseableLocation" json:"DEPRECATED_parseable_location,omitempty"` - PublicByDefault *bool `protobuf:"varint,9,opt,name=public_by_default,json=publicByDefault" json:"public_by_default,omitempty"` - IsSkylark *bool `protobuf:"varint,10,opt,name=is_skylark,json=isSkylark" json:"is_skylark,omitempty"` - SkylarkAttributeAspects []*AttributeAspect `protobuf:"bytes,11,rep,name=skylark_attribute_aspects,json=skylarkAttributeAspects" json:"skylark_attribute_aspects,omitempty"` - SkylarkEnvironmentHashCode *string `protobuf:"bytes,12,opt,name=skylark_environment_hash_code,json=skylarkEnvironmentHashCode" json:"skylark_environment_hash_code,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Rule) Reset() { *m = Rule{} } -func (m *Rule) String() string { return proto.CompactTextString(m) } -func (*Rule) ProtoMessage() {} -func (*Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{8} -} - -func (m *Rule) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Rule.Unmarshal(m, b) -} -func (m *Rule) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Rule.Marshal(b, m, deterministic) -} -func (m *Rule) XXX_Merge(src proto.Message) { - xxx_messageInfo_Rule.Merge(m, src) -} -func (m *Rule) XXX_Size() int { - return xxx_messageInfo_Rule.Size(m) -} -func (m *Rule) XXX_DiscardUnknown() { - xxx_messageInfo_Rule.DiscardUnknown(m) -} - -var xxx_messageInfo_Rule proto.InternalMessageInfo - -func (m *Rule) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *Rule) GetRuleClass() string { - if m != nil && m.RuleClass != nil { - return *m.RuleClass - } - return "" -} - -func (m *Rule) GetLocation() string { - if m != nil && m.Location != nil { - return *m.Location - } - return "" -} - -func (m *Rule) GetAttribute() []*Attribute { - if m != nil { - return m.Attribute - } - return nil -} - -func (m *Rule) GetRuleInput() []string { - if m != nil { - return m.RuleInput - } - return nil -} - -func (m *Rule) GetRuleOutput() []string { - if m != nil { - return m.RuleOutput - } - return nil -} - -func (m *Rule) GetDefaultSetting() []string { - if m != nil { - return m.DefaultSetting - } - return nil -} - -func (m *Rule) GetDEPRECATEDParseableLocation() *Location { - if m != nil { - return m.DEPRECATEDParseableLocation - } - return nil -} - -func (m *Rule) GetPublicByDefault() bool { - if m != nil && m.PublicByDefault != nil { - return *m.PublicByDefault - } - return false -} - -func (m *Rule) GetIsSkylark() bool { - if m != nil && m.IsSkylark != nil { - return *m.IsSkylark - } - return false -} - -func (m *Rule) GetSkylarkAttributeAspects() []*AttributeAspect { - if m != nil { - return m.SkylarkAttributeAspects - } - return nil -} - -func (m *Rule) GetSkylarkEnvironmentHashCode() string { - if m != nil && m.SkylarkEnvironmentHashCode != nil { - return *m.SkylarkEnvironmentHashCode - } - return "" -} - -type AttributeAspect struct { - AttributeName *string `protobuf:"bytes,1,req,name=attribute_name,json=attributeName" json:"attribute_name,omitempty"` - Aspect *SkylarkAspect `protobuf:"bytes,2,req,name=aspect" json:"aspect,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AttributeAspect) Reset() { *m = AttributeAspect{} } -func (m *AttributeAspect) String() string { return proto.CompactTextString(m) } -func (*AttributeAspect) ProtoMessage() {} -func (*AttributeAspect) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{9} -} - -func (m *AttributeAspect) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AttributeAspect.Unmarshal(m, b) -} -func (m *AttributeAspect) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AttributeAspect.Marshal(b, m, deterministic) -} -func (m *AttributeAspect) XXX_Merge(src proto.Message) { - xxx_messageInfo_AttributeAspect.Merge(m, src) -} -func (m *AttributeAspect) XXX_Size() int { - return xxx_messageInfo_AttributeAspect.Size(m) -} -func (m *AttributeAspect) XXX_DiscardUnknown() { - xxx_messageInfo_AttributeAspect.DiscardUnknown(m) -} - -var xxx_messageInfo_AttributeAspect proto.InternalMessageInfo - -func (m *AttributeAspect) GetAttributeName() string { - if m != nil && m.AttributeName != nil { - return *m.AttributeName - } - return "" -} - -func (m *AttributeAspect) GetAspect() *SkylarkAspect { - if m != nil { - return m.Aspect - } - return nil -} - -type SkylarkAspect struct { - ExtensionFileLabel *string `protobuf:"bytes,1,req,name=extension_file_label,json=extensionFileLabel" json:"extension_file_label,omitempty"` - ExportedName *string `protobuf:"bytes,2,req,name=exported_name,json=exportedName" json:"exported_name,omitempty"` - Attribute []*Attribute `protobuf:"bytes,3,rep,name=attribute" json:"attribute,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SkylarkAspect) Reset() { *m = SkylarkAspect{} } -func (m *SkylarkAspect) String() string { return proto.CompactTextString(m) } -func (*SkylarkAspect) ProtoMessage() {} -func (*SkylarkAspect) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{10} -} - -func (m *SkylarkAspect) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SkylarkAspect.Unmarshal(m, b) -} -func (m *SkylarkAspect) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SkylarkAspect.Marshal(b, m, deterministic) -} -func (m *SkylarkAspect) XXX_Merge(src proto.Message) { - xxx_messageInfo_SkylarkAspect.Merge(m, src) -} -func (m *SkylarkAspect) XXX_Size() int { - return xxx_messageInfo_SkylarkAspect.Size(m) -} -func (m *SkylarkAspect) XXX_DiscardUnknown() { - xxx_messageInfo_SkylarkAspect.DiscardUnknown(m) -} - -var xxx_messageInfo_SkylarkAspect proto.InternalMessageInfo - -func (m *SkylarkAspect) GetExtensionFileLabel() string { - if m != nil && m.ExtensionFileLabel != nil { - return *m.ExtensionFileLabel - } - return "" -} - -func (m *SkylarkAspect) GetExportedName() string { - if m != nil && m.ExportedName != nil { - return *m.ExportedName - } - return "" -} - -func (m *SkylarkAspect) GetAttribute() []*Attribute { - if m != nil { - return m.Attribute - } - return nil -} - -type RuleSummary struct { - Rule *Rule `protobuf:"bytes,1,req,name=rule" json:"rule,omitempty"` - Dependency []*Rule `protobuf:"bytes,2,rep,name=dependency" json:"dependency,omitempty"` - Location *string `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RuleSummary) Reset() { *m = RuleSummary{} } -func (m *RuleSummary) String() string { return proto.CompactTextString(m) } -func (*RuleSummary) ProtoMessage() {} -func (*RuleSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{11} -} - -func (m *RuleSummary) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RuleSummary.Unmarshal(m, b) -} -func (m *RuleSummary) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RuleSummary.Marshal(b, m, deterministic) -} -func (m *RuleSummary) XXX_Merge(src proto.Message) { - xxx_messageInfo_RuleSummary.Merge(m, src) -} -func (m *RuleSummary) XXX_Size() int { - return xxx_messageInfo_RuleSummary.Size(m) -} -func (m *RuleSummary) XXX_DiscardUnknown() { - xxx_messageInfo_RuleSummary.DiscardUnknown(m) -} - -var xxx_messageInfo_RuleSummary proto.InternalMessageInfo - -func (m *RuleSummary) GetRule() *Rule { - if m != nil { - return m.Rule - } - return nil -} - -func (m *RuleSummary) GetDependency() []*Rule { - if m != nil { - return m.Dependency - } - return nil -} - -func (m *RuleSummary) GetLocation() string { - if m != nil && m.Location != nil { - return *m.Location - } - return "" -} - -type PackageGroup struct { - Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` - ContainedPackage []string `protobuf:"bytes,2,rep,name=contained_package,json=containedPackage" json:"contained_package,omitempty"` - IncludedPackageGroup []string `protobuf:"bytes,3,rep,name=included_package_group,json=includedPackageGroup" json:"included_package_group,omitempty"` - DEPRECATEDParseableLocation *Location `protobuf:"bytes,4,opt,name=DEPRECATED_parseable_location,json=DEPRECATEDParseableLocation" json:"DEPRECATED_parseable_location,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PackageGroup) Reset() { *m = PackageGroup{} } -func (m *PackageGroup) String() string { return proto.CompactTextString(m) } -func (*PackageGroup) ProtoMessage() {} -func (*PackageGroup) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{12} -} - -func (m *PackageGroup) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PackageGroup.Unmarshal(m, b) -} -func (m *PackageGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PackageGroup.Marshal(b, m, deterministic) -} -func (m *PackageGroup) XXX_Merge(src proto.Message) { - xxx_messageInfo_PackageGroup.Merge(m, src) -} -func (m *PackageGroup) XXX_Size() int { - return xxx_messageInfo_PackageGroup.Size(m) -} -func (m *PackageGroup) XXX_DiscardUnknown() { - xxx_messageInfo_PackageGroup.DiscardUnknown(m) -} - -var xxx_messageInfo_PackageGroup proto.InternalMessageInfo - -func (m *PackageGroup) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *PackageGroup) GetContainedPackage() []string { - if m != nil { - return m.ContainedPackage - } - return nil -} - -func (m *PackageGroup) GetIncludedPackageGroup() []string { - if m != nil { - return m.IncludedPackageGroup - } - return nil -} - -func (m *PackageGroup) GetDEPRECATEDParseableLocation() *Location { - if m != nil { - return m.DEPRECATEDParseableLocation - } - return nil -} - -type EnvironmentGroup struct { - Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` - Environment []string `protobuf:"bytes,2,rep,name=environment" json:"environment,omitempty"` - Default []string `protobuf:"bytes,3,rep,name=default" json:"default,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *EnvironmentGroup) Reset() { *m = EnvironmentGroup{} } -func (m *EnvironmentGroup) String() string { return proto.CompactTextString(m) } -func (*EnvironmentGroup) ProtoMessage() {} -func (*EnvironmentGroup) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{13} -} - -func (m *EnvironmentGroup) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_EnvironmentGroup.Unmarshal(m, b) -} -func (m *EnvironmentGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_EnvironmentGroup.Marshal(b, m, deterministic) -} -func (m *EnvironmentGroup) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnvironmentGroup.Merge(m, src) -} -func (m *EnvironmentGroup) XXX_Size() int { - return xxx_messageInfo_EnvironmentGroup.Size(m) -} -func (m *EnvironmentGroup) XXX_DiscardUnknown() { - xxx_messageInfo_EnvironmentGroup.DiscardUnknown(m) -} - -var xxx_messageInfo_EnvironmentGroup proto.InternalMessageInfo - -func (m *EnvironmentGroup) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *EnvironmentGroup) GetEnvironment() []string { - if m != nil { - return m.Environment - } - return nil -} - -func (m *EnvironmentGroup) GetDefault() []string { - if m != nil { - return m.Default - } - return nil -} - -type SourceFile struct { - Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` - Location *string `protobuf:"bytes,2,opt,name=location" json:"location,omitempty"` - DEPRECATEDParseableLocation *Location `protobuf:"bytes,7,opt,name=DEPRECATED_parseable_location,json=DEPRECATEDParseableLocation" json:"DEPRECATED_parseable_location,omitempty"` - Subinclude []string `protobuf:"bytes,3,rep,name=subinclude" json:"subinclude,omitempty"` - PackageGroup []string `protobuf:"bytes,4,rep,name=package_group,json=packageGroup" json:"package_group,omitempty"` - VisibilityLabel []string `protobuf:"bytes,5,rep,name=visibility_label,json=visibilityLabel" json:"visibility_label,omitempty"` - Feature []string `protobuf:"bytes,6,rep,name=feature" json:"feature,omitempty"` - License *License `protobuf:"bytes,8,opt,name=license" json:"license,omitempty"` - PackageContainsErrors *bool `protobuf:"varint,9,opt,name=package_contains_errors,json=packageContainsErrors" json:"package_contains_errors,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *SourceFile) Reset() { *m = SourceFile{} } -func (m *SourceFile) String() string { return proto.CompactTextString(m) } -func (*SourceFile) ProtoMessage() {} -func (*SourceFile) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{14} -} - -func (m *SourceFile) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_SourceFile.Unmarshal(m, b) -} -func (m *SourceFile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_SourceFile.Marshal(b, m, deterministic) -} -func (m *SourceFile) XXX_Merge(src proto.Message) { - xxx_messageInfo_SourceFile.Merge(m, src) -} -func (m *SourceFile) XXX_Size() int { - return xxx_messageInfo_SourceFile.Size(m) -} -func (m *SourceFile) XXX_DiscardUnknown() { - xxx_messageInfo_SourceFile.DiscardUnknown(m) -} - -var xxx_messageInfo_SourceFile proto.InternalMessageInfo - -func (m *SourceFile) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *SourceFile) GetLocation() string { - if m != nil && m.Location != nil { - return *m.Location - } - return "" -} - -func (m *SourceFile) GetDEPRECATEDParseableLocation() *Location { - if m != nil { - return m.DEPRECATEDParseableLocation - } - return nil -} - -func (m *SourceFile) GetSubinclude() []string { - if m != nil { - return m.Subinclude - } - return nil -} - -func (m *SourceFile) GetPackageGroup() []string { - if m != nil { - return m.PackageGroup - } - return nil -} - -func (m *SourceFile) GetVisibilityLabel() []string { - if m != nil { - return m.VisibilityLabel - } - return nil -} - -func (m *SourceFile) GetFeature() []string { - if m != nil { - return m.Feature - } - return nil -} - -func (m *SourceFile) GetLicense() *License { - if m != nil { - return m.License - } - return nil -} - -func (m *SourceFile) GetPackageContainsErrors() bool { - if m != nil && m.PackageContainsErrors != nil { - return *m.PackageContainsErrors - } - return false -} - -type GeneratedFile struct { - Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` - GeneratingRule *string `protobuf:"bytes,2,req,name=generating_rule,json=generatingRule" json:"generating_rule,omitempty"` - Location *string `protobuf:"bytes,3,opt,name=location" json:"location,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GeneratedFile) Reset() { *m = GeneratedFile{} } -func (m *GeneratedFile) String() string { return proto.CompactTextString(m) } -func (*GeneratedFile) ProtoMessage() {} -func (*GeneratedFile) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{15} -} - -func (m *GeneratedFile) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_GeneratedFile.Unmarshal(m, b) -} -func (m *GeneratedFile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_GeneratedFile.Marshal(b, m, deterministic) -} -func (m *GeneratedFile) XXX_Merge(src proto.Message) { - xxx_messageInfo_GeneratedFile.Merge(m, src) -} -func (m *GeneratedFile) XXX_Size() int { - return xxx_messageInfo_GeneratedFile.Size(m) -} -func (m *GeneratedFile) XXX_DiscardUnknown() { - xxx_messageInfo_GeneratedFile.DiscardUnknown(m) -} - -var xxx_messageInfo_GeneratedFile proto.InternalMessageInfo - -func (m *GeneratedFile) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *GeneratedFile) GetGeneratingRule() string { - if m != nil && m.GeneratingRule != nil { - return *m.GeneratingRule - } - return "" -} - -func (m *GeneratedFile) GetLocation() string { - if m != nil && m.Location != nil { - return *m.Location - } - return "" -} - -type Target struct { - Type *Target_Discriminator `protobuf:"varint,1,req,name=type,enum=blaze_query.Target_Discriminator" json:"type,omitempty"` - Rule *Rule `protobuf:"bytes,2,opt,name=rule" json:"rule,omitempty"` - SourceFile *SourceFile `protobuf:"bytes,3,opt,name=source_file,json=sourceFile" json:"source_file,omitempty"` - GeneratedFile *GeneratedFile `protobuf:"bytes,4,opt,name=generated_file,json=generatedFile" json:"generated_file,omitempty"` - PackageGroup *PackageGroup `protobuf:"bytes,5,opt,name=package_group,json=packageGroup" json:"package_group,omitempty"` - EnvironmentGroup *EnvironmentGroup `protobuf:"bytes,6,opt,name=environment_group,json=environmentGroup" json:"environment_group,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Target) Reset() { *m = Target{} } -func (m *Target) String() string { return proto.CompactTextString(m) } -func (*Target) ProtoMessage() {} -func (*Target) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{16} -} - -func (m *Target) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Target.Unmarshal(m, b) -} -func (m *Target) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Target.Marshal(b, m, deterministic) -} -func (m *Target) XXX_Merge(src proto.Message) { - xxx_messageInfo_Target.Merge(m, src) -} -func (m *Target) XXX_Size() int { - return xxx_messageInfo_Target.Size(m) -} -func (m *Target) XXX_DiscardUnknown() { - xxx_messageInfo_Target.DiscardUnknown(m) -} - -var xxx_messageInfo_Target proto.InternalMessageInfo - -func (m *Target) GetType() Target_Discriminator { - if m != nil && m.Type != nil { - return *m.Type - } - return Target_RULE -} - -func (m *Target) GetRule() *Rule { - if m != nil { - return m.Rule - } - return nil -} - -func (m *Target) GetSourceFile() *SourceFile { - if m != nil { - return m.SourceFile - } - return nil -} - -func (m *Target) GetGeneratedFile() *GeneratedFile { - if m != nil { - return m.GeneratedFile - } - return nil -} - -func (m *Target) GetPackageGroup() *PackageGroup { - if m != nil { - return m.PackageGroup - } - return nil -} - -func (m *Target) GetEnvironmentGroup() *EnvironmentGroup { - if m != nil { - return m.EnvironmentGroup - } - return nil -} - -type QueryResult struct { - Target []*Target `protobuf:"bytes,1,rep,name=target" json:"target,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *QueryResult) Reset() { *m = QueryResult{} } -func (m *QueryResult) String() string { return proto.CompactTextString(m) } -func (*QueryResult) ProtoMessage() {} -func (*QueryResult) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{17} -} - -func (m *QueryResult) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_QueryResult.Unmarshal(m, b) -} -func (m *QueryResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_QueryResult.Marshal(b, m, deterministic) -} -func (m *QueryResult) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryResult.Merge(m, src) -} -func (m *QueryResult) XXX_Size() int { - return xxx_messageInfo_QueryResult.Size(m) -} -func (m *QueryResult) XXX_DiscardUnknown() { - xxx_messageInfo_QueryResult.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryResult proto.InternalMessageInfo - -func (m *QueryResult) GetTarget() []*Target { - if m != nil { - return m.Target - } - return nil -} - -type AllowedRuleClassInfo struct { - Policy *AllowedRuleClassInfo_AllowedRuleClasses `protobuf:"varint,1,req,name=policy,enum=blaze_query.AllowedRuleClassInfo_AllowedRuleClasses" json:"policy,omitempty"` - AllowedRuleClass []string `protobuf:"bytes,2,rep,name=allowed_rule_class,json=allowedRuleClass" json:"allowed_rule_class,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AllowedRuleClassInfo) Reset() { *m = AllowedRuleClassInfo{} } -func (m *AllowedRuleClassInfo) String() string { return proto.CompactTextString(m) } -func (*AllowedRuleClassInfo) ProtoMessage() {} -func (*AllowedRuleClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{18} -} - -func (m *AllowedRuleClassInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AllowedRuleClassInfo.Unmarshal(m, b) -} -func (m *AllowedRuleClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AllowedRuleClassInfo.Marshal(b, m, deterministic) -} -func (m *AllowedRuleClassInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_AllowedRuleClassInfo.Merge(m, src) -} -func (m *AllowedRuleClassInfo) XXX_Size() int { - return xxx_messageInfo_AllowedRuleClassInfo.Size(m) -} -func (m *AllowedRuleClassInfo) XXX_DiscardUnknown() { - xxx_messageInfo_AllowedRuleClassInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_AllowedRuleClassInfo proto.InternalMessageInfo - -func (m *AllowedRuleClassInfo) GetPolicy() AllowedRuleClassInfo_AllowedRuleClasses { - if m != nil && m.Policy != nil { - return *m.Policy - } - return AllowedRuleClassInfo_ANY -} - -func (m *AllowedRuleClassInfo) GetAllowedRuleClass() []string { - if m != nil { - return m.AllowedRuleClass - } - return nil -} - -type AttributeDefinition struct { - Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` - Type *Attribute_Discriminator `protobuf:"varint,2,req,name=type,enum=blaze_query.Attribute_Discriminator" json:"type,omitempty"` - Mandatory *bool `protobuf:"varint,3,req,name=mandatory" json:"mandatory,omitempty"` - AllowedRuleClasses *AllowedRuleClassInfo `protobuf:"bytes,4,opt,name=allowed_rule_classes,json=allowedRuleClasses" json:"allowed_rule_classes,omitempty"` - Documentation *string `protobuf:"bytes,5,opt,name=documentation" json:"documentation,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AttributeDefinition) Reset() { *m = AttributeDefinition{} } -func (m *AttributeDefinition) String() string { return proto.CompactTextString(m) } -func (*AttributeDefinition) ProtoMessage() {} -func (*AttributeDefinition) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{19} -} - -func (m *AttributeDefinition) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_AttributeDefinition.Unmarshal(m, b) -} -func (m *AttributeDefinition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_AttributeDefinition.Marshal(b, m, deterministic) -} -func (m *AttributeDefinition) XXX_Merge(src proto.Message) { - xxx_messageInfo_AttributeDefinition.Merge(m, src) -} -func (m *AttributeDefinition) XXX_Size() int { - return xxx_messageInfo_AttributeDefinition.Size(m) -} -func (m *AttributeDefinition) XXX_DiscardUnknown() { - xxx_messageInfo_AttributeDefinition.DiscardUnknown(m) -} - -var xxx_messageInfo_AttributeDefinition proto.InternalMessageInfo - -func (m *AttributeDefinition) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *AttributeDefinition) GetType() Attribute_Discriminator { - if m != nil && m.Type != nil { - return *m.Type - } - return Attribute_INTEGER -} - -func (m *AttributeDefinition) GetMandatory() bool { - if m != nil && m.Mandatory != nil { - return *m.Mandatory - } - return false -} - -func (m *AttributeDefinition) GetAllowedRuleClasses() *AllowedRuleClassInfo { - if m != nil { - return m.AllowedRuleClasses - } - return nil -} - -func (m *AttributeDefinition) GetDocumentation() string { - if m != nil && m.Documentation != nil { - return *m.Documentation - } - return "" -} - -type RuleDefinition struct { - Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` - Attribute []*AttributeDefinition `protobuf:"bytes,2,rep,name=attribute" json:"attribute,omitempty"` - Documentation *string `protobuf:"bytes,3,opt,name=documentation" json:"documentation,omitempty"` - Label *string `protobuf:"bytes,4,opt,name=label" json:"label,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RuleDefinition) Reset() { *m = RuleDefinition{} } -func (m *RuleDefinition) String() string { return proto.CompactTextString(m) } -func (*RuleDefinition) ProtoMessage() {} -func (*RuleDefinition) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{20} -} - -func (m *RuleDefinition) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RuleDefinition.Unmarshal(m, b) -} -func (m *RuleDefinition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RuleDefinition.Marshal(b, m, deterministic) -} -func (m *RuleDefinition) XXX_Merge(src proto.Message) { - xxx_messageInfo_RuleDefinition.Merge(m, src) -} -func (m *RuleDefinition) XXX_Size() int { - return xxx_messageInfo_RuleDefinition.Size(m) -} -func (m *RuleDefinition) XXX_DiscardUnknown() { - xxx_messageInfo_RuleDefinition.DiscardUnknown(m) -} - -var xxx_messageInfo_RuleDefinition proto.InternalMessageInfo - -func (m *RuleDefinition) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *RuleDefinition) GetAttribute() []*AttributeDefinition { - if m != nil { - return m.Attribute - } - return nil -} - -func (m *RuleDefinition) GetDocumentation() string { - if m != nil && m.Documentation != nil { - return *m.Documentation - } - return "" -} - -func (m *RuleDefinition) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" -} - -type BuildLanguage struct { - Rule []*RuleDefinition `protobuf:"bytes,1,rep,name=rule" json:"rule,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *BuildLanguage) Reset() { *m = BuildLanguage{} } -func (m *BuildLanguage) String() string { return proto.CompactTextString(m) } -func (*BuildLanguage) ProtoMessage() {} -func (*BuildLanguage) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{21} -} - -func (m *BuildLanguage) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BuildLanguage.Unmarshal(m, b) -} -func (m *BuildLanguage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BuildLanguage.Marshal(b, m, deterministic) -} -func (m *BuildLanguage) XXX_Merge(src proto.Message) { - xxx_messageInfo_BuildLanguage.Merge(m, src) -} -func (m *BuildLanguage) XXX_Size() int { - return xxx_messageInfo_BuildLanguage.Size(m) -} -func (m *BuildLanguage) XXX_DiscardUnknown() { - xxx_messageInfo_BuildLanguage.DiscardUnknown(m) -} - -var xxx_messageInfo_BuildLanguage proto.InternalMessageInfo - -func (m *BuildLanguage) GetRule() []*RuleDefinition { - if m != nil { - return m.Rule - } - return nil -} - -type Location struct { - StartOffset *int32 `protobuf:"varint,1,opt,name=start_offset,json=startOffset" json:"start_offset,omitempty"` - StartLine *int32 `protobuf:"varint,2,opt,name=start_line,json=startLine" json:"start_line,omitempty"` - StartColumn *int32 `protobuf:"varint,3,opt,name=start_column,json=startColumn" json:"start_column,omitempty"` - EndOffset *int32 `protobuf:"varint,4,opt,name=end_offset,json=endOffset" json:"end_offset,omitempty"` - EndLine *int32 `protobuf:"varint,5,opt,name=end_line,json=endLine" json:"end_line,omitempty"` - EndColumn *int32 `protobuf:"varint,6,opt,name=end_column,json=endColumn" json:"end_column,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Location) Reset() { *m = Location{} } -func (m *Location) String() string { return proto.CompactTextString(m) } -func (*Location) ProtoMessage() {} -func (*Location) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{22} -} - -func (m *Location) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Location.Unmarshal(m, b) -} -func (m *Location) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Location.Marshal(b, m, deterministic) -} -func (m *Location) XXX_Merge(src proto.Message) { - xxx_messageInfo_Location.Merge(m, src) -} -func (m *Location) XXX_Size() int { - return xxx_messageInfo_Location.Size(m) -} -func (m *Location) XXX_DiscardUnknown() { - xxx_messageInfo_Location.DiscardUnknown(m) -} - -var xxx_messageInfo_Location proto.InternalMessageInfo - -func (m *Location) GetStartOffset() int32 { - if m != nil && m.StartOffset != nil { - return *m.StartOffset - } - return 0 -} - -func (m *Location) GetStartLine() int32 { - if m != nil && m.StartLine != nil { - return *m.StartLine - } - return 0 -} - -func (m *Location) GetStartColumn() int32 { - if m != nil && m.StartColumn != nil { - return *m.StartColumn - } - return 0 -} - -func (m *Location) GetEndOffset() int32 { - if m != nil && m.EndOffset != nil { - return *m.EndOffset - } - return 0 -} - -func (m *Location) GetEndLine() int32 { - if m != nil && m.EndLine != nil { - return *m.EndLine - } - return 0 -} - -func (m *Location) GetEndColumn() int32 { - if m != nil && m.EndColumn != nil { - return *m.EndColumn - } - return 0 -} - -type MakeVarBinding struct { - Value *string `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` - PlatformSetRegexp *string `protobuf:"bytes,2,req,name=platform_set_regexp,json=platformSetRegexp" json:"platform_set_regexp,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MakeVarBinding) Reset() { *m = MakeVarBinding{} } -func (m *MakeVarBinding) String() string { return proto.CompactTextString(m) } -func (*MakeVarBinding) ProtoMessage() {} -func (*MakeVarBinding) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{23} -} - -func (m *MakeVarBinding) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MakeVarBinding.Unmarshal(m, b) -} -func (m *MakeVarBinding) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MakeVarBinding.Marshal(b, m, deterministic) -} -func (m *MakeVarBinding) XXX_Merge(src proto.Message) { - xxx_messageInfo_MakeVarBinding.Merge(m, src) -} -func (m *MakeVarBinding) XXX_Size() int { - return xxx_messageInfo_MakeVarBinding.Size(m) -} -func (m *MakeVarBinding) XXX_DiscardUnknown() { - xxx_messageInfo_MakeVarBinding.DiscardUnknown(m) -} - -var xxx_messageInfo_MakeVarBinding proto.InternalMessageInfo - -func (m *MakeVarBinding) GetValue() string { - if m != nil && m.Value != nil { - return *m.Value - } - return "" -} - -func (m *MakeVarBinding) GetPlatformSetRegexp() string { - if m != nil && m.PlatformSetRegexp != nil { - return *m.PlatformSetRegexp - } - return "" -} - -type MakeVar struct { - Name *string `protobuf:"bytes,1,req,name=name" json:"name,omitempty"` - Binding []*MakeVarBinding `protobuf:"bytes,2,rep,name=binding" json:"binding,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MakeVar) Reset() { *m = MakeVar{} } -func (m *MakeVar) String() string { return proto.CompactTextString(m) } -func (*MakeVar) ProtoMessage() {} -func (*MakeVar) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{24} -} - -func (m *MakeVar) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MakeVar.Unmarshal(m, b) -} -func (m *MakeVar) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MakeVar.Marshal(b, m, deterministic) -} -func (m *MakeVar) XXX_Merge(src proto.Message) { - xxx_messageInfo_MakeVar.Merge(m, src) -} -func (m *MakeVar) XXX_Size() int { - return xxx_messageInfo_MakeVar.Size(m) -} -func (m *MakeVar) XXX_DiscardUnknown() { - xxx_messageInfo_MakeVar.DiscardUnknown(m) -} - -var xxx_messageInfo_MakeVar proto.InternalMessageInfo - -func (m *MakeVar) GetName() string { - if m != nil && m.Name != nil { - return *m.Name - } - return "" -} - -func (m *MakeVar) GetBinding() []*MakeVarBinding { - if m != nil { - return m.Binding - } - return nil -} - -type DEPRECATED_GlobCriteria struct { - Include []string `protobuf:"bytes,1,rep,name=include" json:"include,omitempty"` - Exclude []string `protobuf:"bytes,2,rep,name=exclude" json:"exclude,omitempty"` - Glob *bool `protobuf:"varint,3,opt,name=glob" json:"glob,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DEPRECATED_GlobCriteria) Reset() { *m = DEPRECATED_GlobCriteria{} } -func (m *DEPRECATED_GlobCriteria) String() string { return proto.CompactTextString(m) } -func (*DEPRECATED_GlobCriteria) ProtoMessage() {} -func (*DEPRECATED_GlobCriteria) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{25} -} - -func (m *DEPRECATED_GlobCriteria) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_DEPRECATED_GlobCriteria.Unmarshal(m, b) -} -func (m *DEPRECATED_GlobCriteria) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_DEPRECATED_GlobCriteria.Marshal(b, m, deterministic) -} -func (m *DEPRECATED_GlobCriteria) XXX_Merge(src proto.Message) { - xxx_messageInfo_DEPRECATED_GlobCriteria.Merge(m, src) -} -func (m *DEPRECATED_GlobCriteria) XXX_Size() int { - return xxx_messageInfo_DEPRECATED_GlobCriteria.Size(m) -} -func (m *DEPRECATED_GlobCriteria) XXX_DiscardUnknown() { - xxx_messageInfo_DEPRECATED_GlobCriteria.DiscardUnknown(m) -} - -var xxx_messageInfo_DEPRECATED_GlobCriteria proto.InternalMessageInfo - -func (m *DEPRECATED_GlobCriteria) GetInclude() []string { - if m != nil { - return m.Include - } - return nil -} - -func (m *DEPRECATED_GlobCriteria) GetExclude() []string { - if m != nil { - return m.Exclude - } - return nil -} - -func (m *DEPRECATED_GlobCriteria) GetGlob() bool { - if m != nil && m.Glob != nil { - return *m.Glob - } - return false -} - -type Event struct { - Kind *Event_EventKind `protobuf:"varint,1,req,name=kind,enum=blaze_query.Event_EventKind" json:"kind,omitempty"` - DEPRECATEDLocation *Location `protobuf:"bytes,2,opt,name=DEPRECATED_location,json=DEPRECATEDLocation" json:"DEPRECATED_location,omitempty"` - Message *string `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Event) Reset() { *m = Event{} } -func (m *Event) String() string { return proto.CompactTextString(m) } -func (*Event) ProtoMessage() {} -func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_48e86b2d5f43637b, []int{26} -} - -func (m *Event) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Event.Unmarshal(m, b) -} -func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Event.Marshal(b, m, deterministic) -} -func (m *Event) XXX_Merge(src proto.Message) { - xxx_messageInfo_Event.Merge(m, src) -} -func (m *Event) XXX_Size() int { - return xxx_messageInfo_Event.Size(m) -} -func (m *Event) XXX_DiscardUnknown() { - xxx_messageInfo_Event.DiscardUnknown(m) -} - -var xxx_messageInfo_Event proto.InternalMessageInfo - -func (m *Event) GetKind() Event_EventKind { - if m != nil && m.Kind != nil { - return *m.Kind - } - return Event_ERROR -} - -func (m *Event) GetDEPRECATEDLocation() *Location { - if m != nil { - return m.DEPRECATEDLocation - } - return nil -} - -func (m *Event) GetMessage() string { - if m != nil && m.Message != nil { - return *m.Message - } - return "" -} - -func init() { - proto.RegisterEnum("blaze_query.FilesetEntry_SymlinkBehavior", FilesetEntry_SymlinkBehavior_name, FilesetEntry_SymlinkBehavior_value) - proto.RegisterEnum("blaze_query.Attribute_Discriminator", Attribute_Discriminator_name, Attribute_Discriminator_value) - proto.RegisterEnum("blaze_query.Attribute_Tristate", Attribute_Tristate_name, Attribute_Tristate_value) - proto.RegisterEnum("blaze_query.Target_Discriminator", Target_Discriminator_name, Target_Discriminator_value) - proto.RegisterEnum("blaze_query.AllowedRuleClassInfo_AllowedRuleClasses", AllowedRuleClassInfo_AllowedRuleClasses_name, AllowedRuleClassInfo_AllowedRuleClasses_value) - proto.RegisterEnum("blaze_query.Event_EventKind", Event_EventKind_name, Event_EventKind_value) - proto.RegisterType((*License)(nil), "blaze_query.License") - proto.RegisterType((*StringDictEntry)(nil), "blaze_query.StringDictEntry") - proto.RegisterType((*LabelDictUnaryEntry)(nil), "blaze_query.LabelDictUnaryEntry") - proto.RegisterType((*LabelListDictEntry)(nil), "blaze_query.LabelListDictEntry") - proto.RegisterType((*LabelKeyedStringDictEntry)(nil), "blaze_query.LabelKeyedStringDictEntry") - proto.RegisterType((*StringListDictEntry)(nil), "blaze_query.StringListDictEntry") - proto.RegisterType((*FilesetEntry)(nil), "blaze_query.FilesetEntry") - proto.RegisterType((*Attribute)(nil), "blaze_query.Attribute") - proto.RegisterType((*Attribute_SelectorEntry)(nil), "blaze_query.Attribute.SelectorEntry") - proto.RegisterType((*Attribute_Selector)(nil), "blaze_query.Attribute.Selector") - proto.RegisterType((*Attribute_SelectorList)(nil), "blaze_query.Attribute.SelectorList") - proto.RegisterType((*Rule)(nil), "blaze_query.Rule") - proto.RegisterType((*AttributeAspect)(nil), "blaze_query.AttributeAspect") - proto.RegisterType((*SkylarkAspect)(nil), "blaze_query.SkylarkAspect") - proto.RegisterType((*RuleSummary)(nil), "blaze_query.RuleSummary") - proto.RegisterType((*PackageGroup)(nil), "blaze_query.PackageGroup") - proto.RegisterType((*EnvironmentGroup)(nil), "blaze_query.EnvironmentGroup") - proto.RegisterType((*SourceFile)(nil), "blaze_query.SourceFile") - proto.RegisterType((*GeneratedFile)(nil), "blaze_query.GeneratedFile") - proto.RegisterType((*Target)(nil), "blaze_query.Target") - proto.RegisterType((*QueryResult)(nil), "blaze_query.QueryResult") - proto.RegisterType((*AllowedRuleClassInfo)(nil), "blaze_query.AllowedRuleClassInfo") - proto.RegisterType((*AttributeDefinition)(nil), "blaze_query.AttributeDefinition") - proto.RegisterType((*RuleDefinition)(nil), "blaze_query.RuleDefinition") - proto.RegisterType((*BuildLanguage)(nil), "blaze_query.BuildLanguage") - proto.RegisterType((*Location)(nil), "blaze_query.Location") - proto.RegisterType((*MakeVarBinding)(nil), "blaze_query.MakeVarBinding") - proto.RegisterType((*MakeVar)(nil), "blaze_query.MakeVar") - proto.RegisterType((*DEPRECATED_GlobCriteria)(nil), "blaze_query.DEPRECATED_GlobCriteria") - proto.RegisterType((*Event)(nil), "blaze_query.Event") -} - -func init() { proto.RegisterFile("build_proto/build.proto", fileDescriptor_48e86b2d5f43637b) } - -var fileDescriptor_48e86b2d5f43637b = []byte{ - // 2630 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0x4b, 0x97, 0xe3, 0x46, - 0x15, 0x46, 0x7e, 0xfb, 0xfa, 0xa5, 0xae, 0x7e, 0x8c, 0xe6, 0x95, 0x38, 0xca, 0x84, 0x38, 0x8f, - 0xd3, 0x49, 0xcc, 0x24, 0x27, 0x24, 0x90, 0x83, 0xdb, 0x56, 0x77, 0x9c, 0x71, 0xec, 0xa6, 0x6c, - 0x4f, 0x68, 0x16, 0xe8, 0xc8, 0x56, 0xb5, 0xbb, 0x4e, 0xcb, 0x92, 0x91, 0xe4, 0x61, 0xcc, 0x96, - 0xc3, 0x02, 0x7e, 0x43, 0x16, 0x2c, 0xe1, 0x17, 0xb0, 0x65, 0xc9, 0x4f, 0x80, 0xc3, 0x86, 0x1f, - 0xc2, 0x82, 0x53, 0x0f, 0xd9, 0x52, 0xb7, 0x3b, 0xd3, 0x19, 0x1e, 0x0b, 0x0e, 0x1b, 0x1f, 0xd7, - 0x7d, 0x7c, 0x75, 0x6f, 0xd5, 0xbd, 0xb7, 0x6e, 0x95, 0xe0, 0xce, 0x64, 0x49, 0x1d, 0xdb, 0x5c, - 0xf8, 0x5e, 0xe8, 0xbd, 0xc7, 0xff, 0x1f, 0xf2, 0xff, 0xa8, 0x34, 0x71, 0xac, 0x5f, 0x12, 0xf3, - 0xe7, 0x4b, 0xe2, 0xaf, 0xf4, 0x2f, 0x20, 0xdf, 0xa3, 0x53, 0xe2, 0x06, 0x04, 0xbd, 0x06, 0x65, - 0x47, 0xfc, 0x35, 0xc3, 0xd5, 0x82, 0x68, 0x4a, 0x3d, 0xdd, 0x28, 0xe2, 0x92, 0xa4, 0x8d, 0x56, - 0x0b, 0x82, 0x1e, 0x40, 0x91, 0x3c, 0x9f, 0x92, 0x45, 0x48, 0x3d, 0x57, 0x4b, 0x71, 0xfe, 0x86, - 0xa0, 0x7f, 0x1f, 0x6a, 0xc3, 0xd0, 0xa7, 0xee, 0xac, 0x43, 0xa7, 0xa1, 0xe1, 0x86, 0xfe, 0x0a, - 0xa9, 0x90, 0xbe, 0x24, 0x2b, 0x4d, 0xa9, 0xa7, 0x1a, 0x45, 0xcc, 0xfe, 0xa2, 0x3d, 0xc8, 0x3e, - 0xb3, 0x9c, 0x25, 0xd1, 0x52, 0x9c, 0x26, 0x06, 0xfa, 0x0f, 0x61, 0xb7, 0x67, 0x4d, 0x88, 0xc3, - 0x34, 0xc7, 0xae, 0xe5, 0xaf, 0xbe, 0x9d, 0xfa, 0x0f, 0x00, 0x71, 0xf5, 0x1e, 0x0d, 0xc2, 0x5b, - 0x4e, 0x9e, 0xde, 0x68, 0xb7, 0xe1, 0x2e, 0xd7, 0x7e, 0x42, 0x56, 0xc4, 0xfe, 0x17, 0x3c, 0x10, - 0xaa, 0x2f, 0x67, 0xc3, 0xdf, 0x52, 0x50, 0x3e, 0xa6, 0x0e, 0x09, 0x88, 0x54, 0x3c, 0x80, 0x5c, - 0xe0, 0x2d, 0xfd, 0x29, 0x91, 0xba, 0x72, 0x84, 0xbe, 0x07, 0xfb, 0x36, 0x09, 0x42, 0xea, 0x5a, - 0x6c, 0xcd, 0x4d, 0x9b, 0xfa, 0x64, 0x1a, 0x7a, 0xfe, 0x4a, 0x5a, 0xb3, 0x17, 0x63, 0x76, 0x22, - 0x1e, 0x7a, 0x1d, 0x2a, 0xe7, 0x0c, 0xdc, 0x5c, 0xf8, 0x24, 0x20, 0x6e, 0xa8, 0xe5, 0xeb, 0x4a, - 0xa3, 0x80, 0xcb, 0x9c, 0x78, 0x2a, 0x68, 0x08, 0x41, 0x86, 0x8d, 0xb5, 0x34, 0xb7, 0x8b, 0xff, - 0x47, 0x1a, 0xe4, 0xc9, 0xf3, 0xa9, 0xb3, 0xb4, 0x89, 0x96, 0xe1, 0xe4, 0x68, 0x88, 0x7e, 0x0a, - 0x6a, 0xb0, 0x9a, 0x3b, 0xd4, 0xbd, 0x34, 0x27, 0xe4, 0xc2, 0x7a, 0x46, 0x3d, 0x5f, 0xcb, 0xd6, - 0x95, 0x46, 0xb5, 0xf9, 0xd6, 0x61, 0x2c, 0xc0, 0x0e, 0xe3, 0x4e, 0x1d, 0x0e, 0x85, 0xc6, 0x91, - 0x54, 0xf8, 0x24, 0xd3, 0x1e, 0x9c, 0x9e, 0xe1, 0x5a, 0x90, 0x24, 0xb3, 0x48, 0x0c, 0x42, 0x9f, - 0x2e, 0x98, 0xb9, 0xe7, 0xf4, 0xb9, 0x96, 0xab, 0x2b, 0x2c, 0x12, 0x39, 0xed, 0x94, 0x93, 0xf4, - 0x77, 0xa1, 0x76, 0x05, 0x0c, 0x15, 0x80, 0xc3, 0xa9, 0x0a, 0xaa, 0x41, 0xa9, 0x63, 0x60, 0xe3, - 0xd8, 0xc0, 0x46, 0xbf, 0x6d, 0xa8, 0x29, 0xfd, 0xf7, 0x1a, 0x14, 0x5b, 0x61, 0xe8, 0xd3, 0xc9, - 0x32, 0x24, 0xcc, 0x51, 0xd7, 0x9a, 0x47, 0x0b, 0xcb, 0xff, 0xa3, 0x33, 0x78, 0xd8, 0x31, 0x4e, - 0xb1, 0xd1, 0x6e, 0x8d, 0x8c, 0x8e, 0xb9, 0xb0, 0xfc, 0x80, 0x58, 0x13, 0x87, 0x98, 0x8e, 0x37, - 0xe5, 0x6b, 0xa9, 0x95, 0xeb, 0x4a, 0xa3, 0xd4, 0xdc, 0x4f, 0xf8, 0xd6, 0x93, 0x4c, 0x7c, 0x7f, - 0xa3, 0x7b, 0x1a, 0xa9, 0x46, 0x4c, 0xf4, 0x01, 0xec, 0x91, 0xe7, 0x0b, 0x87, 0x4e, 0x69, 0xe8, - 0xac, 0xcc, 0x60, 0x41, 0xa6, 0xf4, 0x9c, 0x12, 0x5b, 0xab, 0xf0, 0x3d, 0xd8, 0xdd, 0xf0, 0x86, - 0x11, 0x8b, 0xc5, 0x88, 0xeb, 0xd9, 0x64, 0xa1, 0xed, 0x71, 0x19, 0x31, 0x40, 0x1f, 0x43, 0x86, - 0x27, 0x26, 0xdb, 0xe9, 0x6a, 0xf3, 0x51, 0xc2, 0x94, 0xb5, 0x77, 0x87, 0x1d, 0x1a, 0x4c, 0x7d, - 0x3a, 0x67, 0x31, 0xe0, 0xf9, 0x98, 0x6b, 0xa0, 0xfb, 0x50, 0xa4, 0x6e, 0x68, 0x8a, 0xb8, 0x4b, - 0xd7, 0x95, 0x46, 0x16, 0x17, 0xa8, 0x1b, 0x3e, 0x65, 0xe3, 0x68, 0xb5, 0xdd, 0x99, 0xe4, 0x67, - 0x37, 0xab, 0xed, 0xce, 0x84, 0xc8, 0xeb, 0x50, 0x99, 0x78, 0x9e, 0x43, 0x2c, 0x57, 0xca, 0x54, - 0x45, 0xfc, 0x48, 0xa2, 0x10, 0x3a, 0x86, 0x6a, 0xe8, 0xd3, 0x20, 0xb4, 0x42, 0x22, 0xa5, 0x6a, - 0x3c, 0x1e, 0x5e, 0xbd, 0xc1, 0xd0, 0x91, 0x14, 0xc6, 0x95, 0x48, 0x4d, 0xe0, 0xbc, 0x0d, 0x3b, - 0xd2, 0x1e, 0x87, 0x06, 0x91, 0xd1, 0x39, 0x1e, 0x7d, 0xb5, 0x60, 0x9d, 0x62, 0x42, 0xf6, 0x10, - 0xf2, 0xb2, 0x3e, 0xf1, 0x90, 0x2e, 0x35, 0xf7, 0x92, 0x1b, 0x24, 0x78, 0x38, 0x12, 0x42, 0x9f, - 0xaf, 0xb1, 0x6d, 0x3a, 0x8d, 0xb0, 0x0b, 0xf5, 0x74, 0xa3, 0xd4, 0x7c, 0x90, 0xd0, 0xbc, 0x52, - 0x06, 0xa2, 0x99, 0x19, 0x41, 0xcc, 0x7c, 0x02, 0xe8, 0x5c, 0x84, 0x76, 0xdc, 0xcc, 0x22, 0x87, - 0xba, 0x7b, 0x63, 0x06, 0x60, 0x55, 0x2a, 0x6d, 0x5c, 0xc0, 0xb0, 0xef, 0xb0, 0xea, 0x23, 0x60, - 0x62, 0x66, 0x01, 0xc7, 0x4a, 0xae, 0xde, 0xf5, 0x2a, 0x87, 0x91, 0x13, 0xa7, 0x09, 0xcc, 0x31, - 0x1c, 0xc4, 0x97, 0x30, 0x06, 0x5a, 0xe2, 0xa0, 0xf5, 0x2d, 0xbe, 0x26, 0x51, 0x77, 0x83, 0x04, - 0x51, 0xc0, 0x3e, 0x82, 0x2a, 0x0b, 0xa3, 0x98, 0xbf, 0x3b, 0xf5, 0x74, 0x23, 0x8b, 0xcb, 0xd4, - 0x8d, 0x39, 0x34, 0x86, 0x03, 0xe1, 0x10, 0x9f, 0x76, 0xc9, 0xaa, 0xb9, 0x94, 0xde, 0xdd, 0x32, - 0xf9, 0x96, 0xb2, 0x8f, 0x77, 0x9d, 0x04, 0x51, 0xc0, 0x5e, 0xc0, 0x43, 0x01, 0x7b, 0xc9, 0xca, - 0xb4, 0x79, 0x7d, 0x1b, 0x0f, 0x38, 0xfa, 0x77, 0xaf, 0xa3, 0x6f, 0xab, 0xeb, 0xf8, 0xae, 0xb3, - 0x85, 0x25, 0x66, 0xfa, 0x1c, 0x2a, 0x01, 0x71, 0x78, 0xe9, 0xe4, 0xbe, 0x6a, 0xfb, 0x3c, 0xb4, - 0x5e, 0xbf, 0x21, 0x8e, 0x87, 0x52, 0x96, 0xad, 0x00, 0x2e, 0x07, 0xb1, 0x11, 0xfa, 0x19, 0x68, - 0xb1, 0xaa, 0x32, 0x73, 0xbc, 0x89, 0x39, 0xf5, 0x69, 0x48, 0x7c, 0x6a, 0x69, 0x2a, 0x37, 0x37, - 0x99, 0xc5, 0x31, 0xe1, 0x13, 0xc7, 0x9b, 0xb4, 0xa5, 0x2c, 0x3e, 0xd8, 0x30, 0xe2, 0x74, 0xf4, - 0x05, 0xe8, 0x31, 0x95, 0xf8, 0x92, 0xc4, 0x97, 0x1d, 0xd5, 0xd3, 0x8d, 0x32, 0x7e, 0x65, 0x23, - 0xb9, 0x71, 0x78, 0xb3, 0xbe, 0xf7, 0xfe, 0x50, 0x80, 0x4a, 0xe4, 0x8a, 0x38, 0x82, 0xf6, 0x20, - 0xcb, 0x17, 0x49, 0x53, 0x78, 0x45, 0x10, 0x03, 0xd4, 0x00, 0x95, 0x06, 0xa6, 0x4d, 0xce, 0xad, - 0xa5, 0x13, 0x2d, 0xbd, 0xca, 0xcb, 0x41, 0x95, 0x06, 0x1d, 0x41, 0x16, 0xeb, 0x98, 0xa8, 0x3a, - 0xa9, 0x17, 0x54, 0x9d, 0xf4, 0x2d, 0xaa, 0x4e, 0xe6, 0x56, 0x55, 0x27, 0xfb, 0xff, 0xaa, 0xf3, - 0x3f, 0x5e, 0x75, 0x2a, 0xdf, 0xaa, 0xea, 0xd4, 0xfe, 0xa3, 0x55, 0x67, 0xe7, 0xdf, 0x55, 0x75, - 0xbe, 0xa9, 0x56, 0x94, 0xff, 0x6b, 0xb5, 0xa2, 0x7a, 0xab, 0x5a, 0xf1, 0xb5, 0x02, 0x85, 0xa8, - 0x56, 0xa0, 0xcf, 0x20, 0x4f, 0xdc, 0xd0, 0xa7, 0x24, 0xe0, 0x57, 0x86, 0xd2, 0x8d, 0x9d, 0x49, - 0xa2, 0xba, 0xe0, 0x48, 0x89, 0x65, 0xde, 0x85, 0x75, 0xb5, 0xa2, 0xa4, 0x78, 0xaa, 0xd7, 0x2e, - 0xac, 0x64, 0x49, 0x79, 0x04, 0x55, 0xd7, 0x33, 0xe7, 0x56, 0x38, 0xbd, 0x30, 0x89, 0xef, 0x7b, - 0xbe, 0xac, 0x1b, 0x65, 0xd7, 0xfb, 0x92, 0x11, 0x0d, 0x46, 0xbb, 0xf7, 0x6b, 0x05, 0xca, 0xf1, - 0xaa, 0xbc, 0xee, 0x9c, 0x14, 0x5e, 0x1a, 0xbe, 0x4d, 0xe7, 0xf4, 0x29, 0x14, 0x88, 0x43, 0xe6, - 0xc4, 0x0d, 0x03, 0xde, 0xb0, 0x97, 0x6e, 0x2c, 0x2c, 0xd1, 0x84, 0x78, 0xad, 0xa0, 0xff, 0x36, - 0x0d, 0x95, 0x04, 0x28, 0x2a, 0x41, 0xbe, 0xdb, 0x1f, 0x19, 0x27, 0x06, 0x56, 0x15, 0x04, 0x90, - 0x1b, 0x8e, 0x70, 0xb7, 0x7f, 0xa2, 0xa6, 0x50, 0x11, 0xb2, 0xbd, 0xd6, 0x91, 0xd1, 0x53, 0xd3, - 0x8c, 0x3c, 0x18, 0x8f, 0x4e, 0xc7, 0x23, 0x35, 0xc3, 0x3a, 0x59, 0x21, 0x62, 0xf6, 0xba, 0xc3, - 0x91, 0x9a, 0x45, 0x55, 0x00, 0x2e, 0x27, 0xc6, 0x39, 0x26, 0x20, 0x84, 0x05, 0x21, 0x8f, 0xf6, - 0x40, 0xed, 0x74, 0x99, 0xce, 0xd1, 0x78, 0xd4, 0x1d, 0xf4, 0xcd, 0xa1, 0x31, 0x52, 0x0b, 0x6c, - 0xde, 0x5e, 0xb7, 0x6d, 0xf4, 0x87, 0x86, 0x5a, 0x8c, 0x81, 0x76, 0xba, 0xed, 0x91, 0x0a, 0xe8, - 0x00, 0xd0, 0x71, 0xb7, 0x67, 0x0c, 0x8d, 0x91, 0x69, 0xf4, 0x47, 0xf8, 0x4c, 0x60, 0x95, 0xd0, - 0x2e, 0xd4, 0x36, 0x93, 0x09, 0xe1, 0x32, 0x9b, 0x20, 0x66, 0x92, 0xa0, 0x56, 0xd8, 0x04, 0x47, - 0x83, 0x41, 0xcf, 0x68, 0xf5, 0xd5, 0x2a, 0x2a, 0x43, 0x61, 0x84, 0xbb, 0xc3, 0x51, 0x6b, 0x64, - 0xa8, 0x35, 0xa4, 0x42, 0x59, 0xfa, 0x2c, 0x70, 0x55, 0x26, 0x3c, 0xee, 0x3f, 0xe9, 0x0f, 0xbe, - 0xea, 0xab, 0x88, 0xe1, 0x89, 0x49, 0x18, 0x92, 0x39, 0xee, 0xb7, 0xf0, 0x99, 0xba, 0x8b, 0x76, - 0xa0, 0x32, 0x34, 0x7a, 0x46, 0x7b, 0x34, 0x90, 0x5a, 0x7b, 0xe8, 0x3e, 0xdc, 0x11, 0x82, 0x4f, - 0x8c, 0x33, 0xa3, 0x63, 0xc6, 0x5d, 0xd8, 0x47, 0x75, 0x78, 0x10, 0x8b, 0xee, 0x18, 0x4f, 0x22, - 0xee, 0xe8, 0x6f, 0x40, 0x21, 0xaa, 0xfd, 0x28, 0x07, 0xa9, 0xfe, 0x40, 0xfd, 0x0e, 0xca, 0x43, - 0xfa, 0xcc, 0x18, 0xaa, 0x0a, 0xbb, 0x3b, 0xb4, 0xc6, 0xa3, 0x81, 0x9a, 0xd2, 0xff, 0x98, 0x81, - 0x0c, 0x5e, 0x3a, 0xdb, 0x6f, 0x09, 0x0f, 0x01, 0xfc, 0xa5, 0x43, 0xcc, 0xa9, 0x63, 0x05, 0x81, - 0xbc, 0x71, 0x15, 0x19, 0xa5, 0xcd, 0x08, 0xe8, 0x1e, 0x14, 0xd6, 0xf7, 0x05, 0x11, 0x97, 0xeb, - 0x31, 0x7a, 0x0c, 0x45, 0x2b, 0x8a, 0x15, 0x7e, 0x97, 0x2a, 0x35, 0x0f, 0xb6, 0x47, 0x12, 0xde, - 0x08, 0xae, 0x27, 0xa4, 0xee, 0x62, 0x19, 0x6a, 0x59, 0x71, 0xe3, 0x66, 0x94, 0x2e, 0x23, 0xa0, - 0x57, 0xa1, 0xc4, 0xd9, 0xde, 0x32, 0x64, 0x7c, 0x71, 0x5c, 0x71, 0x8d, 0x01, 0xa7, 0xa0, 0x37, - 0xa1, 0x16, 0xe5, 0x55, 0x40, 0xc2, 0x90, 0xba, 0x33, 0x2d, 0xcf, 0x85, 0xaa, 0x92, 0x3c, 0x14, - 0xd4, 0x17, 0xdf, 0x7f, 0x0a, 0x2f, 0x7d, 0xff, 0x79, 0x1b, 0x76, 0x16, 0xcb, 0x89, 0x43, 0xa7, - 0xe6, 0x64, 0x15, 0x65, 0xb9, 0x56, 0x14, 0xf9, 0x2d, 0x18, 0x47, 0x2b, 0x99, 0xe4, 0xcc, 0x5f, - 0x1a, 0x98, 0xc1, 0xe5, 0xca, 0xb1, 0xfc, 0x4b, 0x0d, 0xb8, 0x50, 0x91, 0x06, 0x43, 0x41, 0x40, - 0x3f, 0x81, 0xbb, 0x92, 0x67, 0xae, 0xd7, 0xc8, 0xb4, 0xd8, 0x95, 0x2a, 0x0c, 0xe4, 0x21, 0xf3, - 0x60, 0xfb, 0xa2, 0xb6, 0xb8, 0x10, 0xbe, 0x23, 0xd5, 0xaf, 0xd0, 0x03, 0xd4, 0x82, 0x87, 0x11, - 0x32, 0x71, 0x9f, 0x51, 0xdf, 0x73, 0x59, 0x0a, 0x9b, 0x17, 0x56, 0x70, 0x61, 0x4e, 0x3d, 0x9b, - 0xf0, 0xfb, 0x5f, 0x11, 0xdf, 0x93, 0x42, 0xc6, 0x46, 0xe6, 0x73, 0x2b, 0xb8, 0x68, 0x7b, 0x36, - 0xd1, 0x1d, 0xa8, 0x5d, 0x81, 0x45, 0x6f, 0x40, 0x75, 0x63, 0x67, 0x2c, 0x9a, 0x2a, 0x6b, 0x6a, - 0x9f, 0x85, 0x55, 0x13, 0x72, 0xc2, 0x09, 0x1e, 0x52, 0xa5, 0xe6, 0xbd, 0xe4, 0x41, 0x29, 0x4d, - 0x16, 0x1e, 0x48, 0x49, 0xfd, 0x6b, 0x05, 0x2a, 0x09, 0x0e, 0x7a, 0x9f, 0xdd, 0x33, 0x43, 0xe2, - 0x06, 0xd4, 0x73, 0x4d, 0x76, 0xe0, 0x9b, 0x51, 0xf7, 0xc6, 0xa6, 0x44, 0x6b, 0x1e, 0xeb, 0x0c, - 0xf8, 0x09, 0xc5, 0x1a, 0x2c, 0xf2, 0x7c, 0xe1, 0xf9, 0x21, 0xb1, 0x85, 0x75, 0x22, 0xa2, 0xcb, - 0x11, 0x91, 0x1b, 0x97, 0x08, 0xdc, 0xf4, 0x2d, 0x03, 0x57, 0xff, 0x95, 0x02, 0x25, 0x96, 0x46, - 0xc3, 0xe5, 0x7c, 0x6e, 0xf9, 0x2b, 0xf4, 0x06, 0x64, 0x58, 0x58, 0x72, 0x63, 0x4a, 0xcd, 0x9d, - 0x04, 0x00, 0x93, 0xc3, 0x9c, 0x8d, 0x3e, 0x00, 0xb0, 0xc9, 0x82, 0xb8, 0x36, 0x71, 0xa7, 0x2b, - 0x59, 0x70, 0xb7, 0x08, 0xc7, 0x84, 0xbe, 0x29, 0xe9, 0xf4, 0xbf, 0x2b, 0x50, 0x3e, 0xb5, 0xa6, - 0x97, 0xd6, 0x8c, 0x9c, 0xf8, 0xde, 0x72, 0xb1, 0x35, 0xa9, 0xdf, 0x81, 0x9d, 0xa9, 0xe7, 0x86, - 0x16, 0x75, 0x89, 0x6d, 0x2e, 0x84, 0xb4, 0x7c, 0x9c, 0x51, 0xd7, 0x0c, 0x89, 0x82, 0x1e, 0xc3, - 0x01, 0x75, 0xf9, 0x0b, 0xc8, 0x5a, 0xd6, 0x9c, 0x31, 0x68, 0xf9, 0x6c, 0xb2, 0x17, 0x71, 0x13, - 0xd3, 0xbe, 0x30, 0xbb, 0x32, 0x2f, 0x9b, 0x5d, 0xfa, 0x04, 0xd4, 0x58, 0x30, 0xde, 0xec, 0x65, - 0x1d, 0x4a, 0xb1, 0xc0, 0x96, 0xfe, 0xc5, 0x49, 0x48, 0x83, 0x7c, 0x94, 0x9d, 0xc2, 0x97, 0x68, - 0xa8, 0xff, 0x26, 0x0d, 0x30, 0xe4, 0xcf, 0x4f, 0x2c, 0x76, 0xb6, 0xc2, 0xc7, 0x77, 0x21, 0x75, - 0xa5, 0xf4, 0xbd, 0xd0, 0xfb, 0xfc, 0x4b, 0xd7, 0x96, 0x57, 0x00, 0x82, 0xe5, 0x44, 0xae, 0xb9, - 0x34, 0x3b, 0x46, 0x61, 0x11, 0x9e, 0xdc, 0x25, 0xf1, 0x8a, 0x55, 0x5e, 0xc4, 0x77, 0xe7, 0x2d, - 0x50, 0x9f, 0xd1, 0x80, 0x4e, 0xa8, 0x43, 0xc3, 0x95, 0x4c, 0x1a, 0x51, 0x6a, 0x6b, 0x1b, 0xba, - 0xc8, 0x18, 0x0d, 0xf2, 0xe7, 0xc4, 0x0a, 0x97, 0x7e, 0x74, 0x37, 0x88, 0x86, 0xf1, 0x3b, 0x41, - 0xe1, 0x36, 0x77, 0x82, 0x8f, 0xe0, 0x4e, 0x64, 0x99, 0x0c, 0xb2, 0x40, 0x74, 0x34, 0x81, 0xac, - 0x8d, 0xfb, 0x92, 0xdd, 0x96, 0x5c, 0xde, 0xda, 0x04, 0xfa, 0x05, 0x54, 0x4e, 0x88, 0x4b, 0x7c, - 0x2b, 0x24, 0xf6, 0x8d, 0xbb, 0xf1, 0x26, 0xd4, 0x66, 0x42, 0x88, 0x35, 0x79, 0x3c, 0xf1, 0x44, - 0x6a, 0x57, 0x37, 0x64, 0x7e, 0xc8, 0x7d, 0x53, 0xf2, 0xfc, 0x35, 0x0d, 0xb9, 0x91, 0xe5, 0xcf, - 0x48, 0x88, 0x3e, 0x5c, 0xf7, 0x4f, 0xa9, 0x46, 0xb5, 0xf9, 0x5a, 0xc2, 0x33, 0x21, 0xb2, 0xb5, - 0x79, 0x8a, 0x92, 0x3e, 0xc5, 0x17, 0xe4, 0xc6, 0xa4, 0xff, 0x18, 0x4a, 0xe2, 0x71, 0xd3, 0x94, - 0xef, 0x8f, 0x4c, 0xfa, 0x4e, 0xb2, 0x06, 0xae, 0xa3, 0x0f, 0x43, 0xb0, 0x89, 0xc4, 0x16, 0x44, - 0x0e, 0x11, 0x5b, 0x28, 0x8b, 0x44, 0x4a, 0x16, 0xd0, 0xc4, 0x7a, 0xe1, 0xca, 0x2c, 0xb1, 0x7c, - 0x9f, 0x5d, 0x8d, 0x90, 0x2c, 0x47, 0x48, 0x5e, 0xa6, 0xe2, 0xc9, 0x7c, 0x25, 0x78, 0xbe, 0x80, - 0x9d, 0xf8, 0x81, 0x21, 0x30, 0x72, 0x1c, 0xe3, 0x61, 0x02, 0xe3, 0x6a, 0x96, 0x62, 0x95, 0x5c, - 0xa1, 0xb0, 0xbd, 0x4d, 0xb6, 0x8b, 0x05, 0xc8, 0xe0, 0x71, 0xcf, 0x10, 0x4f, 0x9a, 0xc3, 0xc1, - 0x18, 0xb7, 0x0d, 0x93, 0x75, 0x6a, 0x6a, 0x0a, 0x21, 0xa8, 0x9e, 0x18, 0x7d, 0x03, 0xf3, 0x9c, - 0xe2, 0xb4, 0x34, 0x6b, 0x9a, 0x4e, 0x5b, 0xed, 0x27, 0xad, 0x13, 0xc3, 0x3c, 0xc1, 0x83, 0xf1, - 0xa9, 0x9a, 0x41, 0xfb, 0xb0, 0x63, 0xf4, 0x9f, 0x76, 0xf1, 0xa0, 0xff, 0xa5, 0xd1, 0x1f, 0x49, - 0x72, 0x56, 0xff, 0x04, 0x4a, 0x3f, 0x66, 0x56, 0x61, 0x12, 0xb0, 0x63, 0xf7, 0x1d, 0xc8, 0x85, - 0x7c, 0x1b, 0x65, 0x07, 0xbf, 0xbb, 0x65, 0x87, 0xb1, 0x14, 0xd1, 0xff, 0xa4, 0xc0, 0x5e, 0xcb, - 0x71, 0xbc, 0x5f, 0x10, 0x1b, 0x47, 0xad, 0x4f, 0xd7, 0x3d, 0xf7, 0x50, 0x0f, 0x72, 0x0b, 0xcf, - 0xa1, 0xd3, 0x95, 0x8c, 0x93, 0xc7, 0xc9, 0x63, 0x62, 0x8b, 0xca, 0x35, 0x22, 0x09, 0xb0, 0xc4, - 0x40, 0xef, 0x02, 0xb2, 0x04, 0xd7, 0x4c, 0xf4, 0x5c, 0xbc, 0x2e, 0x5b, 0x57, 0xf4, 0xf4, 0x77, - 0x01, 0x5d, 0xc7, 0x62, 0xfd, 0x5d, 0xab, 0x7f, 0xa6, 0x2a, 0xa8, 0x02, 0xc5, 0xe1, 0xa9, 0xd1, - 0xee, 0x1e, 0x77, 0x8d, 0x8e, 0x9a, 0xd2, 0xff, 0xa1, 0xc0, 0xee, 0xfa, 0xd8, 0xea, 0x90, 0x73, - 0xea, 0x52, 0x5e, 0x4e, 0xb6, 0xe5, 0xd2, 0xcb, 0xbf, 0xba, 0x3e, 0x80, 0xe2, 0xdc, 0x72, 0x6d, - 0x8b, 0x3f, 0xcf, 0xa7, 0xeb, 0x29, 0xd6, 0xcb, 0xac, 0x09, 0x68, 0x08, 0x7b, 0xd7, 0xfd, 0x23, - 0x81, 0x8c, 0xe0, 0xd7, 0x5e, 0xb8, 0x76, 0x18, 0x59, 0xd7, 0x1d, 0x7e, 0x04, 0x15, 0xdb, 0x9b, - 0x2e, 0x59, 0x48, 0x89, 0xa4, 0x16, 0x8f, 0xb9, 0x49, 0xa2, 0xfe, 0x3b, 0x05, 0xaa, 0x4c, 0xeb, - 0x05, 0x9e, 0x7f, 0x16, 0x3f, 0xf9, 0x53, 0x5b, 0x6e, 0xd1, 0x5b, 0x96, 0x30, 0xde, 0xbc, 0x5e, - 0x33, 0x26, 0xbd, 0xc5, 0x98, 0xcd, 0x2b, 0x53, 0x26, 0xf6, 0xca, 0xa4, 0xff, 0x08, 0x2a, 0x47, - 0x4b, 0xea, 0xd8, 0x3d, 0xcb, 0x9d, 0x2d, 0xd9, 0xc1, 0xfb, 0xde, 0xba, 0x81, 0x60, 0x76, 0xdc, - 0xbf, 0x56, 0x4b, 0x62, 0x26, 0x70, 0x41, 0xfd, 0xcf, 0x0a, 0x14, 0xd6, 0xe7, 0x04, 0x7f, 0x6d, - 0xb2, 0xfc, 0xd0, 0xf4, 0xce, 0xcf, 0x03, 0x1e, 0xe6, 0x4a, 0x23, 0x8b, 0x4b, 0x9c, 0x36, 0xe0, - 0x24, 0xd6, 0x7a, 0x0a, 0x11, 0x87, 0xba, 0xd1, 0x73, 0x55, 0x91, 0x53, 0x7a, 0xd4, 0x25, 0x1b, - 0x84, 0xa9, 0xe7, 0x2c, 0xe7, 0xae, 0x7c, 0x45, 0x17, 0x08, 0x6d, 0x4e, 0x62, 0x08, 0xc4, 0xb5, - 0xa3, 0x29, 0x32, 0x02, 0x81, 0xb8, 0xb6, 0x9c, 0xe0, 0x2e, 0x14, 0x18, 0x9b, 0xc3, 0x67, 0x39, - 0x33, 0x4f, 0x5c, 0x9b, 0x83, 0x4b, 0x4d, 0x09, 0x9d, 0x5b, 0x6b, 0x0a, 0x60, 0xfd, 0x29, 0x54, - 0xbf, 0xb4, 0x2e, 0xc9, 0x53, 0xcb, 0x3f, 0xa2, 0xae, 0xcd, 0xda, 0xf5, 0xf5, 0x47, 0x24, 0x25, - 0xf6, 0x0d, 0x0a, 0x1d, 0xc2, 0xee, 0xc2, 0xb1, 0xc2, 0x73, 0xcf, 0x9f, 0xb3, 0x76, 0xdf, 0xf4, - 0xc9, 0x8c, 0x3c, 0x5f, 0xc8, 0xd2, 0xbf, 0x13, 0xb1, 0x86, 0x24, 0xc4, 0x9c, 0xa1, 0x8f, 0x20, - 0x2f, 0x71, 0xb7, 0xee, 0xff, 0x87, 0x90, 0x9f, 0x88, 0xf9, 0xe4, 0xee, 0x27, 0x57, 0x3d, 0x69, - 0x12, 0x8e, 0x64, 0x75, 0x0b, 0xee, 0xdc, 0xf0, 0x36, 0xc1, 0x8e, 0xcf, 0xe8, 0xac, 0x16, 0x5f, - 0x17, 0xa3, 0x61, 0xfc, 0x43, 0x53, 0x2a, 0xf9, 0xa1, 0x09, 0x41, 0x66, 0xe6, 0x78, 0x13, 0xbe, - 0xe0, 0x05, 0xcc, 0xff, 0xeb, 0x7f, 0x51, 0x20, 0x6b, 0x3c, 0x63, 0x4d, 0xcb, 0xfb, 0x90, 0xb9, - 0xa4, 0xae, 0x2d, 0x2b, 0x4e, 0xb2, 0xf9, 0xe7, 0x12, 0xe2, 0xf7, 0x09, 0x75, 0x6d, 0xcc, 0x25, - 0xd1, 0x31, 0xec, 0xc6, 0xcc, 0x4b, 0x34, 0x2d, 0x37, 0xf6, 0x20, 0x68, 0xa3, 0xb1, 0x0e, 0x29, - 0x0d, 0xf2, 0x73, 0x12, 0x04, 0xac, 0x59, 0x14, 0x71, 0x1d, 0x0d, 0xf5, 0x4f, 0xa1, 0xb8, 0x9e, - 0x94, 0x5d, 0xec, 0x0d, 0x8c, 0x07, 0xec, 0xbe, 0x5f, 0x82, 0xfc, 0x57, 0x2d, 0xdc, 0x17, 0x17, - 0xfe, 0x02, 0x64, 0xba, 0xfd, 0xe3, 0x81, 0x9a, 0x66, 0xb7, 0xe5, 0x53, 0x3c, 0x38, 0xc1, 0xc6, - 0x70, 0xa8, 0x66, 0x8e, 0x3e, 0x82, 0xc7, 0x53, 0x6f, 0x7e, 0x38, 0xf3, 0xbc, 0x99, 0x43, 0x0e, - 0x6d, 0xf2, 0x2c, 0xf4, 0x3c, 0x27, 0x38, 0x14, 0x1f, 0x70, 0x1d, 0x3a, 0x39, 0xe4, 0xa6, 0x35, - 0xc5, 0xb7, 0x5c, 0xf1, 0xdb, 0xb4, 0x16, 0xf4, 0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x23, 0x58, - 0x65, 0xd5, 0xef, 0x1d, 0x00, 0x00, -} diff --git a/vendor/github.com/bazelbuild/buildtools/build_proto/build.proto b/vendor/github.com/bazelbuild/buildtools/build_proto/build.proto deleted file mode 100644 index 9e83d133310..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/build_proto/build.proto +++ /dev/null @@ -1,565 +0,0 @@ -// Copyright 2014 The Bazel Authors. 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. -// -// This file contains the protocol buffer representation of a build -// file or 'blaze query --output=proto' call. - -syntax = "proto2"; - -package blaze_query; - -// option cc_api_version = 2; -// option java_api_version = 1; - -option java_package = "com.google.devtools.build.lib.query2.proto.proto2api"; - -message License { - repeated string license_type = 1; - repeated string exception = 2; -} - -message StringDictEntry { - required string key = 1; - required string value = 2; -} - -message LabelDictUnaryEntry { - required string key = 1; - required string value = 2; -} - -message LabelListDictEntry { - required string key = 1; - repeated string value = 2; -} - -message LabelKeyedStringDictEntry { - required string key = 1; - required string value = 2; -} - -message StringListDictEntry { - required string key = 1; - repeated string value = 2; -} - -// Represents an entry attribute of a Fileset rule in a build file. -message FilesetEntry { - // Indicates what to do when a source file is actually a symlink. - enum SymlinkBehavior { - COPY = 1; - DEREFERENCE = 2; - } - - // The label pointing to the source target where files are copied from. - required string source = 1; - - // The relative path within the fileset rule where files will be mapped. - required string destination_directory = 2; - - // Whether the files= attribute was specified. This is necessary because - // no files= attribute and files=[] mean different things. - optional bool files_present = 7; - - // A list of file labels to include from the source directory. - repeated string file = 3; - - // If this is a fileset entry representing files within the rule - // package, this lists relative paths to files that should be excluded from - // the set. This cannot contain values if 'file' also has values. - repeated string exclude = 4; - - // This field is optional because there will be some time when the new - // PB is used by tools depending on blaze query, but the new blaze version - // is not yet released. - // TODO(bazel-team): Make this field required once a version of Blaze is - // released that outputs this field. - optional SymlinkBehavior symlink_behavior = 5 [ default=COPY ]; - - // The prefix to strip from the path of the files in this FilesetEntry. Note - // that no value and the empty string as the value mean different things here. - optional string strip_prefix = 6; -} - -// A rule attribute. Each attribute must have a type and one of the various -// value fields populated - for the most part. -// -// Attributes of BOOLEAN and TRISTATE type may set all of the int, bool, and -// string values for backwards compatibility with clients that expect them to -// be set. -// -// Attributes of INTEGER, STRING, LABEL, LICENSE, BOOLEAN, and TRISTATE type -// may set *none* of the values. This can happen if the Attribute message is -// prepared for a client that doesn't support SELECTOR_LIST, but the rule has -// a selector list value for the attribute. (Selector lists for attributes of -// other types--the collection types--are handled differently when prepared -// for such a client. The possible collection values are gathered together -// and flattened.) -// -// By checking the type, the appropriate value can be extracted - see the -// comments on each type for the associated value. The order of lists comes -// from the blaze parsing. If an attribute is of a list type, the associated -// list should never be empty. -message Attribute { - // Indicates the type of attribute. - enum Discriminator { - INTEGER = 1; // int_value - STRING = 2; // string_value - LABEL = 3; // string_value - OUTPUT = 4; // string_value - STRING_LIST = 5; // string_list_value - LABEL_LIST = 6; // string_list_value - OUTPUT_LIST = 7; // string_list_value - DISTRIBUTION_SET = 8; // string_list_value - order is unimportant - LICENSE = 9; // license - STRING_DICT = 10; // string_dict_value - FILESET_ENTRY_LIST = 11; // fileset_list_value - LABEL_LIST_DICT = 12; // label_list_dict_value - STRING_LIST_DICT = 13; // string_list_dict_value - BOOLEAN = 14; // int, bool and string value - TRISTATE = 15; // tristate, int and string value - INTEGER_LIST = 16; // int_list_value - UNKNOWN = 18; // unknown type, use only for build extensions - LABEL_DICT_UNARY = 19; // label_dict_unary_value - SELECTOR_LIST = 20; // selector_list - LABEL_KEYED_STRING_DICT = 21; // label_keyed_string_dict - - DEPRECATED_STRING_DICT_UNARY = 17; - - } - - // Values for the TriState field type. - enum Tristate { - NO = 0; - YES = 1; - AUTO = 2; - } - - message SelectorEntry { - // The key of the selector entry. At this time, this is the label of a - // config_setting rule, or the pseudo-label "//conditions:default". - optional string label = 1; - - // True if the entry's value is the default value for the type as a - // result of the condition value being specified as None (ie: - // {"//condition": None}). - optional bool is_default_value = 16; - - // Exactly one of the following fields (except for glob_criteria) must be - // populated - note that the BOOLEAN and TRISTATE caveat in Attribute's - // comment does not apply here. The type field in the SelectorList - // containing this entry indicates which of these fields is populated, - // in accordance with the comments on Discriminator enum values above. - // (To be explicit: BOOLEAN populates the boolean_value field and TRISTATE - // populates the tristate_value field.) - optional int32 int_value = 2; - optional string string_value = 3; - optional bool boolean_value = 4; - optional Tristate tristate_value = 5; - repeated string string_list_value = 6; - optional License license = 7; - repeated StringDictEntry string_dict_value = 8; - repeated FilesetEntry fileset_list_value = 9; - repeated LabelListDictEntry label_list_dict_value = 10; - repeated StringListDictEntry string_list_dict_value = 11; - repeated int32 int_list_value = 13; - repeated LabelDictUnaryEntry label_dict_unary_value = 15; - repeated LabelKeyedStringDictEntry label_keyed_string_dict_value = 17; - - repeated DEPRECATED_GlobCriteria DEPRECATED_glob_criteria = 12; - repeated bytes DEPRECATED_string_dict_unary_value = 14; - } - - message Selector { - // The list of (label, value) pairs in the map that defines the selector. - // At this time, this cannot be empty, i.e. a selector has at least one - // entry. - repeated SelectorEntry entries = 1; - - // Whether or not this has any default values. - optional bool has_default_value = 2; - - // The error message when no condition matches. - optional string no_match_error = 3; - } - - message SelectorList { - // The type that this selector list evaluates to, and the type that each - // selector in the list evaluates to. At this time, this cannot be - // SELECTOR_LIST, i.e. selector lists do not nest. - optional Discriminator type = 1; - - // The list of selector elements in this selector list. At this time, this - // cannot be empty, i.e. a selector list is never empty. - repeated Selector elements = 2; - } - - // The name of the attribute - required string name = 1; - - // The location of the target in the BUILD file in a machine-parseable form. - optional Location DEPRECATED_parseable_location = 12; - - // Whether the attribute was explicitly specified - optional bool explicitly_specified = 13; - - // If this attribute has a string value or a string list value, then this - // may be set to indicate that the value may be treated as a label that - // isn't a dependency of this attribute's rule. - optional bool nodep = 20; - - // The type of attribute. This message is used for all of the different - // attribute types so the discriminator helps for figuring out what is - // stored in the message. - required Discriminator type = 2; - - // If this attribute has an integer value this will be populated. - // Boolean and TriState also use this field as [0,1] and [-1,0,1] - // for [false, true] and [auto, no, yes] respectively. - optional int32 int_value = 3; - - // If the attribute has a string value this will be populated. Label and - // path attributes use this field as the value even though the type may - // be LABEL or something else other than STRING. - optional string string_value = 5; - - // If the attribute has a boolean value this will be populated. - optional bool boolean_value = 14; - - // If the attribute is a Tristate value, this will be populated. - optional Tristate tristate_value = 15; - - // The value of the attribute has a list of string values (label and path - // note from STRING applies here as well). - repeated string string_list_value = 6; - - // If this is a license attribute, the license information is stored here. - optional License license = 7; - - // If this is a string dict, each entry will be stored here. - repeated StringDictEntry string_dict_value = 8; - - // If the attribute is part of a Fileset, the fileset entries are stored in - // this field. - repeated FilesetEntry fileset_list_value = 9; - - // If this is a label list dict, each entry will be stored here. - repeated LabelListDictEntry label_list_dict_value = 10; - - // If this is a string list dict, each entry will be stored here. - repeated StringListDictEntry string_list_dict_value = 11; - - // The value of the attribute has a list of int32 values - repeated int32 int_list_value = 17; - - // If this is a label dict unary, each entry will be stored here. - repeated LabelDictUnaryEntry label_dict_unary_value = 19; - - // If this is a label-keyed string dict, each entry will be stored here. - repeated LabelKeyedStringDictEntry label_keyed_string_dict_value = 22; - - // If this attribute's value is an expression containing one or more select - // expressions, then its type is SELECTOR_LIST and a SelectorList will be - // stored here. - optional SelectorList selector_list = 21; - - repeated DEPRECATED_GlobCriteria DEPRECATED_glob_criteria = 16; - repeated bytes DEPRECATED_string_dict_unary_value = 18; -} - -// A rule instance (e.g., cc_library foo, java_binary bar). -message Rule { - // The name of the rule (formatted as an absolute label, e.g. //foo/bar:baz). - required string name = 1; - - // The rule class (e.g., java_library) - required string rule_class = 2; - - // The BUILD file and line number of the location (formatted as - // :) in the rule's package's BUILD file where the - // rule instance was instantiated. The line number will be that of a rule - // invocation or macro call (that in turn invoked a rule). See - // https://docs.bazel.build/versions/master/skylark/macros.html#macro-creation - optional string location = 3; - - // All of the attributes that describe the rule. - repeated Attribute attribute = 4; - - // All of the inputs to the rule (formatted as absolute labels). These are - // predecessors in the dependency graph. - repeated string rule_input = 5; - - // All of the outputs of the rule (formatted as absolute labels). These are - // successors in the dependency graph. - repeated string rule_output = 6; - - // The set of all default settings affecting this rule. The name of a default - // setting is "_". There currently defined setting - // types are: - // - // - 'blaze': settings implemented in Blaze itself - repeated string default_setting = 7; - - // The location of the target in the BUILD file in a machine-parseable form. - optional Location DEPRECATED_parseable_location = 8; - - // The rule's class's public by default value. - optional bool public_by_default = 9; - - // If this rule is of a skylark-defined RuleClass. - optional bool is_skylark = 10; - - // List of Skylark aspects that this rule applies. - repeated AttributeAspect skylark_attribute_aspects = 11; - - // Hash encapsulating the behavior of this Skylark rule. Any change to this - // rule's definition that could change its behavior will be reflected here. - optional string skylark_environment_hash_code = 12; -} - -// A pairing of attribute name and a Skylark aspect that is applied to that -// attribute. -message AttributeAspect { - required string attribute_name = 1; - required SkylarkAspect aspect = 2; -} - -// Aspect defined in Skylark. -message SkylarkAspect { - required string extension_file_label = 1; - required string exported_name = 2; - repeated Attribute attribute = 3; -} - -// Summary of all transitive dependencies of 'rule,' where each dependent -// rule is included only once in the 'dependency' field. Gives complete -// information to analyze the single build target labeled rule.name, -// including optional location of target in BUILD file. -message RuleSummary { - required Rule rule = 1; - repeated Rule dependency = 2; - optional string location = 3; -} - -// A package group. Aside from the name, it contains the list of packages -// present in the group (as specified in the BUILD file). -message PackageGroup { - // The name of the package group - required string name = 1; - - // The list of packages as specified in the BUILD file. Currently this is - // only a list of packages, but some time in the future, there might be - // some type of wildcard mechanism. - repeated string contained_package = 2; - - // The list of sub package groups included in this one. - repeated string included_package_group = 3; - - // The location of the target in the BUILD file in a machine-parseable form. - optional Location DEPRECATED_parseable_location = 4; -} - -// An environment group. -message EnvironmentGroup { - // The name of the environment group. - required string name = 1; - - // The environments that belong to this group (as labels). - repeated string environment = 2; - - // The member environments that rules implicitly support if not otherwise - // specified. - repeated string default = 3; -} - -// A file that is an input into the build system. -// Next-Id: 10 -message SourceFile { - // The name of the source file (a label). - required string name = 1; - - // The location of the source file. This is a path with line numbers, not - // a label in the build system. - optional string location = 2; - - // The location of the corresponding label in the BUILD file in a - // machine-parseable form. - optional Location DEPRECATED_parseable_location = 7; - - // Labels of .bzl (Skylark) files that are transitively loaded in this BUILD - // file. This is present only when the SourceFile represents a BUILD file that - // loaded .bzl files. - // TODO(bazel-team): Rename this field. - repeated string subinclude = 3; - - // Labels of package groups that are mentioned in the visibility declaration - // for this source file. - repeated string package_group = 4; - - // Labels mentioned in the visibility declaration (including :__pkg__ and - // //visibility: ones) - repeated string visibility_label = 5; - - // The package-level features enabled for this package. Only present if the - // SourceFile represents a BUILD file. - repeated string feature = 6; - - // License attribute for the file. - optional License license = 8; - - // True if the package contains an error. Only present if the SourceFile - // represents a BUILD file. - optional bool package_contains_errors = 9; -} - -// A file that is the output of a build rule. -message GeneratedFile { - // The name of the generated file (a label). - required string name = 1; - - // The label of the target that generates the file. - required string generating_rule = 2; - - // The path of the output file (not a label). - optional string location = 3; -} - -// A target from a blaze query execution. Similar to the Attribute message, -// the Discriminator is used to determine which field contains information. -// For any given type, only one of these can be populated in a single Target. -message Target { - enum Discriminator { - RULE = 1; - SOURCE_FILE = 2; - GENERATED_FILE = 3; - PACKAGE_GROUP = 4; - ENVIRONMENT_GROUP = 5; - } - - // The type of target contained in the message. - required Discriminator type = 1; - - // If this target represents a rule, the rule is stored here. - optional Rule rule = 2; - - // A file that is not generated by the build system (version controlled - // or created by the test harness). - optional SourceFile source_file = 3; - - // A generated file that is the output of a rule. - optional GeneratedFile generated_file = 4; - - // A package group. - optional PackageGroup package_group = 5; - - // An environment group. - optional EnvironmentGroup environment_group = 6; -} - -// Container for all of the blaze query results. -message QueryResult { - // All of the targets returned by the blaze query. - repeated Target target = 1; -} - -//////////////////////////////////////////////////////////////////////////// -// Messages dealing with querying the BUILD language itself. For now, this is -// quite simplistic: Blaze can only tell the names of the rule classes, their -// attributes with their type. - -// Information about allowed rule classes for a specific attribute of a rule. -message AllowedRuleClassInfo { - enum AllowedRuleClasses { - ANY = 1; // Any rule is allowed to be in this attribute - SPECIFIED = 2; // Only the explicitly listed rules are allowed - } - - required AllowedRuleClasses policy = 1; - - // Rule class names of rules allowed in this attribute, e.g "cc_library", - // "py_binary". Only present if the allowed_rule_classes field is set to - // SPECIFIED. - repeated string allowed_rule_class = 2; -} - -// This message represents a single attribute of a single rule. -message AttributeDefinition { - - // Attribute name, i.e. "name", "srcs", "deps" - required string name = 1; - required Attribute.Discriminator type = 2; - required bool mandatory = 3; - - // Only present for attributes of type LABEL and LABEL_LIST. - optional AllowedRuleClassInfo allowed_rule_classes = 4; - - optional string documentation = 5; -} - -message RuleDefinition { - required string name = 1; - // Only contains documented attributes - repeated AttributeDefinition attribute = 2; - optional string documentation = 3; - // Only for build extensions: label to file that defines the extension - optional string label = 4; -} - -message BuildLanguage { - // Only contains documented rule definitions - repeated RuleDefinition rule = 1; -} - -message Location { - optional int32 start_offset = 1; - optional int32 start_line = 2; - optional int32 start_column = 3; - optional int32 end_offset = 4; - optional int32 end_line = 5; - optional int32 end_column = 6; -} - -message MakeVarBinding { - required string value = 1; - required string platform_set_regexp = 2; -} - -message MakeVar { - required string name = 1; - repeated MakeVarBinding binding = 2; -} - -message DEPRECATED_GlobCriteria { - // List of includes (or items if this criteria did not come from a glob) - repeated string include = 1; - - // List of exclude expressions - repeated string exclude = 2; - - // Whether this message came from a glob - optional bool glob = 3; -} - -message Event { - enum EventKind { - ERROR = 1; - WARNING = 2; - INFO = 3; - PROGRESS = 4; - } - - required EventKind kind = 1; - optional Location DEPRECATED_location = 2; - optional string message = 3; -} diff --git a/vendor/github.com/bazelbuild/buildtools/buildozer/BUILD b/vendor/github.com/bazelbuild/buildtools/buildozer/BUILD deleted file mode 100644 index a9916d9b591..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/buildozer/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") - -go_library( - name = "go_default_library", - srcs = ["main.go"], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/buildtools/buildozer", - importpath = "github.com/bazelbuild/buildtools/buildozer", - visibility = ["//visibility:private"], - deps = [ - "//vendor/github.com/bazelbuild/buildtools/build:go_default_library", - "//vendor/github.com/bazelbuild/buildtools/edit:go_default_library", - "//vendor/github.com/bazelbuild/buildtools/tables:go_default_library", - ], -) - -go_binary( - name = "buildozer", - embed = [":go_default_library"], - tags = ["manual"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/buildtools/buildozer/README.md b/vendor/github.com/bazelbuild/buildtools/buildozer/README.md deleted file mode 100644 index 894b4ca306c..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/buildozer/README.md +++ /dev/null @@ -1,271 +0,0 @@ -# Buildozer - -Buildozer is a command line tool to rewrite multiple -[Bazel](https://github.com/bazelbuild/bazel) BUILD files using -standard commands. - -## Installation - -1. Build a binary and put it into your $GOPATH/bin: - -```bash -go get github.com/bazelbuild/buildtools/buildozer -``` - -## Usage - -```shell -buildozer [OPTIONS] ['command args' | -f FILE ] label-list -``` - -Here, `label-list` is a comma-separated list of Bazel labels, for example -`//path/to/pkg1:rule1, //path/to/pkg2:rule2`. Buildozer reads commands from -`FILE` (`-` for stdin (format: `|`-separated command line arguments to buildozer, -excluding flags)) - -You should specify at least one command and one target. Buildozer will execute -all commands on all targets. Commands are executed in order, files are processed -in parallel. - -### Targets - -Targets look like Bazel labels, but there can be some differences in presence of -macros. - - * Use the label notation to refer to a rule: `//buildtools/buildozer:edit` - * Use the `__pkg__` suffix to refer to the package declaration: - `//buildtools/buildozer:__pkg__` - * Use an asterisk to refer to all rules in a file: `//pkg:*` - * Use `...` to refer to all descendant BUILD files in a directory: `//pkg/...:*` - * Use percent to refer to all rules of a certain kind: `//pkg:%java_library` - * Use percent-and-number to refer to a rule that begins at a certain line: - `//pkg:%123`. - * Use `-` for the package name if you want to process standard input stream - instead of a file: `-:all_tests`. - -### Options - -OPTIONS include the following options: - - * `-stdout` : write changed BUILD file to stdout - * `-buildifier` : format output using a specific buildifier binary. If empty, use built-in formatter. - * `-k` : apply all commands, even if there are failures - * `-quiet` : suppress informational messages - * `-shorten_labels` : convert added labels to short form, e.g. //foo:bar => :bar - * `-types`: Filter the targets, keeping only those of the given types, e.g. - `buildozer -types go_library,go_binary 'print rule' '//buildtools/buildozer:*'` - * `-eol-comments=false`: When adding new comments, put them on a separate line. - -See `buildozer -help` for the full list. - -### Edit commands - -Buildozer supports the following commands(`'command args'`): - - * `add `: Adds value(s) to a list attribute of a rule. If a - value is already present in the list, it is not added. - * `new_load <[to=]from(s)>`: Add a load statement for the given path, - importing the symbols. Before using this, make sure to run - `buildozer 'fix movePackageToTop'`. Afterwards, consider running - `buildozer 'fix unusedLoads'`. - * `comment ? ? `: Add a comment to a rule, an attribute, - or a specific value in a list. Spaces in the comment should be escaped with - backslashes. - * `print_comment ? ?` - * `delete`: Delete a rule. - * `fix ?`: Apply a fix. - * `move `: Moves `value(s)` from the list `old_attr` - to the list `new_attr`. The wildcard `*` matches all values. - * `new [(before|after) ]`: Add a - new rule at the end of the BUILD file (before/after ``). - * `print ` - * `remove `: Removes attribute `attr`. - * `remove `: Removes `value(s)` from the list `attr`. The - wildcard `*` matches all attributes. Lists containing none of the `value(s)` are - not modified. - * `remove_comment ? ?`: Removes the comment attached to the rule, - an attribute, or a specific value in a list. - * `rename `: Rename the `old_attr` to `new_attr` which must - not yet exist. - * `replace `: Replaces `old_value` with `new_value` - in the list `attr`. Wildcard `*` matches all attributes. Lists not containing - `old_value` are not modified. - * `substitute `: Replaces strings which - match `old_regexp` in the list `attr` according to `new_template`. Wildcard - `*` matches all attributes. The regular expression must follow - [RE2 syntax](https://github.com/google/re2/wiki/Syntax). `new_template` may - be a simple replacement string, but it may also expand numbered or named - groups using `$0` or `$x`. Lists without strings that match `old_regexp` - are not modified. - * `set `: Sets the value of an attribute. If the attribute - was already present, its old value is replaced. - * `set_if_absent `: Sets the value of an attribute. If the - attribute was already present, no action is taken. - * `set kind `: Set the target type to value. - * `copy `: Copies the value of `attr` between rules. If it - exists in the `to_rule`, it will be overwritten. - * `copy_no_overwrite `: Copies the value of `attr` between - rules. If it exists in the `to_rule`, no action is taken. - * `dict_add <(key:value)(s)>`: Sets the value of a key for the dict - attribute `attr`. If the key was already present, it will _not_ be overwritten - * `dict_set <(key:value)(s)>`: Sets the value of a key for the dict - attribute `attr`. If the key was already present, its old value is replaced. - * `dict_delete `: Deletes the key for the dict attribute `attr`. - -Here, `` represents an attribute (being `add`ed/`rename`d/`delete`d etc.), -e.g.: `srcs`, `` represents values of the attribute and so on. -A '?' indicates that the preceding argument is optional. - -The fix command without a fix specified applied to all eligible fixes. -Use `//path/to/pkg:__pkg__` as label for file level changes like `new_load` and -`new`. -A transformation can be applied to all rules of a particular kind by using -`%rule_kind` at the end of the label(see examples below). - -#### Examples - -```bash -# Edit //pkg:rule and //pkg:rule2, and add a dependency on //base -buildozer 'add deps //base' //pkg:rule //pkg:rule2 - -# A load for a skylark file in //pkg -buildozer 'new_load /tools/build_rules/build_test build_test' //pkg:__pkg__ - -# Change the default_visibility to public for the package //pkg -buildozer 'set default_visibility //visibility:public' //pkg:__pkg__ - -# Change all gwt_module targets to java_library in the package //pkg -buildozer 'set kind java_library' //pkg:%gwt_module - -# Replace the dependency on pkg_v1 with a dependency on pkg_v2 -buildozer 'replace deps //pkg_v1 //pkg_v2' //pkg:rule - -# Replace all dependencies using regular expressions. -buildozer 'substitute deps //old/(.*) //new/${1}' //pkg:rule - -# Delete the dependency on foo in every cc_library in the package -buildozer 'remove deps foo' //pkg:%cc_library - -# Delete the testonly attribute in every rule in the package -buildozer 'remove testonly' '//pkg:*' - -# Add a comment to the timeout attribute of //pkg:rule_test -buildozer 'comment timeout Delete\ this\ after\ 2015-12-31.' //pkg:rule_test - -# Add a new rule at the end of the file -buildozer 'new java_library foo' //pkg:__pkg__ - -# Add a cc_binary rule named new_bin before the rule named tests -buildozer 'new cc_binary new_bin before tests' //:__pkg__ - -# Copy an attribute from `protolib` to `py_protolib`. -buildozer 'copy testonly protolib' //pkg:py_protolib - -# Set two attributes in the same rule -buildozer 'set compile 1' 'set srcmap 1' //pkg:rule - -# Make a default explicit in all soy_js rules in a package -buildozer 'set_if_absent allowv1syntax 1' //pkg:%soy_js - -# Add an attribute new_attr with value "def_val" to all cc_binary rules -# Note that special characters will automatically be escaped in the string -buildozer 'add new_attr def_val' //:%cc_binary -``` - -### Print commands - -They work just like the edit commands. Expect a return code of 3 as they are not -modifying any file. - - * `print `: For each target, prints the value of the attributes - (see below). - * `print_comment ? ?`: Prints a comment associated with a rule, - an attribute or a specific value in a list. - -The print command prints the value of the attributes. If a target doesn't have -the attribute, a warning is printed on stderr. - -There are some special attributes in the `print` command: - - * `kind`: displays the name of the function - * `label`: the fully qualified label - * `rule`: the entire rule definition - * `startline`: the line number on which the rule begins in the BUILD file - * `endline`: the line number on which the rule ends in the BUILD file - -#### Examples - -```shell -# Print the kind of a target -buildozer 'print kind' base # output: cc_library - -# Print the name of all cc_library in //base -buildozer 'print name' base:%cc_library - -# Get the default visibility of the //base package -buildozer 'print default_visibility' base:%package - -# Print labels of cc_library targets in //base that have a deps attribute -buildozer 'print label deps' base:%cc_library 2>/dev/null | cut -d' ' -f1 - -# Print the list of labels in //base that explicitly set the testonly attribute: -buildozer 'print label testonly' 'base:*' 2>/dev/null - -# Print the entire definition (including comments) of the //base:heapcheck rule: -buildozer 'print rule' //base:heapcheck -``` - -## Converting labels - -Buildozer works at the syntax-level. It doesn't evaluate the BUILD files. If you -need to query the information Bazel has, please use `bazel query`. If you have a -list of Bazel labels, chances are that some of them are generated by BUILD -extensions. Labels in Buildozer are slightly different from labels in Bazel. -Bazel cares about the generated code, while Buildozer looks at the BUILD file -before macro expansion. - -To see the expanded BUILD files, try: - -```shell -bazel query --output=build //path/to/BUILD -``` - -## Do multiple changes at once - -Use `buildozer -f ` to load a list of commands from a file. The usage is -just like arguments on the command-line, except that arguments are separated by -`|`. - -```shell -$ cat /tmp/cmds -new cc_library foo|//buildtools/buildozer/BUILD -add deps //base //strings|add srcs foo.cc|//buildtools/buildozer:foo -add deps :foo|//buildtools/buildozer - -$ buildozer -f /tmp/cmds -fixed //buildtools/buildozer/BUILD -``` - -The list of commands will typically be generated and can be large. This is -efficient: Commands are grouped so that each file is modified once. Files are -processed in parallel. - -## Error code - -The return code is: - - * `0` on success, if changes were made - * `1` when there is a usage error - * `2` when at least one command has failed - * `3` on success, when no changes were made - -## Source Structure - - * `buildozer/main.go` : Entry point for the buildozer binary - * `edit/buildozer.go` : Implementation of functions for the buildozer commands - * `edit/edit.go`: Library functions to perform various operations on ASTs. These - * functions are called by the impl functions in buildozer.go - * `edit/fix.go`: Functions for various fixes for the `buildozer 'fix '` - command, like cleaning unused loads, changing labels to canonical notation, etc. - * `edit/types.go`: Type information for attributes - diff --git a/vendor/github.com/bazelbuild/buildtools/buildozer/main.go b/vendor/github.com/bazelbuild/buildtools/buildozer/main.go deleted file mode 100644 index 1b58e390b30..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/buildozer/main.go +++ /dev/null @@ -1,109 +0,0 @@ -/* -Copyright 2016 Google 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. -*/ -// Entry-point for Buildozer binary. - -package main - -import ( - "flag" - "fmt" - "os" - "strings" - - "github.com/bazelbuild/buildtools/build" - "github.com/bazelbuild/buildtools/edit" - "github.com/bazelbuild/buildtools/tables" -) - -var ( - buildVersion = "redacted" - buildScmRevision = "redacted" - - version = flag.Bool("version", false, "Print the version of buildozer") - stdout = flag.Bool("stdout", false, "write changed BUILD file to stdout") - buildifier = flag.String("buildifier", "", "format output using a specific buildifier binary. If empty, use built-in formatter") - parallelism = flag.Int("P", 0, "number of cores to use for concurrent actions") - numio = flag.Int("numio", 200, "number of concurrent actions") - commandsFile = flag.String("f", "", "file name to read commands from, use '-' for stdin (format:|-separated command line arguments to buildozer, excluding flags)") - keepGoing = flag.Bool("k", false, "apply all commands, even if there are failures") - filterRuleTypes = stringList("types", "comma-separated list of rule types to change, the default empty list means all rules") - preferEOLComments = flag.Bool("eol-comments", true, "when adding a new comment, put it on the same line if possible") - rootDir = flag.String("root_dir", "", "If present, use this folder rather than $PWD to find the root directory.") - quiet = flag.Bool("quiet", false, "suppress informational messages") - editVariables = flag.Bool("edit-variables", false, "For attributes that simply assign a variable (e.g. hdrs = LIB_HDRS), edit the build variable instead of appending to the attribute.") - isPrintingProto = flag.Bool("output_proto", false, "output serialized devtools.buildozer.Output protos instead of human-readable strings.") - tablesPath = flag.String("tables", "", "path to JSON file with custom table definitions which will replace the built-in tables") - addTablesPath = flag.String("add_tables", "", "path to JSON file with custom table definitions which will be merged with the built-in tables") - - shortenLabelsFlag = flag.Bool("shorten_labels", true, "convert added labels to short form, e.g. //foo:bar => :bar") - deleteWithComments = flag.Bool("delete_with_comments", true, "If a list attribute should be deleted even if there is a comment attached to it") -) - -func stringList(name, help string) func() []string { - f := flag.String(name, "", help) - return func() []string { - if *f == "" { - return nil - } - res := strings.Split(*f, ",") - for i := range res { - res[i] = strings.TrimSpace(res[i]) - } - return res - } -} - -func main() { - flag.Parse() - - if *version { - fmt.Printf("buildozer version: %s \n", buildVersion) - fmt.Printf("buildozer scm revision: %s \n", buildScmRevision) - os.Exit(0) - } - - if *tablesPath != "" { - if err := tables.ParseAndUpdateJSONDefinitions(*tablesPath, false); err != nil { - fmt.Fprintf(os.Stderr, "buildifier: failed to parse %s for -tables: %s\n", *tablesPath, err) - os.Exit(2) - } - } - - if *addTablesPath != "" { - if err := tables.ParseAndUpdateJSONDefinitions(*addTablesPath, true); err != nil { - fmt.Fprintf(os.Stderr, "buildifier: failed to parse %s for -add_tables: %s\n", *addTablesPath, err) - os.Exit(2) - } - } - - if !(*shortenLabelsFlag) { - build.DisableRewrites = []string{"label"} - } - edit.ShortenLabelsFlag = *shortenLabelsFlag - edit.DeleteWithComments = *deleteWithComments - opts := &edit.Options{ - Stdout: *stdout, - Buildifier: *buildifier, - Parallelism: *parallelism, - NumIO: *numio, - CommandsFile: *commandsFile, - KeepGoing: *keepGoing, - FilterRuleTypes: filterRuleTypes(), - PreferEOLComments: *preferEOLComments, - RootDir: *rootDir, - Quiet: *quiet, - EditVariables: *editVariables, - IsPrintingProto: *isPrintingProto, - } - os.Exit(edit.Buildozer(opts, flag.Args())) -} diff --git a/vendor/github.com/bazelbuild/buildtools/edit/BUILD b/vendor/github.com/bazelbuild/buildtools/edit/BUILD deleted file mode 100644 index 273982d0db6..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/edit/BUILD +++ /dev/null @@ -1,38 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "buildozer.go", - "edit.go", - "fix.go", - "types.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/buildtools/edit", - importpath = "github.com/bazelbuild/buildtools/edit", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/bazelbuild/buildtools/api_proto:go_default_library", - "//vendor/github.com/bazelbuild/buildtools/build:go_default_library", - "//vendor/github.com/bazelbuild/buildtools/build_proto:go_default_library", - "//vendor/github.com/bazelbuild/buildtools/file:go_default_library", - "//vendor/github.com/bazelbuild/buildtools/lang:go_default_library", - "//vendor/github.com/bazelbuild/buildtools/tables:go_default_library", - "//vendor/github.com/bazelbuild/buildtools/wspace:go_default_library", - "//vendor/github.com/golang/protobuf/proto:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/buildtools/edit/buildozer.go b/vendor/github.com/bazelbuild/buildtools/edit/buildozer.go deleted file mode 100644 index 7ef8d80a458..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/edit/buildozer.go +++ /dev/null @@ -1,1147 +0,0 @@ -/* -Copyright 2016 Google 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. -*/ - -// Buildozer is a tool for programmatically editing BUILD files. - -package edit - -import ( - "bufio" - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "log" - "os" - "os/exec" - "path" - "path/filepath" - "regexp" - "runtime" - "strconv" - "strings" - - apipb "github.com/bazelbuild/buildtools/api_proto" - "github.com/bazelbuild/buildtools/build" - "github.com/bazelbuild/buildtools/file" - "github.com/golang/protobuf/proto" -) - -// Options represents choices about how buildozer should behave. -type Options struct { - Stdout bool // write changed BUILD file to stdout - Buildifier string // path to buildifier binary - Parallelism int // number of cores to use for concurrent actions - NumIO int // number of concurrent actions - CommandsFile string // file name to read commands from, use '-' for stdin (format:|-separated command line arguments to buildozer, excluding flags - KeepGoing bool // apply all commands, even if there are failures - FilterRuleTypes []string // list of rule types to change, empty means all - PreferEOLComments bool // when adding a new comment, put it on the same line if possible - RootDir string // If present, use this folder rather than $PWD to find the root dir - Quiet bool // suppress informational messages. - EditVariables bool // for attributes that simply assign a variable (e.g. hdrs = LIB_HDRS), edit the build variable instead of appending to the attribute. - IsPrintingProto bool // output serialized devtools.buildozer.Output protos instead of human-readable strings -} - -// NewOpts returns a new Options struct with some defaults set. -func NewOpts() *Options { - return &Options{NumIO: 200, PreferEOLComments: true} -} - -// Usage is a user-overridden func to print the program usage. -var Usage = func() {} - -var fileModified = false // set to true when a file has been fixed - -const stdinPackageName = "-" // the special package name to represent stdin - -// CmdEnvironment stores the information the commands below have access to. -type CmdEnvironment struct { - File *build.File // the AST - Rule *build.Rule // the rule to modify - Vars map[string]*build.AssignExpr // global variables set in the build file - Pkg string // the full package name - Args []string // the command-line arguments - output *apipb.Output_Record // output proto, stores whatever a command wants to print -} - -// The cmdXXX functions implement the various commands. - -func cmdAdd(opts *Options, env CmdEnvironment) (*build.File, error) { - attr := env.Args[0] - for _, val := range env.Args[1:] { - if IsIntList(attr) { - AddValueToListAttribute(env.Rule, attr, env.Pkg, &build.LiteralExpr{Token: val}, &env.Vars) - continue - } - strVal := getStringExpr(val, env.Pkg) - AddValueToListAttribute(env.Rule, attr, env.Pkg, strVal, &env.Vars) - } - ResolveAttr(env.Rule, attr, env.Pkg) - return env.File, nil -} - -func cmdComment(opts *Options, env CmdEnvironment) (*build.File, error) { - // The comment string is always the last argument in the list. - str := env.Args[len(env.Args)-1] - str = strings.Replace(str, "\\n", "\n", -1) - // Multiline comments should go on a separate line. - fullLine := !opts.PreferEOLComments || strings.Contains(str, "\n") - comment := []build.Comment{} - for _, line := range strings.Split(str, "\n") { - comment = append(comment, build.Comment{Token: "# " + line}) - } - - // The comment might be attached to a rule, an attribute, or a value in a list, - // depending on how many arguments are passed. - switch len(env.Args) { - case 1: // Attach to a rule - env.Rule.Call.Comments.Before = comment - case 2: // Attach to an attribute - if attr := env.Rule.AttrDefn(env.Args[0]); attr != nil { - if fullLine { - attr.LHS.Comment().Before = comment - } else { - attr.RHS.Comment().Suffix = comment - } - } - case 3: // Attach to a specific value in a list - if attr := env.Rule.Attr(env.Args[0]); attr != nil { - if expr := ListFind(attr, env.Args[1], env.Pkg); expr != nil { - if fullLine { - expr.Comments.Before = comment - } else { - expr.Comments.Suffix = comment - } - } - } - default: - panic("cmdComment") - } - return env.File, nil -} - -// commentsText concatenates comments into a single line. -func commentsText(comments []build.Comment) string { - var segments []string - for _, comment := range comments { - token := comment.Token - if strings.HasPrefix(token, "#") { - token = token[1:] - } - segments = append(segments, strings.TrimSpace(token)) - } - return strings.Replace(strings.Join(segments, " "), "\n", " ", -1) -} - -func cmdPrintComment(opts *Options, env CmdEnvironment) (*build.File, error) { - attrError := func() error { - return fmt.Errorf("rule \"//%s:%s\" has no attribute \"%s\"", env.Pkg, env.Rule.Name(), env.Args[0]) - } - - switch len(env.Args) { - case 0: // Print rule comment. - env.output.Fields = []*apipb.Output_Record_Field{ - {Value: &apipb.Output_Record_Field_Text{commentsText(env.Rule.Call.Comments.Before)}}, - } - case 1: // Print attribute comment. - attr := env.Rule.AttrDefn(env.Args[0]) - if attr == nil { - return nil, attrError() - } - comments := append(attr.Before, attr.Suffix...) - env.output.Fields = []*apipb.Output_Record_Field{ - {Value: &apipb.Output_Record_Field_Text{commentsText(comments)}}, - } - case 2: // Print comment of a specific value in a list. - attr := env.Rule.Attr(env.Args[0]) - if attr == nil { - return nil, attrError() - } - value := env.Args[1] - expr := ListFind(attr, value, env.Pkg) - if expr == nil { - return nil, fmt.Errorf("attribute \"%s\" has no value \"%s\"", env.Args[0], value) - } - comments := append(expr.Comments.Before, expr.Comments.Suffix...) - env.output.Fields = []*apipb.Output_Record_Field{ - {Value: &apipb.Output_Record_Field_Text{commentsText(comments)}}, - } - default: - panic("cmdPrintComment") - } - return nil, nil -} - -func cmdDelete(opts *Options, env CmdEnvironment) (*build.File, error) { - return DeleteRule(env.File, env.Rule), nil -} - -func cmdMove(opts *Options, env CmdEnvironment) (*build.File, error) { - oldAttr := env.Args[0] - newAttr := env.Args[1] - if len(env.Args) == 3 && env.Args[2] == "*" { - if err := MoveAllListAttributeValues(env.Rule, oldAttr, newAttr, env.Pkg, &env.Vars); err != nil { - return nil, err - } - return env.File, nil - } - fixed := false - for _, val := range env.Args[2:] { - if deleted := ListAttributeDelete(env.Rule, oldAttr, val, env.Pkg); deleted != nil { - AddValueToListAttribute(env.Rule, newAttr, env.Pkg, deleted, &env.Vars) - fixed = true - } - } - if fixed { - return env.File, nil - } - return nil, nil -} - -func cmdNew(opts *Options, env CmdEnvironment) (*build.File, error) { - kind := env.Args[0] - name := env.Args[1] - addAtEOF, insertionIndex, err := findInsertionIndex(env) - if err != nil { - return nil, err - } - - if FindRuleByName(env.File, name) != nil { - return nil, fmt.Errorf("rule '%s' already exists", name) - } - - call := &build.CallExpr{X: &build.Ident{Name: kind}} - rule := &build.Rule{call, ""} - rule.SetAttr("name", &build.StringExpr{Value: name}) - - if addAtEOF { - env.File.Stmt = InsertAfterLastOfSameKind(env.File.Stmt, rule.Call) - } else { - env.File.Stmt = InsertAfter(insertionIndex, env.File.Stmt, call) - } - return env.File, nil -} - -// findInsertionIndex is used by cmdNew to find the place at which to insert the new rule. -func findInsertionIndex(env CmdEnvironment) (bool, int, error) { - if len(env.Args) < 4 { - return true, 0, nil - } - - relativeToRuleName := env.Args[3] - ruleIdx, _ := IndexOfRuleByName(env.File, relativeToRuleName) - if ruleIdx == -1 { - return true, 0, nil - } - - switch env.Args[2] { - case "before": - return false, ruleIdx - 1, nil - case "after": - return false, ruleIdx, nil - default: - return true, 0, fmt.Errorf("Unknown relative operator '%s'; allowed: 'before', 'after'", env.Args[1]) - } -} - -func cmdNewLoad(opts *Options, env CmdEnvironment) (*build.File, error) { - from := env.Args[1:] - to := append([]string{}, from...) - for i := range from { - if s := strings.SplitN(from[i], "=", 2); len(s) == 2 { - to[i] = s[0] - from[i] = s[1] - } - } - - env.File.Stmt = InsertLoad(env.File.Stmt, env.Args[0], from, to) - return env.File, nil -} - -func cmdPrint(opts *Options, env CmdEnvironment) (*build.File, error) { - format := env.Args - if len(format) == 0 { - format = []string{"name", "kind"} - } - fields := make([]*apipb.Output_Record_Field, len(format)) - - for i, str := range format { - value := env.Rule.Attr(str) - if str == "kind" { - fields[i] = &apipb.Output_Record_Field{Value: &apipb.Output_Record_Field_Text{env.Rule.Kind()}} - } else if str == "name" { - fields[i] = &apipb.Output_Record_Field{Value: &apipb.Output_Record_Field_Text{env.Rule.Name()}} - } else if str == "label" { - if env.Rule.Name() != "" { - fields[i] = &apipb.Output_Record_Field{Value: &apipb.Output_Record_Field_Text{fmt.Sprintf("//%s:%s", env.Pkg, env.Rule.Name())}} - } else { - return nil, nil - } - } else if str == "rule" { - fields[i] = &apipb.Output_Record_Field{ - Value: &apipb.Output_Record_Field_Text{build.FormatString(env.Rule.Call)}, - } - } else if str == "startline" { - fields[i] = &apipb.Output_Record_Field{Value: &apipb.Output_Record_Field_Number{int32(env.Rule.Call.ListStart.Line)}} - } else if str == "endline" { - fields[i] = &apipb.Output_Record_Field{Value: &apipb.Output_Record_Field_Number{int32(env.Rule.Call.End.Pos.Line)}} - } else if value == nil { - fmt.Fprintf(os.Stderr, "rule \"//%s:%s\" has no attribute \"%s\"\n", - env.Pkg, env.Rule.Name(), str) - fields[i] = &apipb.Output_Record_Field{Value: &apipb.Output_Record_Field_Error{Error: apipb.Output_Record_Field_MISSING}} - } else if lit, ok := value.(*build.LiteralExpr); ok { - fields[i] = &apipb.Output_Record_Field{Value: &apipb.Output_Record_Field_Text{lit.Token}} - } else if lit, ok := value.(*build.Ident); ok { - fields[i] = &apipb.Output_Record_Field{Value: &apipb.Output_Record_Field_Text{lit.Name}} - } else if string, ok := value.(*build.StringExpr); ok { - fields[i] = &apipb.Output_Record_Field{ - Value: &apipb.Output_Record_Field_Text{string.Value}, - QuoteWhenPrinting: true, - } - } else if strList := env.Rule.AttrStrings(str); strList != nil { - fields[i] = &apipb.Output_Record_Field{Value: &apipb.Output_Record_Field_List{List: &apipb.RepeatedString{Strings: strList}}} - } else { - // Some other Expr we haven't listed above. Just print it. - fields[i] = &apipb.Output_Record_Field{Value: &apipb.Output_Record_Field_Text{build.FormatString(value)}} - } - } - - env.output.Fields = fields - return nil, nil -} - -func attrKeysForPattern(rule *build.Rule, pattern string) []string { - if pattern == "*" { - return rule.AttrKeys() - } - return []string{pattern} -} - -func cmdRemove(opts *Options, env CmdEnvironment) (*build.File, error) { - if len(env.Args) == 1 { // Remove the attribute - if env.Rule.DelAttr(env.Args[0]) != nil { - return env.File, nil - } - } else { // Remove values in the attribute. - fixed := false - for _, key := range attrKeysForPattern(env.Rule, env.Args[0]) { - for _, val := range env.Args[1:] { - ListAttributeDelete(env.Rule, key, val, env.Pkg) - fixed = true - } - ResolveAttr(env.Rule, key, env.Pkg) - } - if fixed { - return env.File, nil - } - } - return nil, nil -} - -func cmdRemoveComment(opts *Options, env CmdEnvironment) (*build.File, error) { - switch len(env.Args) { - case 0: // Remove comment attached to rule - env.Rule.Call.Comments.Before = nil - env.Rule.Call.Comments.Suffix = nil - env.Rule.Call.Comments.After = nil - case 1: // Remove comment attached to attr - if attr := env.Rule.AttrDefn(env.Args[0]); attr != nil { - attr.Comments.Before = nil - attr.Comments.Suffix = nil - attr.Comments.After = nil - attr.LHS.Comment().Before = nil - attr.LHS.Comment().Suffix = nil - attr.LHS.Comment().After = nil - attr.RHS.Comment().Before = nil - attr.RHS.Comment().Suffix = nil - attr.RHS.Comment().After = nil - } - case 2: // Remove comment attached to value - if attr := env.Rule.Attr(env.Args[0]); attr != nil { - if expr := ListFind(attr, env.Args[1], env.Pkg); expr != nil { - expr.Comments.Before = nil - expr.Comments.Suffix = nil - expr.Comments.After = nil - } - } - default: - panic("cmdRemoveComment") - } - return env.File, nil -} - -func cmdRename(opts *Options, env CmdEnvironment) (*build.File, error) { - oldAttr := env.Args[0] - newAttr := env.Args[1] - if err := RenameAttribute(env.Rule, oldAttr, newAttr); err != nil { - return nil, err - } - return env.File, nil -} - -func cmdReplace(opts *Options, env CmdEnvironment) (*build.File, error) { - oldV := env.Args[1] - newV := env.Args[2] - for _, key := range attrKeysForPattern(env.Rule, env.Args[0]) { - attr := env.Rule.Attr(key) - if e, ok := attr.(*build.StringExpr); ok { - if LabelsEqual(e.Value, oldV, env.Pkg) { - env.Rule.SetAttr(key, getAttrValueExpr(key, []string{newV}, env)) - } - } else { - ListReplace(attr, oldV, newV, env.Pkg) - } - } - return env.File, nil -} - -func cmdSubstitute(opts *Options, env CmdEnvironment) (*build.File, error) { - oldRegexp, err := regexp.Compile(env.Args[1]) - if err != nil { - return nil, err - } - newTemplate := env.Args[2] - for _, key := range attrKeysForPattern(env.Rule, env.Args[0]) { - attr := env.Rule.Attr(key) - e, ok := attr.(*build.StringExpr) - if !ok { - ListSubstitute(attr, oldRegexp, newTemplate) - continue - } - if newValue, ok := stringSubstitute(e.Value, oldRegexp, newTemplate); ok { - env.Rule.SetAttr(key, getAttrValueExpr(key, []string{newValue}, env)) - } - } - return env.File, nil -} - -func cmdSet(opts *Options, env CmdEnvironment) (*build.File, error) { - attr := env.Args[0] - args := env.Args[1:] - if attr == "kind" { - env.Rule.SetKind(args[0]) - } else { - env.Rule.SetAttr(attr, getAttrValueExpr(attr, args, env)) - } - return env.File, nil -} - -func cmdSetIfAbsent(opts *Options, env CmdEnvironment) (*build.File, error) { - attr := env.Args[0] - args := env.Args[1:] - if attr == "kind" { - return nil, fmt.Errorf("setting 'kind' is not allowed for set_if_absent. Got %s", env.Args) - } - if env.Rule.Attr(attr) == nil { - env.Rule.SetAttr(attr, getAttrValueExpr(attr, args, env)) - } - return env.File, nil -} - -func getAttrValueExpr(attr string, args []string, env CmdEnvironment) build.Expr { - switch { - case attr == "kind": - return nil - case IsIntList(attr): - var list []build.Expr - for _, i := range args { - list = append(list, &build.LiteralExpr{Token: i}) - } - return &build.ListExpr{List: list} - case IsList(attr) && !(len(args) == 1 && strings.HasPrefix(args[0], "glob(")): - var list []build.Expr - for _, arg := range args { - list = append(list, getStringExpr(arg, env.Pkg)) - } - return &build.ListExpr{List: list} - case len(args) == 0: - // Expected a non-list argument, nothing provided - return &build.Ident{Name: "None"} - case IsString(attr): - return getStringExpr(args[0], env.Pkg) - default: - return &build.Ident{Name: args[0]} - } -} - -func getStringExpr(value, pkg string) build.Expr { - unquoted, triple, err := build.Unquote(value) - if err == nil { - return &build.StringExpr{Value: ShortenLabel(unquoted, pkg), TripleQuote: triple} - } - return &build.StringExpr{Value: ShortenLabel(value, pkg)} -} - -func cmdCopy(opts *Options, env CmdEnvironment) (*build.File, error) { - attrName := env.Args[0] - from := env.Args[1] - - return copyAttributeBetweenRules(env, attrName, from) -} - -func cmdCopyNoOverwrite(opts *Options, env CmdEnvironment) (*build.File, error) { - attrName := env.Args[0] - from := env.Args[1] - - if env.Rule.Attr(attrName) != nil { - return env.File, nil - } - - return copyAttributeBetweenRules(env, attrName, from) -} - -// cmdDictAdd adds a key to a dict, if that key does _not_ exit already. -func cmdDictAdd(opts *Options, env CmdEnvironment) (*build.File, error) { - attr := env.Args[0] - args := env.Args[1:] - - dict := &build.DictExpr{} - currDict, ok := env.Rule.Attr(attr).(*build.DictExpr) - if ok { - dict = currDict - } - - for _, x := range args { - kv := strings.Split(x, ":") - expr := getStringExpr(kv[1], env.Pkg) - - prev := DictionaryGet(dict, kv[0]) - if prev == nil { - // Only set the value if the value is currently unset. - DictionarySet(dict, kv[0], expr) - } - } - env.Rule.SetAttr(attr, dict) - return env.File, nil -} - -// cmdDictSet adds a key to a dict, overwriting any previous values. -func cmdDictSet(opts *Options, env CmdEnvironment) (*build.File, error) { - attr := env.Args[0] - args := env.Args[1:] - - dict := &build.DictExpr{} - currDict, ok := env.Rule.Attr(attr).(*build.DictExpr) - if ok { - dict = currDict - } - - for _, x := range args { - kv := strings.Split(x, ":") - expr := getStringExpr(kv[1], env.Pkg) - // Set overwrites previous values. - DictionarySet(dict, kv[0], expr) - } - env.Rule.SetAttr(attr, dict) - return env.File, nil -} - -// cmdDictRemove removes a key from a dict. -func cmdDictRemove(opts *Options, env CmdEnvironment) (*build.File, error) { - attr := env.Args[0] - args := env.Args[1:] - - thing := env.Rule.Attr(attr) - dictAttr, ok := thing.(*build.DictExpr) - if !ok { - return env.File, nil - } - - for _, x := range args { - // should errors here be flagged? - DictionaryDelete(dictAttr, x) - env.Rule.SetAttr(attr, dictAttr) - } - - // If the removal results in the dict having no contents, delete the attribute (stay clean!) - if dictAttr == nil || len(dictAttr.List) == 0 { - env.Rule.DelAttr(attr) - } - - return env.File, nil -} - -func copyAttributeBetweenRules(env CmdEnvironment, attrName string, from string) (*build.File, error) { - fromRule := FindRuleByName(env.File, from) - if fromRule == nil { - return nil, fmt.Errorf("could not find rule '%s'", from) - } - attr := fromRule.Attr(attrName) - if attr == nil { - return nil, fmt.Errorf("rule '%s' does not have attribute '%s'", from, attrName) - } - - ast, err := build.ParseBuild("" /* filename */, []byte(build.FormatString(attr))) - if err != nil { - return nil, fmt.Errorf("could not parse attribute value %v", build.FormatString(attr)) - } - - env.Rule.SetAttr(attrName, ast.Stmt[0]) - return env.File, nil -} - -func cmdFix(opts *Options, env CmdEnvironment) (*build.File, error) { - // Fix the whole file - if env.Rule.Kind() == "package" { - return FixFile(env.File, env.Pkg, env.Args), nil - } - // Fix a specific rule - return FixRule(env.File, env.Pkg, env.Rule, env.Args), nil -} - -// CommandInfo provides a command function and info on incoming arguments. -type CommandInfo struct { - Fn func(*Options, CmdEnvironment) (*build.File, error) - PerRule bool - MinArg int - MaxArg int - Template string -} - -// AllCommands associates the command names with their function and number -// of arguments. -var AllCommands = map[string]CommandInfo{ - "add": {cmdAdd, true, 2, -1, " "}, - "new_load": {cmdNewLoad, false, 1, -1, " <[to=]from(s)>"}, - "comment": {cmdComment, true, 1, 3, "? ? "}, - "print_comment": {cmdPrintComment, true, 0, 2, "? ?"}, - "delete": {cmdDelete, true, 0, 0, ""}, - "fix": {cmdFix, true, 0, -1, "?"}, - "move": {cmdMove, true, 3, -1, " "}, - "new": {cmdNew, false, 2, 4, " [(before|after) ]"}, - "print": {cmdPrint, true, 0, -1, ""}, - "remove": {cmdRemove, true, 1, -1, " "}, - "remove_comment": {cmdRemoveComment, true, 0, 2, "? ?"}, - "rename": {cmdRename, true, 2, 2, " "}, - "replace": {cmdReplace, true, 3, 3, " "}, - "substitute": {cmdSubstitute, true, 3, 3, " "}, - "set": {cmdSet, true, 1, -1, " "}, - "set_if_absent": {cmdSetIfAbsent, true, 1, -1, " "}, - "copy": {cmdCopy, true, 2, 2, " "}, - "copy_no_overwrite": {cmdCopyNoOverwrite, true, 2, 2, " "}, - "dict_add": {cmdDictAdd, true, 2, -1, " <(key:value)(s)>"}, - "dict_set": {cmdDictSet, true, 2, -1, " <(key:value)(s)>"}, - "dict_remove": {cmdDictRemove, true, 2, -1, " "}, -} - -func expandTargets(f *build.File, rule string) ([]*build.Rule, error) { - if r := FindRuleByName(f, rule); r != nil { - return []*build.Rule{r}, nil - } else if r := FindExportedFile(f, rule); r != nil { - return []*build.Rule{r}, nil - } else if rule == "all" || rule == "*" { - // "all" is a valid name, it is a wildcard only if no such rule is found. - return f.Rules(""), nil - } else if strings.HasPrefix(rule, "%") { - // "%java_library" will match all java_library functions in the package - // "%" will match the rule which begins at LINENUM. - // This is for convenience, "%" is not a valid character in bazel targets. - kind := rule[1:] - if linenum, err := strconv.Atoi(kind); err == nil { - if r := f.RuleAt(linenum); r != nil { - return []*build.Rule{r}, nil - } - } else { - return f.Rules(kind), nil - } - } - return nil, fmt.Errorf("rule '%s' not found", rule) -} - -func filterRules(opts *Options, rules []*build.Rule) (result []*build.Rule) { - if len(opts.FilterRuleTypes) == 0 { - return rules - } - for _, rule := range rules { - for _, filterType := range opts.FilterRuleTypes { - if rule.Kind() == filterType { - result = append(result, rule) - break - } - } - } - return -} - -// command contains a list of tokens that describe a buildozer command. -type command struct { - tokens []string -} - -// checkCommandUsage checks the number of argument of a command. -// It prints an error and usage when it is not valid. -func checkCommandUsage(name string, cmd CommandInfo, count int) { - if count >= cmd.MinArg && (cmd.MaxArg == -1 || count <= cmd.MaxArg) { - return - } - - if count < cmd.MinArg { - fmt.Fprintf(os.Stderr, "Too few arguments for command '%s', expected at least %d.\n", - name, cmd.MinArg) - } else { - fmt.Fprintf(os.Stderr, "Too many arguments for command '%s', expected at most %d.\n", - name, cmd.MaxArg) - } - Usage() - os.Exit(1) -} - -// Match text that only contains spaces if they're escaped with '\'. -var spaceRegex = regexp.MustCompile(`(\\ |[^ ])+`) - -// SplitOnSpaces behaves like strings.Fields, except that spaces can be escaped. -// " some dummy\\ string" -> ["some", "dummy string"] -func SplitOnSpaces(input string) []string { - result := spaceRegex.FindAllString(input, -1) - for i, s := range result { - result[i] = strings.Replace(s, `\ `, " ", -1) - } - return result -} - -// parseCommands parses commands and targets they should be applied on from -// a list of arguments. -// Each argument can be either: -// - a command (as defined by AllCommands) and its parameters, separated by -// whitespace -// - a target all commands that are parsed during one call to parseCommands -// should be applied on -func parseCommands(args []string) (commands []command, targets []string) { - for _, arg := range args { - commandTokens := SplitOnSpaces(arg) - cmd, found := AllCommands[commandTokens[0]] - if found { - checkCommandUsage(commandTokens[0], cmd, len(commandTokens)-1) - commands = append(commands, command{commandTokens}) - } else { - targets = append(targets, arg) - } - } - return -} - -// commandsForTarget contains commands to be executed on the given target. -type commandsForTarget struct { - target string - commands []command -} - -// commandsForFile contains the file name and all commands that should be -// applied on that file, indexed by their target. -type commandsForFile struct { - file string - commands []commandsForTarget -} - -// commandError returns an error that formats 'err' in the context of the -// commands to be executed on the given target. -func commandError(commands []command, target string, err error) error { - return fmt.Errorf("error while executing commands %s on target %s: %s", commands, target, err) -} - -// rewriteResult contains the outcome of applying fixes to a single file. -type rewriteResult struct { - file string - errs []error - modified bool - records []*apipb.Output_Record -} - -// getGlobalVariables returns the global variable assignments in the provided list of expressions. -// That is, for each variable assignment of the form -// a = v -// vars["a"] will contain the AssignExpr whose RHS value is the assignment "a = v". -func getGlobalVariables(exprs []build.Expr) (vars map[string]*build.AssignExpr) { - vars = make(map[string]*build.AssignExpr) - for _, expr := range exprs { - if as, ok := expr.(*build.AssignExpr); ok { - if lhs, ok := as.LHS.(*build.Ident); ok { - vars[lhs.Name] = as - } - } - } - return vars -} - -// When checking the filesystem, we need to look for any of the -// possible buildFileNames. For historical reasons, the -// parts of the tool that generate paths that we may want to examine -// continue to assume that build files are all named "BUILD". -var buildFileNames = [...]string{"BUILD.bazel", "BUILD", "BUCK"} -var buildFileNamesSet = map[string]bool{ - "BUILD.bazel": true, - "BUILD": true, - "BUCK": true, -} - -// rewrite parses the BUILD file for the given file, transforms the AST, -// and write the changes back in the file (or on stdout). -func rewrite(opts *Options, commandsForFile commandsForFile) *rewriteResult { - name := commandsForFile.file - var data []byte - var err error - var fi os.FileInfo - records := []*apipb.Output_Record{} - if name == stdinPackageName { // read on stdin - data, err = ioutil.ReadAll(os.Stdin) - if err != nil { - return &rewriteResult{file: name, errs: []error{err}} - } - } else { - origName := name - for _, suffix := range buildFileNames { - if strings.HasSuffix(name, "/"+suffix) { - name = strings.TrimSuffix(name, suffix) - break - } - } - for _, suffix := range buildFileNames { - name = name + suffix - data, fi, err = file.ReadFile(name) - if err == nil { - break - } - name = strings.TrimSuffix(name, suffix) - } - if err != nil { - data, fi, err = file.ReadFile(name) - } - if err != nil { - err = errors.New("file not found or not readable") - return &rewriteResult{file: origName, errs: []error{err}} - } - } - - f, err := build.ParseBuild(name, data) - if err != nil { - return &rewriteResult{file: name, errs: []error{err}} - } - - vars := map[string]*build.AssignExpr{} - if opts.EditVariables { - vars = getGlobalVariables(f.Stmt) - } - var errs []error - changed := false - for _, commands := range commandsForFile.commands { - target := commands.target - commands := commands.commands - _, absPkg, rule := InterpretLabelForWorkspaceLocation(opts.RootDir, target) - _, pkg, _ := ParseLabel(target) - if pkg == stdinPackageName { // Special-case: This is already absolute - absPkg = stdinPackageName - } - - targets, err := expandTargets(f, rule) - if err != nil { - cerr := commandError(commands, target, err) - errs = append(errs, cerr) - if !opts.KeepGoing { - return &rewriteResult{file: name, errs: errs, records: records} - - } - } - targets = filterRules(opts, targets) - for _, cmd := range commands { - cmdInfo := AllCommands[cmd.tokens[0]] - // Depending on whether a transformation is rule-specific or not, it should be applied to - // every rule that satisfies the filter or just once to the file. - cmdTargets := targets - if !cmdInfo.PerRule { - cmdTargets = []*build.Rule{nil} - } - for _, r := range cmdTargets { - record := &apipb.Output_Record{} - newf, err := cmdInfo.Fn(opts, CmdEnvironment{f, r, vars, absPkg, cmd.tokens[1:], record}) - if len(record.Fields) != 0 { - records = append(records, record) - } - if err != nil { - cerr := commandError([]command{cmd}, target, err) - if opts.KeepGoing { - errs = append(errs, cerr) - } else { - return &rewriteResult{file: name, errs: []error{cerr}, records: records} - } - } - if newf != nil { - changed = true - f = newf - } - } - } - } - if !changed { - return &rewriteResult{file: name, errs: errs, records: records} - } - f = RemoveEmptyPackage(f) - ndata, err := runBuildifier(opts, f) - if err != nil { - return &rewriteResult{file: name, errs: []error{fmt.Errorf("running buildifier: %v", err)}, records: records} - } - - if opts.Stdout || name == stdinPackageName { - os.Stdout.Write(ndata) - return &rewriteResult{file: name, errs: errs, records: records} - } - - if bytes.Equal(data, ndata) { - return &rewriteResult{file: name, errs: errs, records: records} - } - - if err := EditFile(fi, name); err != nil { - return &rewriteResult{file: name, errs: []error{err}, records: records} - } - - if err := file.WriteFile(name, ndata); err != nil { - return &rewriteResult{file: name, errs: []error{err}, records: records} - } - - fileModified = true - return &rewriteResult{file: name, errs: errs, modified: true, records: records} -} - -// EditFile is a function that does any prework needed before editing a file. -// e.g. "checking out for write" from a locking source control repo. -var EditFile = func(fi os.FileInfo, name string) error { - return nil -} - -// runBuildifier formats the build file f. -// Runs opts.Buildifier if it's non-empty, otherwise uses built-in formatter. -// opts.Buildifier is useful to force consistency with other tools that call Buildifier. -func runBuildifier(opts *Options, f *build.File) ([]byte, error) { - if opts.Buildifier == "" { - build.Rewrite(f, nil) - return build.Format(f), nil - } - - cmd := exec.Command(opts.Buildifier, "--type=build") - data := build.Format(f) - cmd.Stdin = bytes.NewBuffer(data) - stdout := bytes.NewBuffer(nil) - stderr := bytes.NewBuffer(nil) - cmd.Stdout = stdout - cmd.Stderr = stderr - err := cmd.Run() - if stderr.Len() > 0 { - return nil, fmt.Errorf("%s", stderr.Bytes()) - } - if err != nil { - return nil, err - } - return stdout.Bytes(), nil -} - -// Given a target, whose package may contain a trailing "/...", returns all -// extisting BUILD file paths which match the package. -func targetExpressionToBuildFiles(opts *Options, target string) []string { - file, _, _ := InterpretLabelForWorkspaceLocation(opts.RootDir, target) - if opts.RootDir == "" { - var err error - if file, err = filepath.Abs(file); err != nil { - fmt.Printf("Cannot make path absolute: %s\n", err.Error()) - os.Exit(1) - } - } - - if !strings.HasSuffix(file, "/.../BUILD") { - return []string{file} - } - - var buildFiles []string - searchDirs := []string{strings.TrimSuffix(file, "/.../BUILD")} - for len(searchDirs) != 0 { - lastIndex := len(searchDirs) - 1 - dir := searchDirs[lastIndex] - searchDirs = searchDirs[:lastIndex] - - dirFiles, err := ioutil.ReadDir(dir) - if err != nil { - continue - } - - for _, dirFile := range dirFiles { - if dirFile.IsDir() { - searchDirs = append(searchDirs, path.Join(dir, dirFile.Name())) - } else if _, ok := buildFileNamesSet[dirFile.Name()]; ok { - buildFiles = append(buildFiles, path.Join(dir, dirFile.Name())) - } - } - } - - return buildFiles -} - -// appendCommands adds the given commands to be applied to each of the given targets -// via the commandMap. -func appendCommands(opts *Options, commandMap map[string][]commandsForTarget, args []string) { - commands, targets := parseCommands(args) - for _, target := range targets { - if strings.HasSuffix(target, "/BUILD") { - target = strings.TrimSuffix(target, "/BUILD") + ":__pkg__" - } - var buildFiles []string - _, pkg, _ := ParseLabel(target) - if pkg == stdinPackageName { - buildFiles = []string{stdinPackageName} - } else { - buildFiles = targetExpressionToBuildFiles(opts, target) - } - - for _, file := range buildFiles { - commandMap[file] = append(commandMap[file], commandsForTarget{target, commands}) - } - } -} - -func appendCommandsFromFile(opts *Options, commandsByFile map[string][]commandsForTarget, fileName string) { - var reader io.Reader - if opts.CommandsFile == stdinPackageName { - reader = os.Stdin - } else { - rc := file.OpenReadFile(opts.CommandsFile) - reader = rc - defer rc.Close() - } - appendCommandsFromReader(opts, reader, commandsByFile) -} - -func appendCommandsFromReader(opts *Options, reader io.Reader, commandsByFile map[string][]commandsForTarget) { - r := bufio.NewReader(reader) - atEof := false - for !atEof { - line, err := r.ReadString('\n') - if err == io.EOF { - atEof = true - err = nil - } - if err != nil { - fmt.Fprintf(os.Stderr, "Error while reading commands file: %v", err) - return - } - line = strings.TrimSuffix(line, "\n") - if line == "" { - continue - } - args := strings.Split(line, "|") - appendCommands(opts, commandsByFile, args) - } -} - -func printRecord(writer io.Writer, record *apipb.Output_Record) { - fields := record.Fields - line := make([]string, len(fields)) - for i, field := range fields { - switch value := field.Value.(type) { - case *apipb.Output_Record_Field_Text: - if field.QuoteWhenPrinting && strings.ContainsRune(value.Text, ' ') { - line[i] = fmt.Sprintf("%q", value.Text) - } else { - line[i] = value.Text - } - break - case *apipb.Output_Record_Field_Number: - line[i] = strconv.Itoa(int(value.Number)) - break - case *apipb.Output_Record_Field_Error: - switch value.Error { - case apipb.Output_Record_Field_UNKNOWN: - line[i] = "(unknown)" - break - case apipb.Output_Record_Field_MISSING: - line[i] = "(missing)" - break - } - break - case *apipb.Output_Record_Field_List: - line[i] = fmt.Sprintf("[%s]", strings.Join(value.List.Strings, " ")) - break - } - } - - fmt.Fprint(writer, strings.Join(line, " ")+"\n") -} - -// Buildozer loops over all arguments on the command line fixing BUILD files. -func Buildozer(opts *Options, args []string) int { - commandsByFile := make(map[string][]commandsForTarget) - if opts.CommandsFile != "" { - appendCommandsFromFile(opts, commandsByFile, opts.CommandsFile) - } else { - if len(args) == 0 { - Usage() - } - appendCommands(opts, commandsByFile, args) - } - - numFiles := len(commandsByFile) - if opts.Parallelism > 0 { - runtime.GOMAXPROCS(opts.Parallelism) - } - results := make(chan *rewriteResult, numFiles) - data := make(chan commandsForFile) - - for i := 0; i < opts.NumIO; i++ { - go func(results chan *rewriteResult, data chan commandsForFile) { - for commandsForFile := range data { - results <- rewrite(opts, commandsForFile) - } - }(results, data) - } - - for file, commands := range commandsByFile { - data <- commandsForFile{file, commands} - } - close(data) - records := []*apipb.Output_Record{} - hasErrors := false - for i := 0; i < numFiles; i++ { - fileResults := <-results - if fileResults == nil { - continue - } - hasErrors = hasErrors || len(fileResults.errs) > 0 - for _, err := range fileResults.errs { - fmt.Fprintf(os.Stderr, "%s: %s\n", fileResults.file, err) - } - if fileResults.modified && !opts.Quiet { - fmt.Fprintf(os.Stderr, "fixed %s\n", fileResults.file) - } - if fileResults.records != nil { - records = append(records, fileResults.records...) - } - } - - if opts.IsPrintingProto { - data, err := proto.Marshal(&apipb.Output{Records: records}) - if err != nil { - log.Fatal("marshaling error: ", err) - } - fmt.Fprintf(os.Stdout, "%s", data) - } else { - for _, record := range records { - printRecord(os.Stdout, record) - } - } - - if hasErrors { - return 2 - } - if !fileModified && !opts.Stdout { - return 3 - } - return 0 -} diff --git a/vendor/github.com/bazelbuild/buildtools/edit/edit.go b/vendor/github.com/bazelbuild/buildtools/edit/edit.go deleted file mode 100644 index 2d394d8caed..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/edit/edit.go +++ /dev/null @@ -1,1104 +0,0 @@ -/* -Copyright 2016 Google 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 edit provides high-level auxiliary functions for AST manipulation -// on BUILD files. -package edit - -import ( - "fmt" - "os" - "path" - "path/filepath" - "regexp" - "sort" - "strconv" - "strings" - - "github.com/bazelbuild/buildtools/build" - "github.com/bazelbuild/buildtools/tables" - "github.com/bazelbuild/buildtools/wspace" -) - -var ( - // ShortenLabelsFlag if true converts added labels to short form , e.g. //foo:bar => :bar - ShortenLabelsFlag = true - // DeleteWithComments if true a list attribute will be be deleted in ListDelete, even if there is a comment attached to it - DeleteWithComments = true -) - -// ParseLabel parses a Blaze label (eg. //devtools/buildozer:rule), and returns -// the repo name ("" for the main repo), package (with leading slashes trimmed) -// and rule name (e.g. ["", "devtools/buildozer", "rule"]). -func ParseLabel(target string) (string, string, string) { - repo := "" - if strings.HasPrefix(target, "@") { - target = strings.TrimLeft(target, "@") - parts := strings.SplitN(target, "/", 2) - if len(parts) == 1 { - // "@foo" -> "foo", "", "foo" (ie @foo//:foo) - return target, "", target - } - repo = parts[0] - target = "/" + parts[1] - } - // TODO(bazel-team): check if the next line can now be deleted - target = strings.TrimRight(target, ":") // labels can end with ':' - parts := strings.SplitN(target, ":", 2) - parts[0] = strings.TrimPrefix(parts[0], "//") - if len(parts) == 1 { - if strings.HasPrefix(target, "//") || tables.StripLabelLeadingSlashes { - // "//absolute/pkg" -> "absolute/pkg", "pkg" - return repo, parts[0], path.Base(parts[0]) - } - // "relative/label" -> "", "relative/label" - return repo, "", parts[0] - } - return repo, parts[0], parts[1] -} - -// ShortenLabel rewrites labels to use the canonical form (the form -// recommended by build-style). This behavior can be disabled using the -// --noshorten_labels flag for projects that consistently use long-form labels. -// "//foo/bar:bar" => "//foo/bar", or ":bar" when possible. -func ShortenLabel(label string, pkg string) string { - if !ShortenLabelsFlag { - return label - } - if !strings.Contains(label, "//") { - // It doesn't look like a long label, so we preserve it. - return label - } - repo, labelPkg, rule := ParseLabel(label) - if repo == "" && labelPkg == pkg { // local label - return ":" + rule - } - slash := strings.LastIndex(labelPkg, "/") - if (slash >= 0 && labelPkg[slash+1:] == rule) || labelPkg == rule { - if repo == "" { - return "//" + labelPkg - } - return "@" + repo + "//" + labelPkg - } - if strings.HasPrefix(label, "@") && repo == rule && labelPkg == "" { - return "@" + repo - } - return label -} - -// LabelsEqual returns true if label1 and label2 are equal. The function -// takes care of the optional ":" prefix and differences between long-form -// labels and local labels. -func LabelsEqual(label1, label2, pkg string) bool { - str1 := strings.TrimPrefix(ShortenLabel(label1, pkg), ":") - str2 := strings.TrimPrefix(ShortenLabel(label2, pkg), ":") - return str1 == str2 -} - -// isFile returns true if the path refers to a regular file after following -// symlinks. -func isFile(path string) bool { - path, err := filepath.EvalSymlinks(path) - if err != nil { - return false - } - info, err := os.Stat(path) - if err != nil { - return false - } - return info.Mode().IsRegular() -} - -// InterpretLabelForWorkspaceLocation returns the name of the BUILD file to -// edit, the full package name, and the rule. It takes a workspace-rooted -// directory to use. -func InterpretLabelForWorkspaceLocation(root string, target string) (buildFile string, pkg string, rule string) { - repo, pkg, rule := ParseLabel(target) - rootDir, relativePath := wspace.FindWorkspaceRoot(root) - if repo != "" { - files, err := wspace.FindRepoBuildFiles(rootDir) - if err == nil { - if buildFile, ok := files[repo]; ok { - return buildFile, pkg, rule - } - } - // TODO(rodrigoq): report error for other repos - } - - if strings.HasPrefix(target, "//") { - buildFile = path.Join(rootDir, pkg, "BUILD") - return - } - if isFile(pkg) { - // allow operation on other files like WORKSPACE - buildFile = pkg - pkg = path.Join(relativePath, filepath.Dir(pkg)) - return - } - if pkg != "" { - buildFile = pkg + "/BUILD" - } else { - buildFile = "BUILD" - } - pkg = path.Join(relativePath, pkg) - return -} - -// InterpretLabel returns the name of the BUILD file to edit, the full -// package name, and the rule. It uses the pwd for resolving workspace file paths. -func InterpretLabel(target string) (buildFile string, pkg string, rule string) { - return InterpretLabelForWorkspaceLocation("", target) -} - -// ExprToRule returns a Rule from an Expr. -// The boolean is false iff the Expr is not a function call, or does not have -// the expected kind. -func ExprToRule(expr build.Expr, kind string) (*build.Rule, bool) { - call, ok := expr.(*build.CallExpr) - if !ok { - return nil, false - } - k, ok := call.X.(*build.Ident) - if !ok || k.Name != kind { - return nil, false - } - return &build.Rule{call, ""}, true -} - -// ExistingPackageDeclaration returns the package declaration, or nil if there is none. -func ExistingPackageDeclaration(f *build.File) *build.Rule { - for _, stmt := range f.Stmt { - if rule, ok := ExprToRule(stmt, "package"); ok { - return rule - } - } - return nil -} - -// PackageDeclaration returns the package declaration. If it doesn't -// exist, it is created at the top of the BUILD file, after optional -// docstring, comments, and load statements. -func PackageDeclaration(f *build.File) *build.Rule { - if pkg := ExistingPackageDeclaration(f); pkg != nil { - return pkg - } - all := []build.Expr{} - added := false - call := &build.CallExpr{X: &build.Ident{Name: "package"}} - for _, stmt := range f.Stmt { - switch stmt.(type) { - case *build.CommentBlock, *build.LoadStmt, *build.StringExpr: - // Skip docstring, comments, and load statements to - // find a place to insert the package declaration. - default: - if !added { - all = append(all, call) - added = true - } - } - all = append(all, stmt) - } - if !added { // In case the file is empty. - all = append(all, call) - } - f.Stmt = all - return &build.Rule{call, ""} -} - -// RemoveEmptyPackage removes empty package declarations from the file, i.e.: -// package() -// This might appear because of a buildozer transformation (e.g. when removing a package -// attribute). Removing it is required for the file to be valid. -func RemoveEmptyPackage(f *build.File) *build.File { - var all []build.Expr - for _, stmt := range f.Stmt { - if call, ok := stmt.(*build.CallExpr); ok { - functionName, ok := call.X.(*build.Ident) - if ok && functionName.Name == "package" && len(call.List) == 0 { - continue - } - } - all = append(all, stmt) - } - return &build.File{Path: f.Path, Comments: f.Comments, Stmt: all, Type: build.TypeBuild} -} - -// InsertAfter inserts an expression after index i. -func InsertAfter(i int, stmt []build.Expr, expr build.Expr) []build.Expr { - i = i + 1 // index after the element at i - result := make([]build.Expr, len(stmt)+1) - copy(result[0:i], stmt[0:i]) - result[i] = expr - copy(result[i+1:], stmt[i:]) - return result -} - -// IndexOfLast finds the index of the last expression of a specific kind. -func IndexOfLast(stmt []build.Expr, Kind string) int { - lastIndex := -1 - for i, s := range stmt { - sAsCallExpr, ok := s.(*build.CallExpr) - if !ok { - continue - } - literal, ok := sAsCallExpr.X.(*build.Ident) - if ok && literal.Name == Kind { - lastIndex = i - } - } - return lastIndex -} - -// InsertAfterLastOfSameKind inserts an expression after the last expression of the same kind. -func InsertAfterLastOfSameKind(stmt []build.Expr, expr *build.CallExpr) []build.Expr { - index := IndexOfLast(stmt, expr.X.(*build.Ident).Name) - if index == -1 { - return InsertAtEnd(stmt, expr) - } - return InsertAfter(index, stmt, expr) -} - -// InsertAtEnd inserts an expression at the end of a list, before trailing comments. -func InsertAtEnd(stmt []build.Expr, expr build.Expr) []build.Expr { - var i int - for i = len(stmt) - 1; i >= 0; i-- { - _, ok := stmt[i].(*build.CommentBlock) - if !ok { - break - } - } - return InsertAfter(i, stmt, expr) -} - -// FindRuleByName returns the rule in the file that has the given name. -// If the name is "__pkg__", it returns the global package declaration. -func FindRuleByName(f *build.File, name string) *build.Rule { - if name == "__pkg__" { - return PackageDeclaration(f) - } - _, rule := IndexOfRuleByName(f, name) - return rule -} - -// IndexOfRuleByName returns the index (in f.Stmt) of the CallExpr which defines a rule named `name`, or -1 if it doesn't exist. -func IndexOfRuleByName(f *build.File, name string) (int, *build.Rule) { - linenum := -1 - if strings.HasPrefix(name, "%") { - // "%" will match the rule which begins at LINENUM. - // This is for convenience, "%" is not a valid character in bazel targets. - if result, err := strconv.Atoi(name[1:]); err == nil { - linenum = result - } - } - - for i, stmt := range f.Stmt { - call, ok := stmt.(*build.CallExpr) - if !ok { - continue - } - r := f.Rule(call) - start, _ := call.X.Span() - if r.Name() == name || start.Line == linenum { - return i, r - } - } - return -1, nil -} - -// FindExportedFile returns the first exports_files call which contains the -// file 'name', or nil if not found -func FindExportedFile(f *build.File, name string) *build.Rule { - for _, r := range f.Rules("exports_files") { - if len(r.Call.List) == 0 { - continue - } - pkg := "" // Files are not affected by the package name - if ListFind(r.Call.List[0], name, pkg) != nil { - return r - } - } - return nil -} - -// DeleteRule returns the AST without the specified rule -func DeleteRule(f *build.File, rule *build.Rule) *build.File { - var all []build.Expr - for _, stmt := range f.Stmt { - if stmt == rule.Call { - continue - } - all = append(all, stmt) - } - return &build.File{Path: f.Path, Comments: f.Comments, Stmt: all, Type: build.TypeBuild} -} - -// DeleteRuleByName returns the AST without the rules that have the -// given name. -func DeleteRuleByName(f *build.File, name string) *build.File { - var all []build.Expr - for _, stmt := range f.Stmt { - call, ok := stmt.(*build.CallExpr) - if !ok { - all = append(all, stmt) - continue - } - r := f.Rule(call) - if r.Name() != name { - all = append(all, stmt) - } - } - return &build.File{Path: f.Path, Comments: f.Comments, Stmt: all, Type: build.TypeBuild} -} - -// DeleteRuleByKind removes the rules of the specified kind from the AST. -// Returns an updated copy of f. -func DeleteRuleByKind(f *build.File, kind string) *build.File { - var all []build.Expr - for _, stmt := range f.Stmt { - call, ok := stmt.(*build.CallExpr) - if !ok { - all = append(all, stmt) - continue - } - k, ok := call.X.(*build.Ident) - if !ok || k.Name != kind { - all = append(all, stmt) - } - } - return &build.File{Path: f.Path, Comments: f.Comments, Stmt: all, Type: build.TypeBuild} -} - -// AllLists returns all the lists concatenated in an expression. -// For example, in: glob(["*.go"]) + [":rule"] -// the function will return [[":rule"]]. -func AllLists(e build.Expr) []*build.ListExpr { - switch e := e.(type) { - case *build.ListExpr: - return []*build.ListExpr{e} - case *build.BinaryExpr: - if e.Op == "+" { - return append(AllLists(e.X), AllLists(e.Y)...) - } - } - return nil -} - -// AllSelects returns all the selects concatenated in an expression. -func AllSelects(e build.Expr) []*build.CallExpr { - switch e := e.(type) { - case *build.BinaryExpr: - if e.Op == "+" { - return append(AllSelects(e.X), AllSelects(e.Y)...) - } - case *build.CallExpr: - if x, ok := e.X.(*build.Ident); ok && x.Name == "select" { - return []*build.CallExpr{e} - } - } - return nil -} - -// FirstList works in the same way as AllLists, except that it -// returns only one list, or nil. -func FirstList(e build.Expr) *build.ListExpr { - switch e := e.(type) { - case *build.ListExpr: - return e - case *build.BinaryExpr: - if e.Op == "+" { - li := FirstList(e.X) - if li == nil { - return FirstList(e.Y) - } - return li - } - } - return nil -} - -// AllStrings returns all the string literals concatenated in an expression. -// For example, in: "foo" + x + "bar" -// the function will return ["foo", "bar"]. -func AllStrings(e build.Expr) []*build.StringExpr { - switch e := e.(type) { - case *build.StringExpr: - return []*build.StringExpr{e} - case *build.BinaryExpr: - if e.Op == "+" { - return append(AllStrings(e.X), AllStrings(e.Y)...) - } - } - return nil -} - -// ListFind looks for a string in the list expression (which may be a -// concatenation of lists). It returns the element if it is found. nil -// otherwise. -func ListFind(e build.Expr, item string, pkg string) *build.StringExpr { - item = ShortenLabel(item, pkg) - for _, li := range AllLists(e) { - for _, elem := range li.List { - str, ok := elem.(*build.StringExpr) - if ok && LabelsEqual(str.Value, item, pkg) { - return str - } - } - } - return nil -} - -// hasComments returns whether the StringExpr literal has a comment attached to it. -func hasComments(literal *build.StringExpr) bool { - return len(literal.Before) > 0 || len(literal.Suffix) > 0 -} - -// ContainsComments returns whether the expr has a comment that includes str. -func ContainsComments(expr build.Expr, str string) bool { - str = strings.ToLower(str) - com := expr.Comment() - comments := append(com.Before, com.Suffix...) - comments = append(comments, com.After...) - for _, c := range comments { - if strings.Contains(strings.ToLower(c.Token), str) { - return true - } - } - return false -} - -// RemoveEmptySelectsAndConcatLists iterates the tree in order to turn -// empty selects into empty lists and adjacent lists are concatenated -func RemoveEmptySelectsAndConcatLists(e build.Expr) build.Expr { - switch e := e.(type) { - case *build.BinaryExpr: - if e.Op == "+" { - e.X = RemoveEmptySelectsAndConcatLists(e.X) - e.Y = RemoveEmptySelectsAndConcatLists(e.Y) - - x, xIsList := e.X.(*build.ListExpr) - y, yIsList := e.Y.(*build.ListExpr) - - if xIsList && yIsList { - return &build.ListExpr{List: append(x.List, y.List...)} - } - - if xIsList && len(x.List) == 0 { - return e.Y - } - - if yIsList && len(y.List) == 0 { - return e.X - } - } - case *build.CallExpr: - if x, ok := e.X.(*build.Ident); ok && x.Name == "select" { - if len(e.List) == 0 { - return &build.ListExpr{List: []build.Expr{}} - } - - if dict, ok := e.List[0].(*build.DictExpr); ok { - for _, keyVal := range dict.List { - if keyVal, ok := keyVal.(*build.KeyValueExpr); ok { - val, ok := keyVal.Value.(*build.ListExpr) - if !ok || len(val.List) > 0 { - return e - } - } else { - return e - } - } - - return &build.ListExpr{List: []build.Expr{}} - } - } - } - - return e -} - -// ComputeIntersection returns the intersection of the two lists given as parameters; -// if the containing elements are not build.StringExpr, the result will be nil. -func ComputeIntersection(list1, list2 []build.Expr) []build.Expr { - if list1 == nil || list2 == nil { - return nil - } - - if len(list2) == 0 { - return []build.Expr{} - } - - i := 0 - for j, common := range list1 { - if common, ok := common.(*build.StringExpr); ok { - found := false - for _, elem := range list2 { - if str, ok := elem.(*build.StringExpr); ok { - if str.Value == common.Value { - found = true - break - } - } else { - return nil - } - } - - if found { - list1[i] = list1[j] - i++ - } - } else { - return nil - } - } - return list1[:i] -} - -// SelectListsIntersection returns the intersection of the lists of strings inside -// the dictionary argument of the select expression given as a parameter -func SelectListsIntersection(sel *build.CallExpr, pkg string) (intersection []build.Expr) { - if len(sel.List) == 0 || len(sel.List) > 1 { - return nil - } - - dict, ok := sel.List[0].(*build.DictExpr) - if !ok || len(dict.List) == 0 { - return nil - } - - if keyVal, ok := dict.List[0].(*build.KeyValueExpr); ok { - if val, ok := keyVal.Value.(*build.ListExpr); ok { - intersection = make([]build.Expr, len(val.List)) - copy(intersection, val.List) - } - } - - for _, keyVal := range dict.List[1:] { - if keyVal, ok := keyVal.(*build.KeyValueExpr); ok { - if val, ok := keyVal.Value.(*build.ListExpr); ok { - intersection = ComputeIntersection(intersection, val.List) - if len(intersection) == 0 { - return intersection - } - } else { - return nil - } - } else { - return nil - } - } - - return intersection -} - -// ResolveAttr extracts common elements of the lists inside select dictionaries -// and adds them at attribute level rather than select level, as well as turns -// empty selects into empty lists and concatenates adjacent lists -func ResolveAttr(r *build.Rule, attr, pkg string) { - var toExtract []build.Expr - - e := r.Attr(attr) - if e == nil { - return - } - - for _, sel := range AllSelects(e) { - intersection := SelectListsIntersection(sel, pkg) - if intersection != nil { - toExtract = append(toExtract, intersection...) - } - } - - for _, common := range toExtract { - e = AddValueToList(e, pkg, common, false) // this will also remove them from selects - } - - r.SetAttr(attr, RemoveEmptySelectsAndConcatLists(e)) -} - -// SelectDelete removes the item from all the lists which are values -// in the dictionary of every select -func SelectDelete(e build.Expr, item, pkg string, deleted **build.StringExpr) { - for _, sel := range AllSelects(e) { - if len(sel.List) == 0 { - continue - } - - if dict, ok := sel.List[0].(*build.DictExpr); ok { - for _, keyVal := range dict.List { - if keyVal, ok := keyVal.(*build.KeyValueExpr); ok { - if val, ok := keyVal.Value.(*build.ListExpr); ok { - RemoveFromList(val, item, pkg, deleted) - } - } - } - } - } -} - -// RemoveFromList removes one element from a ListExpr and stores -// the deleted StringExpr at the address pointed by the last parameter -func RemoveFromList(li *build.ListExpr, item, pkg string, deleted **build.StringExpr) { - var all []build.Expr - for _, elem := range li.List { - if str, ok := elem.(*build.StringExpr); ok { - if LabelsEqual(str.Value, item, pkg) && (DeleteWithComments || !hasComments(str)) { - if deleted != nil { - *deleted = str - } - - continue - } - } - all = append(all, elem) - } - li.List = all -} - -// ListDelete deletes the item from a list expression in e and returns -// the StringExpr deleted, or nil otherwise. -func ListDelete(e build.Expr, item, pkg string) (deleted *build.StringExpr) { - if unquoted, _, err := build.Unquote(item); err == nil { - item = unquoted - } - deleted = nil - item = ShortenLabel(item, pkg) - for _, li := range AllLists(e) { - RemoveFromList(li, item, pkg, &deleted) - } - - SelectDelete(e, item, pkg, &deleted) - - return deleted -} - -// ListAttributeDelete deletes string item from list attribute attr, deletes attr if empty, -// and returns the StringExpr deleted, or nil otherwise. -func ListAttributeDelete(rule *build.Rule, attr, item, pkg string) *build.StringExpr { - deleted := ListDelete(rule.Attr(attr), item, pkg) - if deleted != nil { - if listExpr, ok := rule.Attr(attr).(*build.ListExpr); ok && len(listExpr.List) == 0 { - rule.DelAttr(attr) - } - } - return deleted -} - -// ListReplace replaces old with value in all lists in e and returns a Boolean -// to indicate whether the replacement was successful. -func ListReplace(e build.Expr, old, value, pkg string) bool { - replaced := false - old = ShortenLabel(old, pkg) - for _, li := range AllLists(e) { - for k, elem := range li.List { - str, ok := elem.(*build.StringExpr) - if !ok || !LabelsEqual(str.Value, old, pkg) { - continue - } - li.List[k] = &build.StringExpr{Value: ShortenLabel(value, pkg), Comments: *elem.Comment()} - replaced = true - } - } - return replaced -} - -// ListSubstitute replaces strings matching a regular expression in all lists -// in e and returns a Boolean to indicate whether the replacement was -// successful. -func ListSubstitute(e build.Expr, oldRegexp *regexp.Regexp, newTemplate string) bool { - substituted := false - for _, li := range AllLists(e) { - for k, elem := range li.List { - str, ok := elem.(*build.StringExpr) - if !ok { - continue - } - newValue, ok := stringSubstitute(str.Value, oldRegexp, newTemplate) - if ok { - li.List[k] = &build.StringExpr{Value: newValue, Comments: *elem.Comment()} - substituted = true - } - } - } - return substituted -} - -func stringSubstitute(oldValue string, oldRegexp *regexp.Regexp, newTemplate string) (string, bool) { - match := oldRegexp.FindStringSubmatchIndex(oldValue) - if match == nil { - return oldValue, false - } - newValue := string(oldRegexp.ExpandString(nil, newTemplate, oldValue, match)) - if match[0] > 0 { - newValue = oldValue[:match[0]] + newValue - } - if match[1] < len(oldValue) { - newValue = newValue + oldValue[match[1]:] - } - return newValue, true -} - -// isExprLessThan compares two Expr statements. Currently, only labels are supported. -func isExprLessThan(x1, x2 build.Expr) bool { - str1, ok1 := x1.(*build.StringExpr) - str2, ok2 := x2.(*build.StringExpr) - if ok1 != ok2 { - return ok2 - } - if ok1 && ok2 { - // Labels starting with // are put at the end. - pre1 := strings.HasPrefix(str1.Value, "//") - pre2 := strings.HasPrefix(str2.Value, "//") - if pre1 != pre2 { - return pre2 - } - return str1.Value < str2.Value - } - return false -} - -func sortedInsert(list []build.Expr, item build.Expr) []build.Expr { - i := 0 - for ; i < len(list); i++ { - if isExprLessThan(item, list[i]) { - break - } - } - res := make([]build.Expr, 0, len(list)+1) - res = append(res, list[:i]...) - res = append(res, item) - res = append(res, list[i:]...) - return res -} - -// attributeMustNotBeSorted returns true if the list in the attribute cannot be -// sorted. For some attributes, it makes sense to try to do a sorted insert -// (e.g. deps), even when buildifier will not sort it for conservative reasons. -// For a few attributes, sorting will never make sense. -func attributeMustNotBeSorted(rule, attr string) bool { - // TODO(bazel-team): Come up with a more complete list. - return attr == "args" -} - -// getVariable returns the binary expression that assignes a variable to expr, if expr is -// an identifier of a variable that vars contains a mapping for. -func getVariable(expr build.Expr, vars *map[string]*build.AssignExpr) (varAssignment *build.AssignExpr) { - if vars == nil { - return nil - } - - if literal, ok := expr.(*build.Ident); ok { - if varAssignment = (*vars)[literal.Name]; varAssignment != nil { - return varAssignment - } - } - return nil -} - -// AddValueToList adds a value to a list. If the expression is -// not a list, a list with a single element is appended to the original -// expression. -func AddValueToList(oldList build.Expr, pkg string, item build.Expr, sorted bool) build.Expr { - if oldList == nil { - return &build.ListExpr{List: []build.Expr{item}} - } - - str, ok := item.(*build.StringExpr) - if ok { - if ListFind(oldList, str.Value, pkg) != nil { - // The value is already in the list. - return oldList - } - SelectDelete(oldList, str.Value, pkg, nil) - } - - li := FirstList(oldList) - if li != nil { - if sorted { - li.List = sortedInsert(li.List, item) - } else { - li.List = append(li.List, item) - } - return oldList - } - list := &build.ListExpr{List: []build.Expr{item}} - concat := &build.BinaryExpr{Op: "+", X: oldList, Y: list} - return concat -} - -// AddValueToListAttribute adds the given item to the list attribute identified by name and pkg. -func AddValueToListAttribute(r *build.Rule, name string, pkg string, item build.Expr, vars *map[string]*build.AssignExpr) { - old := r.Attr(name) - sorted := !attributeMustNotBeSorted(r.Kind(), name) - if varAssignment := getVariable(old, vars); varAssignment != nil { - varAssignment.RHS = AddValueToList(varAssignment.RHS, pkg, item, sorted) - } else { - r.SetAttr(name, AddValueToList(old, pkg, item, sorted)) - } -} - -// MoveAllListAttributeValues moves all values from list attribute oldAttr to newAttr, -// and deletes oldAttr. -func MoveAllListAttributeValues(rule *build.Rule, oldAttr, newAttr, pkg string, vars *map[string]*build.AssignExpr) error { - if rule.Attr(oldAttr) == nil { - return fmt.Errorf("no attribute %s found in %s", oldAttr, rule.Name()) - } - if rule.Attr(newAttr) == nil { - RenameAttribute(rule, oldAttr, newAttr) - return nil - } - if listExpr, ok := rule.Attr(oldAttr).(*build.ListExpr); ok { - for _, val := range listExpr.List { - AddValueToListAttribute(rule, newAttr, pkg, val, vars) - } - rule.DelAttr(oldAttr) - return nil - } - return fmt.Errorf("%s already exists and %s is not a simple list", newAttr, oldAttr) -} - -// DictionarySet looks for the key in the dictionary expression. If value is not nil, -// it replaces the current value with it. In all cases, it returns the current value. -func DictionarySet(dict *build.DictExpr, key string, value build.Expr) build.Expr { - for _, e := range dict.List { - kv, _ := e.(*build.KeyValueExpr) - if k, ok := kv.Key.(*build.StringExpr); ok && k.Value == key { - if value != nil { - kv.Value = value - } - return kv.Value - } - } - if value != nil { - kv := &build.KeyValueExpr{Key: &build.StringExpr{Value: key}, Value: value} - dict.List = append(dict.List, kv) - } - return nil -} - -// DictionaryGet looks for the key in the dictionary expression, and returns the -// current value. If it is unset, it returns nil. -func DictionaryGet(dict *build.DictExpr, key string) build.Expr { - for _, e := range dict.List { - kv, ok := e.(*build.KeyValueExpr) - if !ok { - continue - } - if k, ok := kv.Key.(*build.StringExpr); ok && k.Value == key { - return kv.Value - } - } - return nil -} - -// DictionaryDelete looks for the key in the dictionary expression. If the key exists, -// it removes the key-value pair and returns it. Otherwise it returns nil. -func DictionaryDelete(dict *build.DictExpr, key string) (deleted build.Expr) { - if unquoted, _, err := build.Unquote(key); err == nil { - key = unquoted - } - deleted = nil - var all []build.Expr - for _, e := range dict.List { - kv, _ := e.(*build.KeyValueExpr) - if k, ok := kv.Key.(*build.StringExpr); ok { - if k.Value == key { - deleted = kv - } else { - all = append(all, e) - } - } - } - dict.List = all - return deleted -} - -// RenameAttribute renames an attribute in a rule. -func RenameAttribute(r *build.Rule, oldName, newName string) error { - if r.Attr(newName) != nil { - return fmt.Errorf("attribute %s already exists in rule %s", newName, r.Name()) - } - for _, kv := range r.Call.List { - as, ok := kv.(*build.AssignExpr) - if !ok { - continue - } - k, ok := as.LHS.(*build.Ident) - if !ok || k.Name != oldName { - continue - } - k.Name = newName - return nil - } - return fmt.Errorf("no attribute %s found in rule %s", oldName, r.Name()) -} - -// EditFunction is a wrapper around build.Edit. The callback is called only on -// functions 'name'. -func EditFunction(v build.Expr, name string, f func(x *build.CallExpr, stk []build.Expr) build.Expr) build.Expr { - return build.Edit(v, func(expr build.Expr, stk []build.Expr) build.Expr { - call, ok := expr.(*build.CallExpr) - if !ok { - return nil - } - fct, ok := call.X.(*build.Ident) - if !ok || fct.Name != name { - return nil - } - return f(call, stk) - }) -} - -// UsedSymbols returns the set of symbols used in the BUILD file (variables, function names). -func UsedSymbols(stmt build.Expr) map[string]bool { - symbols := make(map[string]bool) - build.Walk(stmt, func(expr build.Expr, stack []build.Expr) { - // Don't traverse inside load statements - if len(stack) > 0 { - if _, ok := stack[len(stack)-1].(*build.LoadStmt); ok { - return - } - } - - literal, ok := expr.(*build.Ident) - if !ok { - return - } - // Check if we are on the left-side of an assignment - for _, e := range stack { - if as, ok := e.(*build.AssignExpr); ok { - if as.LHS == expr { - return - } - } - } - symbols[literal.Name] = true - }) - return symbols -} - -// NewLoad creates a new LoadStmt node -func NewLoad(location string, from, to []string) *build.LoadStmt { - load := &build.LoadStmt{ - Module: &build.StringExpr{ - Value: location, - }, - ForceCompact: true, - } - for i := range from { - load.From = append(load.From, &build.Ident{Name: from[i]}) - load.To = append(load.To, &build.Ident{Name: to[i]}) - } - return load -} - -// AppendToLoad appends symbols to an existing load statement -// Returns true if the statement was acually edited (if the required symbols haven't been -// loaded yet) -func AppendToLoad(load *build.LoadStmt, from, to []string) bool { - symbolsToLoad := make(map[string]string) - for i, s := range to { - symbolsToLoad[s] = from[i] - } - for _, ident := range load.To { - delete(symbolsToLoad, ident.Name) // Already loaded. - } - - if len(symbolsToLoad) == 0 { - return false - } - - // Append the remaining loads to the load statement. - sortedSymbols := []string{} - for s := range symbolsToLoad { - sortedSymbols = append(sortedSymbols, s) - } - sort.Strings(sortedSymbols) - for _, s := range sortedSymbols { - load.From = append(load.From, &build.Ident{Name: symbolsToLoad[s]}) - load.To = append(load.To, &build.Ident{Name: s}) - } - return true -} - -// appendLoad tries to find an existing load location and append symbols to it. -func appendLoad(stmts []build.Expr, location string, from, to []string) bool { - symbolsToLoad := make(map[string]string) - for i, s := range to { - symbolsToLoad[s] = from[i] - } - var lastLoad *build.LoadStmt - for _, s := range stmts { - load, ok := s.(*build.LoadStmt) - if !ok { - continue - } - if load.Module.Value != location { - continue // Loads a different file. - } - for _, ident := range load.To { - delete(symbolsToLoad, ident.Name) // Already loaded. - } - // Remember the last insert location, but potentially remove more symbols - // that are already loaded in other subsequent calls. - lastLoad = load - } - if lastLoad == nil { - return false - } - - // Append the remaining loads to the last load location. - from = []string{} - to = []string{} - for t, f := range symbolsToLoad { - from = append(from, f) - to = append(to, t) - } - AppendToLoad(lastLoad, from, to) - return true -} - -// InsertLoad inserts a load statement at the top of the list of statements. -// The load statement is constructed using a string location and two slices of from- and to-symbols. -// The function panics if the slices aren't of the same lentgh. Symbols that are already loaded -// from the given filepath are ignored. If stmts already contains a load for the -// location in arguments, appends the symbols to load to it. -func InsertLoad(stmts []build.Expr, location string, from, to []string) []build.Expr { - if len(from) != len(to) { - panic(fmt.Errorf("length mismatch: %v (from) and %v (to)", len(from), len(to))) - } - - if appendLoad(stmts, location, from, to) { - return stmts - } - - load := NewLoad(location, from, to) - - var all []build.Expr - added := false - for i, stmt := range stmts { - _, isComment := stmt.(*build.CommentBlock) - _, isString := stmt.(*build.StringExpr) - isDocString := isString && i == 0 - if isComment || isDocString || added { - all = append(all, stmt) - continue - } - all = append(all, load) - all = append(all, stmt) - added = true - } - if !added { // Empty file or just comments. - all = append(all, load) - } - return all -} diff --git a/vendor/github.com/bazelbuild/buildtools/edit/fix.go b/vendor/github.com/bazelbuild/buildtools/edit/fix.go deleted file mode 100644 index 51bada13ba8..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/edit/fix.go +++ /dev/null @@ -1,574 +0,0 @@ -/* -Copyright 2016 Google 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. -*/ -// Functions to clean and fix BUILD files - -package edit - -import ( - "regexp" - "sort" - "strings" - - "github.com/bazelbuild/buildtools/build" -) - -// splitOptionsWithSpaces is a cleanup function. -// It splits options strings that contain a space. This change -// should be safe as Blaze is splitting those strings, but we will -// eventually get rid of this misfeature. -// eg. it converts from: -// copts = ["-Dfoo -Dbar"] -// to: -// copts = ["-Dfoo", "-Dbar"] -func splitOptionsWithSpaces(_ *build.File, r *build.Rule, _ string) bool { - var attrToRewrite = []string{ - "copts", - "linkopts", - } - fixed := false - for _, attrName := range attrToRewrite { - attr := r.Attr(attrName) - if attr != nil { - for _, li := range AllLists(attr) { - fixed = splitStrings(li) || fixed - } - } - } - return fixed -} - -func splitStrings(list *build.ListExpr) bool { - var all []build.Expr - fixed := false - for _, e := range list.List { - str, ok := e.(*build.StringExpr) - if !ok { - all = append(all, e) - continue - } - if strings.Contains(str.Value, " ") && !strings.Contains(str.Value, "'\"") { - fixed = true - for i, substr := range strings.Fields(str.Value) { - item := &build.StringExpr{Value: substr} - if i == 0 { - item.Comments = str.Comments - } - all = append(all, item) - } - } else { - all = append(all, str) - } - } - list.List = all - return fixed -} - -// shortenLabels rewrites the labels in the rule using the short notation. -func shortenLabels(_ *build.File, r *build.Rule, pkg string) bool { - fixed := false - for _, attr := range r.AttrKeys() { - e := r.Attr(attr) - if !ContainsLabels(attr) { - continue - } - for _, li := range AllLists(e) { - for _, elem := range li.List { - str, ok := elem.(*build.StringExpr) - if ok && str.Value != ShortenLabel(str.Value, pkg) { - str.Value = ShortenLabel(str.Value, pkg) - fixed = true - } - } - } - } - return fixed -} - -// removeVisibility removes useless visibility attributes. -func removeVisibility(f *build.File, r *build.Rule, pkg string) bool { - pkgDecl := PackageDeclaration(f) - defaultVisibility := pkgDecl.AttrStrings("default_visibility") - - // If no default_visibility is given, it is implicitly private. - if len(defaultVisibility) == 0 { - defaultVisibility = []string{"//visibility:private"} - } - - visibility := r.AttrStrings("visibility") - if len(visibility) == 0 || len(visibility) != len(defaultVisibility) { - return false - } - sort.Strings(defaultVisibility) - sort.Strings(visibility) - for i, vis := range visibility { - if vis != defaultVisibility[i] { - return false - } - } - r.DelAttr("visibility") - return true -} - -// removeTestOnly removes the useless testonly attributes. -func removeTestOnly(f *build.File, r *build.Rule, pkg string) bool { - pkgDecl := PackageDeclaration(f) - - def := strings.HasSuffix(r.Kind(), "_test") || r.Kind() == "test_suite" - if !def { - if pkgDecl.Attr("default_testonly") == nil { - def = strings.HasPrefix(pkg, "javatests/") - } else if pkgDecl.AttrLiteral("default_testonly") == "1" { - def = true - } else if pkgDecl.AttrLiteral("default_testonly") != "0" { - // Non-literal value: it's not safe to do a change. - return false - } - } - - testonly := r.AttrLiteral("testonly") - if def && testonly == "1" { - r.DelAttr("testonly") - return true - } - if !def && testonly == "0" { - r.DelAttr("testonly") - return true - } - return false -} - -func genruleRenameDepsTools(_ *build.File, r *build.Rule, _ string) bool { - return r.Kind() == "genrule" && RenameAttribute(r, "deps", "tools") == nil -} - -// explicitHeuristicLabels adds $(location ...) for each label in the string s. -func explicitHeuristicLabels(s string, labels map[string]bool) string { - // Regexp comes from LABEL_CHAR_MATCHER in - // java/com/google/devtools/build/lib/analysis/LabelExpander.java - re := regexp.MustCompile("[a-zA-Z0-9:/_.+-]+|[^a-zA-Z0-9:/_.+-]+") - parts := re.FindAllString(s, -1) - changed := false - canChange := true - for i, part := range parts { - // We don't want to add $(location when it's already present. - // So we skip the next label when we see location(s). - if part == "location" || part == "locations" { - canChange = false - } - if !labels[part] { - if labels[":"+part] { // leading colon is often missing - part = ":" + part - } else { - continue - } - } - - if !canChange { - canChange = true - continue - } - parts[i] = "$(location " + part + ")" - changed = true - } - if changed { - return strings.Join(parts, "") - } - return s -} - -func addLabels(r *build.Rule, attr string, labels map[string]bool) { - a := r.Attr(attr) - if a == nil { - return - } - for _, li := range AllLists(a) { - for _, item := range li.List { - if str, ok := item.(*build.StringExpr); ok { - labels[str.Value] = true - } - } - } -} - -// genruleFixHeuristicLabels modifies the cmd attribute of genrules, so -// that they don't rely on heuristic label expansion anymore. -// Label expansion is made explicit with the $(location ...) command. -func genruleFixHeuristicLabels(_ *build.File, r *build.Rule, _ string) bool { - if r.Kind() != "genrule" { - return false - } - - cmd := r.Attr("cmd") - if cmd == nil { - return false - } - labels := make(map[string]bool) - addLabels(r, "tools", labels) - addLabels(r, "srcs", labels) - - fixed := false - for _, str := range AllStrings(cmd) { - newVal := explicitHeuristicLabels(str.Value, labels) - if newVal != str.Value { - fixed = true - str.Value = newVal - } - } - return fixed -} - -// sortExportsFiles sorts the first argument of exports_files if it is a list. -func sortExportsFiles(_ *build.File, r *build.Rule, _ string) bool { - if r.Kind() != "exports_files" || len(r.Call.List) == 0 { - return false - } - build.SortStringList(r.Call.List[0]) - return true -} - -// removeVarref replaces all varref('x') with '$(x)'. -// The goal is to eventually remove varref from the build language. -func removeVarref(_ *build.File, r *build.Rule, _ string) bool { - fixed := false - EditFunction(r.Call, "varref", func(call *build.CallExpr, stk []build.Expr) build.Expr { - if len(call.List) != 1 { - return nil - } - str, ok := (call.List[0]).(*build.StringExpr) - if !ok { - return nil - } - fixed = true - str.Value = "$(" + str.Value + ")" - // Preserve suffix comments from the function call - str.Comment().Suffix = append(str.Comment().Suffix, call.Comment().Suffix...) - return str - }) - return fixed -} - -// sortGlob sorts the list argument to glob. -func sortGlob(_ *build.File, r *build.Rule, _ string) bool { - fixed := false - EditFunction(r.Call, "glob", func(call *build.CallExpr, stk []build.Expr) build.Expr { - if len(call.List) == 0 { - return nil - } - build.SortStringList(call.List[0]) - fixed = true - return call - }) - return fixed -} - -func evaluateListConcatenation(expr build.Expr) build.Expr { - if _, ok := expr.(*build.ListExpr); ok { - return expr - } - bin, ok := expr.(*build.BinaryExpr) - if !ok || bin.Op != "+" { - return expr - } - li1, ok1 := evaluateListConcatenation(bin.X).(*build.ListExpr) - li2, ok2 := evaluateListConcatenation(bin.Y).(*build.ListExpr) - if !ok1 || !ok2 { - return expr - } - res := *li1 - res.List = append(li1.List, li2.List...) - return &res -} - -// mergeLiteralLists evaluates the concatenation of two literal lists. -// e.g. [1, 2] + [3, 4] -> [1, 2, 3, 4] -func mergeLiteralLists(_ *build.File, r *build.Rule, _ string) bool { - fixed := false - build.Edit(r.Call, func(expr build.Expr, stk []build.Expr) build.Expr { - newexpr := evaluateListConcatenation(expr) - fixed = fixed || (newexpr != expr) - return newexpr - }) - return fixed -} - -// usePlusEqual replaces uses of extend and append with the += operator. -// e.g. foo.extend(bar) => foo += bar -// foo.append(bar) => foo += [bar] -func usePlusEqual(f *build.File) bool { - fixed := false - for i, stmt := range f.Stmt { - call, ok := stmt.(*build.CallExpr) - if !ok { - continue - } - dot, ok := call.X.(*build.DotExpr) - if !ok || len(call.List) != 1 { - continue - } - obj, ok := dot.X.(*build.Ident) - if !ok { - continue - } - - var fix *build.AssignExpr - if dot.Name == "extend" { - fix = &build.AssignExpr{LHS: obj, Op: "+=", RHS: call.List[0]} - } else if dot.Name == "append" { - list := &build.ListExpr{List: []build.Expr{call.List[0]}} - fix = &build.AssignExpr{LHS: obj, Op: "+=", RHS: list} - } else { - continue - } - fix.Comments = call.Comments // Keep original comments - f.Stmt[i] = fix - fixed = true - } - return fixed -} - -func isNonemptyComment(comment *build.Comments) bool { - return len(comment.Before)+len(comment.Suffix)+len(comment.After) > 0 -} - -// Checks whether a load statement or any of its arguments have a comment -func hasComment(load *build.LoadStmt) bool { - if isNonemptyComment(load.Comment()) { - return true - } - if isNonemptyComment(load.Module.Comment()) { - return true - } - - for i := range load.From { - if isNonemptyComment(load.From[i].Comment()) || isNonemptyComment(load.To[i].Comment()) { - return true - } - } - return false -} - -// cleanUnusedLoads removes symbols from load statements that are not used in the file. -// It also cleans symbols loaded multiple times, sorts symbol list, and removes load -// statements when the list is empty. -func cleanUnusedLoads(f *build.File) bool { - symbols := UsedSymbols(f) - fixed := false - - var all []build.Expr - for _, stmt := range f.Stmt { - load, ok := stmt.(*build.LoadStmt) - if !ok || hasComment(load) { - all = append(all, stmt) - continue - } - var fromSymbols, toSymbols []*build.Ident - for i := range load.From { - fromSymbol := load.From[i] - toSymbol := load.To[i] - if symbols[toSymbol.Name] { - // The symbol is actually used - fromSymbols = append(fromSymbols, fromSymbol) - toSymbols = append(toSymbols, toSymbol) - // If the same symbol is loaded twice, we'll remove it. - delete(symbols, toSymbol.Name) - } else { - fixed = true - } - } - if len(toSymbols) > 0 { // Keep the load statement if it loads at least one symbol. - sort.Sort(loadArgs{fromSymbols, toSymbols}) - load.From = fromSymbols - load.To = toSymbols - all = append(all, load) - } else { - fixed = true - } - } - f.Stmt = all - return fixed -} - -// movePackageDeclarationToTheTop ensures that the call to package() is done -// before everything else (except comments). -func movePackageDeclarationToTheTop(f *build.File) bool { - pkg := ExistingPackageDeclaration(f) - if pkg == nil { - return false - } - all := []build.Expr{} - inserted := false // true when the package declaration has been inserted - for _, stmt := range f.Stmt { - _, isComment := stmt.(*build.CommentBlock) - _, isString := stmt.(*build.StringExpr) // typically a docstring - _, isAssignExpr := stmt.(*build.AssignExpr) // e.g. variable declaration - _, isLoad := stmt.(*build.LoadStmt) - if isComment || isString || isAssignExpr || isLoad { - all = append(all, stmt) - continue - } - if stmt == pkg.Call { - if inserted { - // remove the old package - continue - } - return false // the file was ok - } - if !inserted { - all = append(all, pkg.Call) - inserted = true - } - all = append(all, stmt) - } - f.Stmt = all - return true -} - -// moveToPackage is an auxilliary function used by moveLicensesAndDistribs. -// The function shouldn't appear more than once in the file (depot cleanup has -// been done). -func moveToPackage(f *build.File, attrname string) bool { - var all []build.Expr - fixed := false - for _, stmt := range f.Stmt { - rule, ok := ExprToRule(stmt, attrname) - if !ok || len(rule.Call.List) != 1 { - all = append(all, stmt) - continue - } - pkgDecl := PackageDeclaration(f) - pkgDecl.SetAttr(attrname, rule.Call.List[0]) - pkgDecl.AttrDefn(attrname).Comments = *stmt.Comment() - fixed = true - } - f.Stmt = all - return fixed -} - -// moveLicensesAndDistribs replaces the 'licenses' and 'distribs' functions -// with an attribute in package. -// Before: licenses(["notice"]) -// After: package(licenses = ["notice"]) -func moveLicensesAndDistribs(f *build.File) bool { - fixed1 := moveToPackage(f, "licenses") - fixed2 := moveToPackage(f, "distribs") - return fixed1 || fixed2 -} - -// AllRuleFixes is a list of all Buildozer fixes that can be applied on a rule. -var AllRuleFixes = []struct { - Name string - Fn func(file *build.File, rule *build.Rule, pkg string) bool - Message string -}{ - {"sortGlob", sortGlob, - "Sort the list in a call to glob"}, - {"splitOptions", splitOptionsWithSpaces, - "Each option should be given separately in the list"}, - {"shortenLabels", shortenLabels, - "Style: Use the canonical label notation"}, - {"removeVisibility", removeVisibility, - "This visibility attribute is useless (it corresponds to the default value)"}, - {"removeTestOnly", removeTestOnly, - "This testonly attribute is useless (it corresponds to the default value)"}, - {"genruleRenameDepsTools", genruleRenameDepsTools, - "'deps' attribute in genrule has been renamed 'tools'"}, - {"genruleFixHeuristicLabels", genruleFixHeuristicLabels, - "$(location) should be called explicitely"}, - {"sortExportsFiles", sortExportsFiles, - "Files in exports_files should be sorted"}, - {"varref", removeVarref, - "All varref('foo') should be replaced with '$foo'"}, - {"mergeLiteralLists", mergeLiteralLists, - "Remove useless list concatenation"}, -} - -// FileLevelFixes is a list of all Buildozer fixes that apply on the whole file. -var FileLevelFixes = []struct { - Name string - Fn func(file *build.File) bool - Message string -}{ - {"movePackageToTop", movePackageDeclarationToTheTop, - "The package declaration should be the first rule in a file"}, - {"usePlusEqual", usePlusEqual, - "Prefer '+=' over 'extend' or 'append'"}, - {"unusedLoads", cleanUnusedLoads, - "Remove unused symbols from load statements"}, - {"moveLicensesAndDistribs", moveLicensesAndDistribs, - "Move licenses and distribs to the package function"}, -} - -// FixRule aims to fix errors in BUILD files, remove deprecated features, and -// simplify the code. -func FixRule(f *build.File, pkg string, rule *build.Rule, fixes []string) *build.File { - fixesAsMap := make(map[string]bool) - for _, fix := range fixes { - fixesAsMap[fix] = true - } - fixed := false - for _, fix := range AllRuleFixes { - if len(fixes) == 0 || fixesAsMap[fix.Name] { - fixed = fix.Fn(f, rule, pkg) || fixed - } - } - if !fixed { - return nil - } - return f -} - -// FixFile fixes everything it can in the BUILD file. -func FixFile(f *build.File, pkg string, fixes []string) *build.File { - fixesAsMap := make(map[string]bool) - for _, fix := range fixes { - fixesAsMap[fix] = true - } - fixed := false - for _, rule := range f.Rules("") { - res := FixRule(f, pkg, rule, fixes) - if res != nil { - fixed = true - f = res - } - } - for _, fix := range FileLevelFixes { - if len(fixes) == 0 || fixesAsMap[fix.Name] { - fixed = fix.Fn(f) || fixed - } - } - if !fixed { - return nil - } - return f -} - -// A wrapper for a LoadStmt's From and To slices for consistent sorting of their contents. -// It's assumed that the following slices have the same length, the contents are sorted by -// the `To` attribute, the items of `From` are swapped exactly the same way as the items of `To`. -type loadArgs struct { - From []*build.Ident - To []*build.Ident -} - -func (args loadArgs) Len() int { - return len(args.From) -} - -func (args loadArgs) Swap(i, j int) { - args.From[i], args.From[j] = args.From[j], args.From[i] - args.To[i], args.To[j] = args.To[j], args.To[i] -} - -func (args loadArgs) Less(i, j int) bool { - return args.To[i].Name < args.To[j].Name -} diff --git a/vendor/github.com/bazelbuild/buildtools/edit/types.go b/vendor/github.com/bazelbuild/buildtools/edit/types.go deleted file mode 100644 index 4c7ff0aa454..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/edit/types.go +++ /dev/null @@ -1,69 +0,0 @@ -/* -Copyright 2016 Google 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. -*/ -// Type information for attributes. - -package edit - -import ( - buildpb "github.com/bazelbuild/buildtools/build_proto" - "github.com/bazelbuild/buildtools/lang" - "github.com/bazelbuild/buildtools/tables" -) - -var typeOf = lang.TypeOf - -// IsList returns true for all attributes whose type is a list. -func IsList(attr string) bool { - overrideValue, isOverridden := tables.IsListArg[attr] - if isOverridden { - return overrideValue - } - // It stands to reason that a sortable list must be a list. - isSortableList := tables.IsSortableListArg[attr] - if isSortableList { - return true - } - ty := typeOf[attr] - return ty == buildpb.Attribute_STRING_LIST || - ty == buildpb.Attribute_LABEL_LIST || - ty == buildpb.Attribute_OUTPUT_LIST || - ty == buildpb.Attribute_FILESET_ENTRY_LIST || - ty == buildpb.Attribute_INTEGER_LIST || - ty == buildpb.Attribute_LICENSE || - ty == buildpb.Attribute_DISTRIBUTION_SET -} - -// IsIntList returns true for all attributes whose type is an int list. -func IsIntList(attr string) bool { - return typeOf[attr] == buildpb.Attribute_INTEGER_LIST -} - -// IsString returns true for all attributes whose type is a string or a label. -func IsString(attr string) bool { - ty := typeOf[attr] - return ty == buildpb.Attribute_LABEL || - ty == buildpb.Attribute_STRING || - ty == buildpb.Attribute_OUTPUT -} - -// IsStringDict returns true for all attributes whose type is a string dictionary. -func IsStringDict(attr string) bool { - return typeOf[attr] == buildpb.Attribute_STRING_DICT -} - -// ContainsLabels returns true for all attributes whose type is a label or a label list. -func ContainsLabels(attr string) bool { - ty := typeOf[attr] - return ty == buildpb.Attribute_LABEL_LIST || - ty == buildpb.Attribute_LABEL -} diff --git a/vendor/github.com/bazelbuild/buildtools/file/BUILD b/vendor/github.com/bazelbuild/buildtools/file/BUILD deleted file mode 100644 index 574f1f56e2f..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/file/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["file.go"], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/buildtools/file", - importpath = "github.com/bazelbuild/buildtools/file", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/buildtools/file/file.go b/vendor/github.com/bazelbuild/buildtools/file/file.go deleted file mode 100644 index a311099b184..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/file/file.go +++ /dev/null @@ -1,48 +0,0 @@ -/* -Copyright 2016 Google 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 file provides utility file operations. -package file - -import ( - "fmt" - "io" - "io/ioutil" - "os" -) - -// ReadFile is like ioutil.ReadFile. -func ReadFile(name string) ([]byte, os.FileInfo, error) { - fi, err := os.Stat(name) - if err != nil { - return nil, nil, err - } - - data, err := ioutil.ReadFile(name) - return data, fi, err -} - -// WriteFile is like ioutil.WriteFile -func WriteFile(name string, data []byte) error { - return ioutil.WriteFile(name, data, 0644) -} - -// OpenReadFile is like os.Open. -func OpenReadFile(name string) io.ReadCloser { - f, err := os.Open(name) - if err != nil { - fmt.Fprintf(os.Stderr, "Could not open %s\n", name) - os.Exit(1) - } - return f -} diff --git a/vendor/github.com/bazelbuild/buildtools/lang/BUILD b/vendor/github.com/bazelbuild/buildtools/lang/BUILD deleted file mode 100644 index 684538930e6..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/lang/BUILD +++ /dev/null @@ -1,24 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["tables.gen.go"], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/buildtools/lang", - importpath = "github.com/bazelbuild/buildtools/lang", - visibility = ["//visibility:public"], - deps = ["//vendor/github.com/bazelbuild/buildtools/build_proto:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/buildtools/lang/build-language.pb b/vendor/github.com/bazelbuild/buildtools/lang/build-language.pb deleted file mode 100644 index 6cf953ba856..00000000000 Binary files a/vendor/github.com/bazelbuild/buildtools/lang/build-language.pb and /dev/null differ diff --git a/vendor/github.com/bazelbuild/buildtools/lang/tables.gen.go b/vendor/github.com/bazelbuild/buildtools/lang/tables.gen.go deleted file mode 100644 index 2d739d2d3a2..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/lang/tables.gen.go +++ /dev/null @@ -1,270 +0,0 @@ -// Generated file, do not edit. -package lang - -import buildpb "github.com/bazelbuild/buildtools/build_proto" - -var TypeOf = map[string]buildpb.Attribute_Discriminator{ - "aar": buildpb.Attribute_LABEL, - "absolute_path_profile": buildpb.Attribute_STRING, - "actual": buildpb.Attribute_LABEL, - "aliases": buildpb.Attribute_STRING_LIST, - "all_files": buildpb.Attribute_LABEL, - "alwayslink": buildpb.Attribute_BOOLEAN, - "api_level": buildpb.Attribute_INTEGER, - "ar_files": buildpb.Attribute_LABEL, - "archives": buildpb.Attribute_LABEL_LIST, - "args": buildpb.Attribute_STRING_LIST, - "artifact": buildpb.Attribute_STRING, - "as_files": buildpb.Attribute_LABEL, - "asset_catalogs": buildpb.Attribute_LABEL_LIST, - "assets": buildpb.Attribute_LABEL_LIST, - "assets_dir": buildpb.Attribute_STRING, - "avoid_deps": buildpb.Attribute_LABEL_LIST, - "binary_type": buildpb.Attribute_STRING, - "blacklisted_protos": buildpb.Attribute_LABEL_LIST, - "bootclasspath": buildpb.Attribute_LABEL_LIST, - "build_file": buildpb.Attribute_STRING, - "build_file_content": buildpb.Attribute_STRING, - "build_tools_version": buildpb.Attribute_STRING, - "bundle_imports": buildpb.Attribute_LABEL_LIST, - "bundle_loader": buildpb.Attribute_LABEL, - "bundles": buildpb.Attribute_LABEL_LIST, - "cache": buildpb.Attribute_INTEGER, - "classpath_resources": buildpb.Attribute_LABEL_LIST, - "cmd": buildpb.Attribute_STRING, - "command_line": buildpb.Attribute_STRING, - "commit": buildpb.Attribute_STRING, - "compatible_with": buildpb.Attribute_LABEL_LIST, - "compiler": buildpb.Attribute_STRING, - "compiler_files": buildpb.Attribute_LABEL, - "constraint_setting": buildpb.Attribute_LABEL, - "constraint_values": buildpb.Attribute_LABEL_LIST, - "constraints": buildpb.Attribute_STRING_LIST, - "copts": buildpb.Attribute_STRING_LIST, - "coverage_files": buildpb.Attribute_LABEL, - "cpu": buildpb.Attribute_STRING, - "create_executable": buildpb.Attribute_BOOLEAN, - "crunch_png": buildpb.Attribute_BOOLEAN, - "custom_package": buildpb.Attribute_STRING, - "data": buildpb.Attribute_LABEL_LIST, - "datamodels": buildpb.Attribute_LABEL_LIST, - "debug_key": buildpb.Attribute_LABEL, - "default": buildpb.Attribute_LABEL, - "default_copts": buildpb.Attribute_STRING_LIST, - "default_deprecation": buildpb.Attribute_STRING, - "default_hdrs_check": buildpb.Attribute_STRING, - "default_ios_sdk_version": buildpb.Attribute_STRING, - "default_macos_sdk_version": buildpb.Attribute_STRING, - "default_properties": buildpb.Attribute_LABEL, - "default_python_version": buildpb.Attribute_STRING, - "default_testonly": buildpb.Attribute_BOOLEAN, - "default_tvos_sdk_version": buildpb.Attribute_STRING, - "default_visibility": buildpb.Attribute_STRING_LIST, - "default_watchos_sdk_version": buildpb.Attribute_STRING, - "define_values": buildpb.Attribute_STRING_DICT, - "defines": buildpb.Attribute_STRING_LIST, - "densities": buildpb.Attribute_STRING_LIST, - "deploy_manifest_lines": buildpb.Attribute_STRING_LIST, - "deprecation": buildpb.Attribute_STRING, - "deps": buildpb.Attribute_LABEL_LIST, - "dex_shards": buildpb.Attribute_INTEGER, - "dexopts": buildpb.Attribute_STRING_LIST, - "distribs": buildpb.Attribute_DISTRIBUTION_SET, - "dwp_files": buildpb.Attribute_LABEL, - "dylibs": buildpb.Attribute_LABEL_LIST, - "dynamic_runtime_libs": buildpb.Attribute_LABEL_LIST, - "enable_data_binding": buildpb.Attribute_BOOLEAN, - "enable_modules": buildpb.Attribute_BOOLEAN, - "encoding": buildpb.Attribute_STRING, - "entry_classes": buildpb.Attribute_STRING_LIST, - "exec_compatible_with": buildpb.Attribute_LABEL_LIST, - "executable": buildpb.Attribute_BOOLEAN, - "exported_plugins": buildpb.Attribute_LABEL_LIST, - "exports": buildpb.Attribute_LABEL_LIST, - "exports_manifest": buildpb.Attribute_TRISTATE, - "expression": buildpb.Attribute_STRING, - "extclasspath": buildpb.Attribute_LABEL_LIST, - "extension_safe": buildpb.Attribute_BOOLEAN, - "extra_actions": buildpb.Attribute_LABEL_LIST, - "extra_srcs": buildpb.Attribute_LABEL_LIST, - "families": buildpb.Attribute_STRING_LIST, - "features": buildpb.Attribute_STRING_LIST, - "files": buildpb.Attribute_LABEL_LIST, - "flaky": buildpb.Attribute_BOOLEAN, - "forcibly_disable_header_compilation": buildpb.Attribute_BOOLEAN, - "framework_imports": buildpb.Attribute_LABEL_LIST, - "genclass": buildpb.Attribute_LABEL_LIST, - "generates_api": buildpb.Attribute_BOOLEAN, - "hdrs": buildpb.Attribute_LABEL_LIST, - "header_compiler": buildpb.Attribute_LABEL_LIST, - "heuristic_label_expansion": buildpb.Attribute_BOOLEAN, - "horizontal_resolution": buildpb.Attribute_INTEGER, - "idl_import_root": buildpb.Attribute_STRING, - "idl_parcelables": buildpb.Attribute_LABEL_LIST, - "idl_preprocessed": buildpb.Attribute_LABEL_LIST, - "idl_srcs": buildpb.Attribute_LABEL_LIST, - "ijar": buildpb.Attribute_LABEL_LIST, - "imports": buildpb.Attribute_STRING_LIST, - "include_prefix": buildpb.Attribute_STRING, - "includes": buildpb.Attribute_STRING_LIST, - "incremental_dexing": buildpb.Attribute_TRISTATE, - "infoplist": buildpb.Attribute_LABEL, - "infoplists": buildpb.Attribute_LABEL_LIST, - "init_submodules": buildpb.Attribute_BOOLEAN, - "instruments": buildpb.Attribute_LABEL, - "interface_library": buildpb.Attribute_LABEL, - "interpreter": buildpb.Attribute_LABEL, - "interpreter_path": buildpb.Attribute_STRING, - "is_dynamic": buildpb.Attribute_BOOLEAN, - "jars": buildpb.Attribute_LABEL_LIST, - "java_home": buildpb.Attribute_STRING, - "javabuilder": buildpb.Attribute_LABEL_LIST, - "javac": buildpb.Attribute_LABEL_LIST, - "javac_supports_workers": buildpb.Attribute_BOOLEAN, - "javacopts": buildpb.Attribute_STRING_LIST, - "jre_deps": buildpb.Attribute_LABEL_LIST, - "jvm_flags": buildpb.Attribute_STRING_LIST, - "jvm_opts": buildpb.Attribute_STRING_LIST, - "launcher": buildpb.Attribute_LABEL, - "legacy_create_init": buildpb.Attribute_BOOLEAN, - "libc": buildpb.Attribute_STRING, - "licenses": buildpb.Attribute_LICENSE, - "linker_files": buildpb.Attribute_LABEL, - "linkopts": buildpb.Attribute_STRING_LIST, - "linkshared": buildpb.Attribute_BOOLEAN, - "linkstamp": buildpb.Attribute_LABEL, - "linkstatic": buildpb.Attribute_BOOLEAN, - "local": buildpb.Attribute_BOOLEAN, - "main": buildpb.Attribute_LABEL, - "main_class": buildpb.Attribute_STRING, - "main_dex_list": buildpb.Attribute_LABEL, - "main_dex_list_opts": buildpb.Attribute_STRING_LIST, - "main_dex_proguard_specs": buildpb.Attribute_LABEL_LIST, - "malloc": buildpb.Attribute_LABEL, - "manifest": buildpb.Attribute_LABEL, - "manifest_values": buildpb.Attribute_STRING_DICT, - "message": buildpb.Attribute_STRING, - "minimum_os_version": buildpb.Attribute_STRING, - "mnemonics": buildpb.Attribute_STRING_LIST, - "module_map": buildpb.Attribute_LABEL, - "multidex": buildpb.Attribute_STRING, - "name": buildpb.Attribute_STRING, - "neverlink": buildpb.Attribute_BOOLEAN, - "nocompress_extensions": buildpb.Attribute_STRING_LIST, - "nocopts": buildpb.Attribute_STRING, - "non_arc_srcs": buildpb.Attribute_LABEL_LIST, - "non_propagated_deps": buildpb.Attribute_LABEL_LIST, - "objcopy_files": buildpb.Attribute_LABEL, - "oneversion": buildpb.Attribute_LABEL, - "oneversion_whitelist": buildpb.Attribute_LABEL, - "opts": buildpb.Attribute_STRING_LIST, - "out": buildpb.Attribute_STRING, - "out_templates": buildpb.Attribute_STRING_LIST, - "output_group": buildpb.Attribute_STRING, - "output_licenses": buildpb.Attribute_LICENSE, - "output_to_bindir": buildpb.Attribute_BOOLEAN, - "outs": buildpb.Attribute_STRING_LIST, - "package_configuration": buildpb.Attribute_LABEL_LIST, - "packages": buildpb.Attribute_LABEL_LIST, - "path": buildpb.Attribute_STRING, - "pch": buildpb.Attribute_LABEL, - "platform_apks": buildpb.Attribute_LABEL_LIST, - "platform_type": buildpb.Attribute_STRING, - "plugin": buildpb.Attribute_LABEL, - "plugins": buildpb.Attribute_LABEL_LIST, - "portable_proto_filters": buildpb.Attribute_LABEL_LIST, - "pregenerate_oat_files_for_tests": buildpb.Attribute_BOOLEAN, - "processor_class": buildpb.Attribute_STRING, - "profile": buildpb.Attribute_LABEL, - "proguard_apply_dictionary": buildpb.Attribute_LABEL, - "proguard_apply_mapping": buildpb.Attribute_LABEL, - "proguard_generate_mapping": buildpb.Attribute_BOOLEAN, - "proguard_specs": buildpb.Attribute_LABEL_LIST, - "proto": buildpb.Attribute_STRING, - "proto_source_root": buildpb.Attribute_STRING, - "pytype_deps": buildpb.Attribute_LABEL_LIST, - "ram": buildpb.Attribute_INTEGER, - "reexport_deps": buildpb.Attribute_LABEL_LIST, - "remote": buildpb.Attribute_STRING, - "remote_execution_properties": buildpb.Attribute_STRING, - "repository": buildpb.Attribute_STRING, - "require_defined_version": buildpb.Attribute_BOOLEAN, - "requires_action_output": buildpb.Attribute_BOOLEAN, - "resource_configuration_filters": buildpb.Attribute_STRING_LIST, - "resource_files": buildpb.Attribute_LABEL_LIST, - "resource_jars": buildpb.Attribute_LABEL_LIST, - "resource_strip_prefix": buildpb.Attribute_STRING, - "resourcejar": buildpb.Attribute_LABEL_LIST, - "resources": buildpb.Attribute_LABEL_LIST, - "restricted_to": buildpb.Attribute_LABEL_LIST, - "runtime": buildpb.Attribute_LABEL, - "runtime_deps": buildpb.Attribute_LABEL_LIST, - "runtimes": buildpb.Attribute_LABEL_DICT_UNARY, - "scope": buildpb.Attribute_LABEL_LIST, - "screen_density": buildpb.Attribute_INTEGER, - "sdk_dylibs": buildpb.Attribute_STRING_LIST, - "sdk_frameworks": buildpb.Attribute_STRING_LIST, - "sdk_includes": buildpb.Attribute_STRING_LIST, - "server": buildpb.Attribute_STRING, - "settings_file": buildpb.Attribute_STRING, - "sha1": buildpb.Attribute_STRING, - "sha256": buildpb.Attribute_STRING, - "shard_count": buildpb.Attribute_INTEGER, - "shared_library": buildpb.Attribute_LABEL, - "shrink_resources": buildpb.Attribute_TRISTATE, - "singlejar": buildpb.Attribute_LABEL_LIST, - "size": buildpb.Attribute_STRING, - "source_version": buildpb.Attribute_STRING, - "srcjar": buildpb.Attribute_LABEL, - "srcs": buildpb.Attribute_LABEL_LIST, - "srcs_version": buildpb.Attribute_STRING, - "stamp": buildpb.Attribute_TRISTATE, - "static_library": buildpb.Attribute_LABEL, - "static_runtime_libs": buildpb.Attribute_LABEL_LIST, - "storyboards": buildpb.Attribute_LABEL_LIST, - "strict": buildpb.Attribute_BOOLEAN, - "strings": buildpb.Attribute_LABEL_LIST, - "strip": buildpb.Attribute_BOOLEAN, - "strip_files": buildpb.Attribute_LABEL, - "strip_include_prefix": buildpb.Attribute_STRING, - "strip_prefix": buildpb.Attribute_STRING, - "structured_resources": buildpb.Attribute_LABEL_LIST, - "support_apks": buildpb.Attribute_LABEL_LIST, - "supports_header_parsing": buildpb.Attribute_BOOLEAN, - "supports_param_files": buildpb.Attribute_BOOLEAN, - "system_image": buildpb.Attribute_LABEL, - "system_provided": buildpb.Attribute_BOOLEAN, - "tag": buildpb.Attribute_STRING, - "tags": buildpb.Attribute_STRING_LIST, - "target_compatible_with": buildpb.Attribute_LABEL_LIST, - "target_device": buildpb.Attribute_LABEL, - "target_version": buildpb.Attribute_STRING, - "test_app": buildpb.Attribute_LABEL, - "test_class": buildpb.Attribute_STRING, - "testonly": buildpb.Attribute_BOOLEAN, - "tests": buildpb.Attribute_LABEL_LIST, - "textual_hdrs": buildpb.Attribute_LABEL_LIST, - "timeout": buildpb.Attribute_STRING, - "timezone_data": buildpb.Attribute_LABEL, - "toolchain": buildpb.Attribute_STRING, - "toolchain_type": buildpb.Attribute_STRING, - "toolchains": buildpb.Attribute_LABEL_LIST, - "tools": buildpb.Attribute_LABEL_LIST, - "type": buildpb.Attribute_STRING, - "url": buildpb.Attribute_STRING, - "urls": buildpb.Attribute_STRING_LIST, - "use_testrunner": buildpb.Attribute_BOOLEAN, - "values": buildpb.Attribute_STRING_DICT, - "version": buildpb.Attribute_STRING, - "versions": buildpb.Attribute_LABEL_LIST, - "vertical_resolution": buildpb.Attribute_INTEGER, - "visibility": buildpb.Attribute_STRING_LIST, - "vm_heap": buildpb.Attribute_INTEGER, - "weak_sdk_frameworks": buildpb.Attribute_STRING_LIST, - "win_def_file": buildpb.Attribute_LABEL, - "workspace_file": buildpb.Attribute_STRING, - "workspace_file_content": buildpb.Attribute_STRING, - "xcenv_based_path": buildpb.Attribute_STRING, - "xibs": buildpb.Attribute_LABEL_LIST, - "xlint": buildpb.Attribute_STRING_LIST, -} diff --git a/vendor/github.com/bazelbuild/buildtools/tables/BUILD b/vendor/github.com/bazelbuild/buildtools/tables/BUILD deleted file mode 100644 index 2b691ea99bc..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/tables/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "jsonparser.go", - "tables.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/buildtools/tables", - importpath = "github.com/bazelbuild/buildtools/tables", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/buildtools/tables/jsonparser.go b/vendor/github.com/bazelbuild/buildtools/tables/jsonparser.go deleted file mode 100644 index ca2bc4443af..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/tables/jsonparser.go +++ /dev/null @@ -1,63 +0,0 @@ -/* -Copyright 2017 Google 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 tables - -import ( - "encoding/json" - "io/ioutil" -) - -type Definitions struct { - IsLabelArg map[string]bool - LabelBlacklist map[string]bool - IsListArg map[string]bool - IsSortableListArg map[string]bool - SortableBlacklist map[string]bool - SortableWhitelist map[string]bool - NamePriority map[string]int - StripLabelLeadingSlashes bool - ShortenAbsoluteLabelsToRelative bool -} - -// ParseJSONDefinitions reads and parses JSON table definitions from file. -func ParseJSONDefinitions(file string) (Definitions, error) { - var definitions Definitions - - data, err := ioutil.ReadFile(file) - if err != nil { - return definitions, err - } - - err = json.Unmarshal(data, &definitions) - return definitions, err -} - -// ParseAndUpdateJSONDefinitions reads definitions from file and merges or -// overrides the values in memory. -func ParseAndUpdateJSONDefinitions(file string, merge bool) error { - definitions, err := ParseJSONDefinitions(file) - if err != nil { - return err - } - - if merge { - MergeTables(definitions.IsLabelArg, definitions.LabelBlacklist, definitions.IsListArg, definitions.IsSortableListArg, definitions.SortableBlacklist, definitions.SortableWhitelist, definitions.NamePriority, definitions.StripLabelLeadingSlashes, definitions.ShortenAbsoluteLabelsToRelative) - } else { - OverrideTables(definitions.IsLabelArg, definitions.LabelBlacklist, definitions.IsListArg, definitions.IsSortableListArg, definitions.SortableBlacklist, definitions.SortableWhitelist, definitions.NamePriority, definitions.StripLabelLeadingSlashes, definitions.ShortenAbsoluteLabelsToRelative) - } - return nil -} diff --git a/vendor/github.com/bazelbuild/buildtools/tables/tables.go b/vendor/github.com/bazelbuild/buildtools/tables/tables.go deleted file mode 100644 index 05bda4c2e7c..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/tables/tables.go +++ /dev/null @@ -1,325 +0,0 @@ -/* -Copyright 2016 Google 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. -*/ -// Tables about what Buildifier can and cannot edit. -// Perhaps eventually this will be -// derived from the BUILD encyclopedia. - -package tables - -// IsLabelArg: a named argument to a rule call is considered to have a value -// that can be treated as a label or list of labels if the name -// is one of these names. There is a separate blacklist for -// rule-specific exceptions. -var IsLabelArg = map[string]bool{ - "app_target": true, - "appdir": true, - "base_package": true, - "build_deps": true, - "cc_deps": true, - "ccdeps": true, - "common_deps": true, - "compile_deps": true, - "compiler": true, - "data": true, - "default_visibility": true, - "dep": true, - "deps": true, - "deps_java": true, - "dont_depend_on": true, - "env_deps": true, - "envscripts": true, - "exported_deps": true, - "exports": true, - "externs_list": true, - "files": true, - "globals": true, - "implementation": true, - "implements": true, - "includes": true, - "interface": true, - "jar": true, - "jars": true, - "javadeps": true, - "lib_deps": true, - "library": true, - "malloc": true, - "model": true, - "mods": true, - "module_deps": true, - "module_target": true, - "of": true, - "plugins": true, - "proto_deps": true, - "proto_target": true, - "protos": true, - "resource": true, - "resources": true, - "runtime_deps": true, - "scope": true, - "shared_deps": true, - "similar_deps": true, - "source_jar": true, - "src": true, - "srcs": true, - "stripped_targets": true, - "suites": true, - "swigdeps": true, - "target": true, - "target_devices": true, - "target_platforms": true, - "template": true, - "test": true, - "tests": true, - "tests_deps": true, - "tool": true, - "tools": true, - "visibility": true, -} - -// LabelBlacklist is the list of call arguments that cannot be -// shortened, because they are not interpreted using the same -// rules as for other labels. -var LabelBlacklist = map[string]bool{ - // Shortening this can cause visibility checks to fail. - "package_group.includes": true, -} - -// By default, edit.types.IsList consults lang.TypeOf to determine if an arg is a list. -// You may override this using IsListArg. Specifying a name here overrides any value -// in lang.TypeOf. -var IsListArg = map[string]bool{} - -// IsSortableListArg: a named argument to a rule call is considered to be a sortable list -// if the name is one of these names. There is a separate blacklist for -// rule-specific exceptions. -var IsSortableListArg = map[string]bool{ - "cc_deps": true, - "common_deps": true, - "compile_deps": true, - "configs": true, - "constraints": true, - "data": true, - "default_visibility": true, - "deps": true, - "deps_java": true, - "exported_deps": true, - "exports": true, - "filegroups": true, - "files": true, - "hdrs": true, - "imports": true, - "includes": true, - "inherits": true, - "javadeps": true, - "lib_deps": true, - "module_deps": true, - "out": true, - "outs": true, - "packages": true, - "plugin_modules": true, - "proto_deps": true, - "protos": true, - "pubs": true, - "resources": true, - "runtime_deps": true, - "shared_deps": true, - "similar_deps": true, - "srcs": true, - "swigdeps": true, - "swig_includes": true, - "tags": true, - "tests": true, - "tools": true, - "to_start_extensions": true, - "visibility": true, -} - -// SortableBlacklist records specific rule arguments that must not be reordered. -var SortableBlacklist = map[string]bool{ - "genrule.outs": true, - "genrule.srcs": true, -} - -// SortableWhitelist records specific rule arguments that are guaranteed -// to be reorderable, because bazel re-sorts the list itself after reading the BUILD file. -var SortableWhitelist = map[string]bool{ - "cc_inc_library.hdrs": true, - "cc_library.hdrs": true, - "java_library.srcs": true, - "java_library.resources": true, - "java_binary.srcs": true, - "java_binary.resources": true, - "java_test.srcs": true, - "java_test.resources": true, - "java_library.constraints": true, - "java_import.constraints": true, -} - -// NamePriority maps an argument name to its sorting priority. -// -// NOTE(bazel-team): These are the old buildifier rules. It is likely that this table -// will change, perhaps swapping in a separate table for each call, -// derived from the order used in the Build Encyclopedia. -var NamePriority = map[string]int{ - "name": -99, - "gwt_name": -98, - "package_name": -97, - "visible_node_name": -96, // for boq_initial_css_modules and boq_jswire_test_suite - "size": -95, - "timeout": -94, - "testonly": -93, - "src": -92, - "srcdir": -91, - "srcs": -90, - "out": -89, - "outs": -88, - "hdrs": -87, - "has_services": -86, // before api versions, for proto - "include": -85, // before exclude, for glob - "of": -84, // for check_dependencies - "baseline": -83, // for searchbox_library - // All others sort here, at 0. - "destdir": 1, - "exports": 2, - "runtime_deps": 3, - "deps": 4, - "implementation": 5, - "implements": 6, - "alwayslink": 7, - // default condition in a dictionary literal passed to select should be - // the last one by convention. - "//conditions:default": 50, -} - -var StripLabelLeadingSlashes = false - -var ShortenAbsoluteLabelsToRelative = false - -// AndroidNativeRules lists all Android rules that are being migrated from Native to Starlark. -var AndroidNativeRules = []string{ - "aar_import", - "android_binary", - "android_device", - "android_instrumentation_test", - "android_library", - "android_local_test", - "android_ndk_respository", - "android_sdk_repository", -} - -// AndroidLoadPath is the load path for the Starlark Android Rules. -var AndroidLoadPath = "@rules_android//android:rules.bzl" - -// CcNativeRules lists all C++ rules that are being migrated from Native to Starlark. -var CcNativeRules = []string{ - "cc_binary", - "cc_test", - "cc_library", - "cc_import", - "cc_proto_library", - "fdo_prefetch_hints", - "fdo_profile", - "cc_toolchain", - "cc_toolchain_suite", - "objc_library", - "objc_import", -} - -// CcLoadPath is the load path for the Starlark C++ Rules. -var CcLoadPath = "@rules_cc//cc:defs.bzl" - -// JavaNativeRules lists all Java rules that are being migrated from Native to Starlark. -var JavaNativeRules = []string{ - "java_binary", - "java_import", - "java_library", - "java_lite_proto_library", - "java_proto_library", - "java_test", - "java_package_configuration", - "java_plugin", - "java_runtime", - "java_toolchain", -} - -// JavaLoadPath is the load path for the Starlark Java Rules. -var JavaLoadPath = "@rules_java//java:defs.bzl" - -// PyNativeRules lists all Python rules that are being migrated from Native to Starlark. -var PyNativeRules = []string{ - "py_library", - "py_binary", - "py_test", - "py_runtime", -} - -// PyLoadPath is the load path for the Starlark Python Rules. -var PyLoadPath = "@rules_python//python:defs.bzl" - -// ProtoNativeRules lists all Proto rules that are being migrated from Native to Starlark. -var ProtoNativeRules = []string{ - "proto_lang_toolchain", - "proto_library", -} - -// ProtoNativeSymbols lists all Proto symbols that are being migrated from Native to Starlark. -var ProtoNativeSymbols = []string{ - "ProtoInfo", - "proto_common", -} - -// ProtoLoadPath is the load path for the Starlark Proto Rules. -var ProtoLoadPath = "@rules_proto//proto:defs.bzl" - -// OverrideTables allows a user of the build package to override the special-case rules. The user-provided tables replace the built-in tables. -func OverrideTables(labelArg, blacklist, listArg, sortableListArg, sortBlacklist, sortWhitelist map[string]bool, namePriority map[string]int, stripLabelLeadingSlashes, shortenAbsoluteLabelsToRelative bool) { - IsLabelArg = labelArg - LabelBlacklist = blacklist - IsListArg = listArg - IsSortableListArg = sortableListArg - SortableBlacklist = sortBlacklist - SortableWhitelist = sortWhitelist - NamePriority = namePriority - StripLabelLeadingSlashes = stripLabelLeadingSlashes - ShortenAbsoluteLabelsToRelative = shortenAbsoluteLabelsToRelative -} - -// MergeTables allows a user of the build package to override the special-case rules. The user-provided tables are merged into the built-in tables. -func MergeTables(labelArg, blacklist, listArg, sortableListArg, sortBlacklist, sortWhitelist map[string]bool, namePriority map[string]int, stripLabelLeadingSlashes, shortenAbsoluteLabelsToRelative bool) { - for k, v := range labelArg { - IsLabelArg[k] = v - } - for k, v := range blacklist { - LabelBlacklist[k] = v - } - for k, v := range listArg { - IsListArg[k] = v - } - for k, v := range sortableListArg { - IsSortableListArg[k] = v - } - for k, v := range sortBlacklist { - SortableBlacklist[k] = v - } - for k, v := range sortWhitelist { - SortableWhitelist[k] = v - } - for k, v := range namePriority { - NamePriority[k] = v - } - StripLabelLeadingSlashes = stripLabelLeadingSlashes || StripLabelLeadingSlashes - ShortenAbsoluteLabelsToRelative = shortenAbsoluteLabelsToRelative || ShortenAbsoluteLabelsToRelative -} diff --git a/vendor/github.com/bazelbuild/buildtools/wspace/BUILD b/vendor/github.com/bazelbuild/buildtools/wspace/BUILD deleted file mode 100644 index 8deb2e44fe3..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/wspace/BUILD +++ /dev/null @@ -1,24 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["workspace.go"], - importmap = "k8s.io/kubernetes/vendor/github.com/bazelbuild/buildtools/wspace", - importpath = "github.com/bazelbuild/buildtools/wspace", - visibility = ["//visibility:public"], - deps = ["//vendor/github.com/bazelbuild/buildtools/build:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/bazelbuild/buildtools/wspace/workspace.go b/vendor/github.com/bazelbuild/buildtools/wspace/workspace.go deleted file mode 100644 index 9ca226b43f3..00000000000 --- a/vendor/github.com/bazelbuild/buildtools/wspace/workspace.go +++ /dev/null @@ -1,114 +0,0 @@ -/* -Copyright 2016 Google 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 wspace provides a method to find the root of the bazel tree. -package wspace - -import ( - "io/ioutil" - "os" - "path/filepath" - "strings" - - "github.com/bazelbuild/buildtools/build" -) - -const workspaceFile = "WORKSPACE" - -func alwaysTrue(fi os.FileInfo) bool { - return true -} - -var repoRootFiles = map[string]func(os.FileInfo) bool{ - workspaceFile: alwaysTrue, - ".buckconfig": alwaysTrue, - "pants": func(fi os.FileInfo) bool { - return fi.Mode()&os.ModeType == 0 && fi.Mode()&0100 == 0100 - }, -} - -// findContextPath finds the context path inside of a WORKSPACE-rooted source tree. -func findContextPath(rootDir string) (string, error) { - if rootDir == "" { - return os.Getwd() - } - return rootDir, nil -} - -// FindWorkspaceRoot splits the current code context (the rootDir if present, -// the working directory if not.) It returns the path of the directory -// containing the WORKSPACE file, and the rest. -func FindWorkspaceRoot(rootDir string) (root string, rest string) { - wd, err := findContextPath(rootDir) - if err != nil { - return "", "" - } - if root, err = Find(wd); err != nil { - return "", "" - } - if len(wd) == len(root) { - return root, "" - } - return root, wd[len(root)+1:] -} - -// Find searches from the given dir and up for the WORKSPACE file -// returning the directory containing it, or an error if none found in the tree. -func Find(dir string) (string, error) { - if dir == "" || dir == "/" || dir == "." || (len(dir) == 3 && strings.HasSuffix(dir, ":\\")) { - return "", os.ErrNotExist - } - for repoRootFile, fiFunc := range repoRootFiles { - if fi, err := os.Stat(filepath.Join(dir, repoRootFile)); err == nil && fiFunc(fi) { - return dir, nil - } else if !os.IsNotExist(err) { - return "", err - } - } - return Find(filepath.Dir(dir)) -} - -// FindRepoBuildFiles parses the WORKSPACE to find BUILD files for non-Bazel -// external repositories, specifically those defined by one of these rules: -// new_local_repository(), new_git_repository(), new_http_archive() -func FindRepoBuildFiles(root string) (map[string]string, error) { - ws := filepath.Join(root, workspaceFile) - kinds := []string{ - "new_local_repository", - "new_git_repository", - "new_http_archive", - } - data, err := ioutil.ReadFile(ws) - if err != nil { - return nil, err - } - ast, err := build.Parse(ws, data) - if err != nil { - return nil, err - } - files := make(map[string]string) - for _, kind := range kinds { - for _, r := range ast.Rules(kind) { - buildFile := r.AttrString("build_file") - if buildFile == "" { - continue - } - buildFile = strings.Replace(buildFile, ":", "/", -1) - files[r.Name()] = filepath.Join(root, buildFile) - } - } - return files, nil -} diff --git a/vendor/github.com/cespare/prettybench/.gitignore b/vendor/github.com/cespare/prettybench/.gitignore deleted file mode 100644 index e7adc042413..00000000000 --- a/vendor/github.com/cespare/prettybench/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/prettybench diff --git a/vendor/github.com/cespare/prettybench/BUILD b/vendor/github.com/cespare/prettybench/BUILD deleted file mode 100644 index 2dd6a282298..00000000000 --- a/vendor/github.com/cespare/prettybench/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") - -go_library( - name = "go_default_library", - srcs = ["prettybench.go"], - importmap = "k8s.io/kubernetes/vendor/github.com/cespare/prettybench", - importpath = "github.com/cespare/prettybench", - visibility = ["//visibility:private"], - deps = ["//vendor/golang.org/x/tools/benchmark/parse:go_default_library"], -) - -go_binary( - name = "prettybench", - embed = [":go_default_library"], - tags = ["manual"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/cespare/prettybench/LICENSE.txt b/vendor/github.com/cespare/prettybench/LICENSE.txt deleted file mode 100644 index 7d8244a5f9d..00000000000 --- a/vendor/github.com/cespare/prettybench/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2014 Caleb Spare - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/cespare/prettybench/README.md b/vendor/github.com/cespare/prettybench/README.md deleted file mode 100644 index e9f96dff562..00000000000 --- a/vendor/github.com/cespare/prettybench/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Prettybench - -A tool for transforming `go test`'s benchmark output a bit to make it nicer for humans. - -## Problem - -Go benchmarks are great, particularly when used in concert with benchcmp. But the output can be a bit hard to -read: - -![before](/screenshots/before.png) - -## Solution - - $ go get github.com/cespare/prettybench - $ go test -bench=. | prettybench - -![after](/screenshots/after.png) - -* Column headers -* Columns are aligned -* Time output is adjusted to convenient units - -## Notes - -* Right now the units for the time are chosen based on the smallest value in the column. -* Prettybench has to buffer all the rows of output before it can print them (for column formatting), so you - won't see intermediate progress. If you want to see that too, you could tee your output so that you see the - unmodified version as well. If you do this, you'll want to use the prettybench's `-no-passthrough` flag so - it doesn't print all the other lines (because then they'd be printed twice): - - $ go test -bench=. | tee >(prettybench -no-passthrough) - -## To Do (maybe) - -* Handle benchcmp output -* Change the units for non-time columns as well (these are generally OK though). diff --git a/vendor/github.com/cespare/prettybench/prettybench.go b/vendor/github.com/cespare/prettybench/prettybench.go deleted file mode 100644 index 01d7bc9ed53..00000000000 --- a/vendor/github.com/cespare/prettybench/prettybench.go +++ /dev/null @@ -1,198 +0,0 @@ -package main - -import ( - "bufio" - "bytes" - "errors" - "flag" - "fmt" - "os" - "regexp" - "strconv" - "strings" - "time" - - bench "golang.org/x/tools/benchmark/parse" -) - -var noPassthrough = flag.Bool("no-passthrough", false, "Don't print non-benchmark lines") - -type BenchOutputGroup struct { - Lines []*bench.Benchmark - // Columns which are in use - Measured int -} - -type Table struct { - MaxLengths []int - Cells [][]string -} - -func (g *BenchOutputGroup) String() string { - if len(g.Lines) == 0 { - return "" - } - columnNames := []string{"benchmark", "iter", "time/iter"} - if (g.Measured & bench.MBPerS) > 0 { - columnNames = append(columnNames, "throughput") - } - if (g.Measured & bench.AllocedBytesPerOp) > 0 { - columnNames = append(columnNames, "bytes alloc") - } - if (g.Measured & bench.AllocsPerOp) > 0 { - columnNames = append(columnNames, "allocs") - } - table := &Table{Cells: [][]string{columnNames}} - - var underlines []string - for _, name := range columnNames { - underlines = append(underlines, strings.Repeat("-", len(name))) - } - table.Cells = append(table.Cells, underlines) - timeFormatFunc := g.TimeFormatFunc() - - for _, line := range g.Lines { - row := []string{line.Name, FormatIterations(line.N), timeFormatFunc(line.NsPerOp)} - if (g.Measured & bench.MBPerS) > 0 { - row = append(row, FormatMegaBytesPerSecond(line)) - } - if (g.Measured & bench.AllocedBytesPerOp) > 0 { - row = append(row, FormatBytesAllocPerOp(line)) - } - if (g.Measured & bench.AllocsPerOp) > 0 { - row = append(row, FormatAllocsPerOp(line)) - } - table.Cells = append(table.Cells, row) - } - for i := range columnNames { - maxLength := 0 - for _, row := range table.Cells { - if len(row[i]) > maxLength { - maxLength = len(row[i]) - } - } - table.MaxLengths = append(table.MaxLengths, maxLength) - } - var buf bytes.Buffer - for _, row := range table.Cells { - for i, cell := range row { - var format string - switch i { - case 0: - format = "%%-%ds " - case len(row) - 1: - format = "%%%ds" - default: - format = "%%%ds " - } - fmt.Fprintf(&buf, fmt.Sprintf(format, table.MaxLengths[i]), cell) - } - fmt.Fprint(&buf, "\n") - } - return buf.String() -} - -func FormatIterations(iter int) string { - return strconv.FormatInt(int64(iter), 10) -} - -func (g *BenchOutputGroup) TimeFormatFunc() func(float64) string { - // Find the smallest time - smallest := g.Lines[0].NsPerOp - for _, line := range g.Lines[1:] { - if line.NsPerOp < smallest { - smallest = line.NsPerOp - } - } - switch { - case smallest < float64(10000*time.Nanosecond): - return func(ns float64) string { - return fmt.Sprintf("%.2f ns/op", ns) - } - case smallest < float64(time.Millisecond): - return func(ns float64) string { - return fmt.Sprintf("%.2f μs/op", ns/1000) - } - case smallest < float64(10*time.Second): - return func(ns float64) string { - return fmt.Sprintf("%.2f ms/op", (ns / 1e6)) - } - default: - return func(ns float64) string { - return fmt.Sprintf("%.2f s/op", ns/1e9) - } - } -} - -func FormatMegaBytesPerSecond(l *bench.Benchmark) string { - if (l.Measured & bench.MBPerS) == 0 { - return "" - } - return fmt.Sprintf("%.2f MB/s", l.MBPerS) -} - -func FormatBytesAllocPerOp(l *bench.Benchmark) string { - if (l.Measured & bench.AllocedBytesPerOp) == 0 { - return "" - } - return fmt.Sprintf("%d B/op", l.AllocedBytesPerOp) -} - -func FormatAllocsPerOp(l *bench.Benchmark) string { - if (l.Measured & bench.AllocsPerOp) == 0 { - return "" - } - return fmt.Sprintf("%d allocs/op", l.AllocsPerOp) -} - -func (g *BenchOutputGroup) AddLine(line *bench.Benchmark) { - g.Lines = append(g.Lines, line) - g.Measured |= line.Measured -} - -var ( - benchLineMatcher = regexp.MustCompile(`^Benchmark.*\t.*\d+`) - okLineMatcher = regexp.MustCompile(`^ok\s`) - notBenchLineErr = errors.New("Not a bench line") -) - -func ParseLine(line string) (*bench.Benchmark, error) { - if !benchLineMatcher.MatchString(line) { - return nil, notBenchLineErr - } - fields := strings.Split(line, "\t") - if len(fields) < 3 { - return nil, notBenchLineErr - } - - return bench.ParseLine(line) -} - -func main() { - flag.Parse() - currentBenchmark := &BenchOutputGroup{} - scanner := bufio.NewScanner(os.Stdin) - for scanner.Scan() { - text := scanner.Text() - line, err := ParseLine(text) - switch err { - case notBenchLineErr: - if okLineMatcher.MatchString(text) { - fmt.Print(currentBenchmark) - currentBenchmark = &BenchOutputGroup{} - } - if !*noPassthrough { - fmt.Println(text) - } - case nil: - currentBenchmark.AddLine(line) - default: - fmt.Fprintln(os.Stderr, "prettybench unrecognized line:") - fmt.Println(text) - } - } - if err := scanner.Err(); err != nil { - fmt.Println(err) - os.Exit(1) - } -} diff --git a/vendor/github.com/client9/misspell/.gitignore b/vendor/github.com/client9/misspell/.gitignore deleted file mode 100644 index b1b707e3260..00000000000 --- a/vendor/github.com/client9/misspell/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -dist/ -bin/ -vendor/ - -# editor turds -*~ -*.gz -*.bz2 -*.csv - -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.prof diff --git a/vendor/github.com/client9/misspell/.travis.yml b/vendor/github.com/client9/misspell/.travis.yml deleted file mode 100644 index e63e6c2bdcc..00000000000 --- a/vendor/github.com/client9/misspell/.travis.yml +++ /dev/null @@ -1,20 +0,0 @@ -sudo: required -dist: trusty -group: edge -language: go -go: - - "1.10" -git: - depth: 1 - -script: - - ./scripts/travis.sh - -# calls goreleaser when a new tag is pushed -deploy: -- provider: script - skip_cleanup: true - script: curl -sL http://git.io/goreleaser | bash - on: - tags: true - condition: $TRAVIS_OS_NAME = linux diff --git a/vendor/github.com/client9/misspell/BUILD b/vendor/github.com/client9/misspell/BUILD deleted file mode 100644 index 8b124fca23c..00000000000 --- a/vendor/github.com/client9/misspell/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "ascii.go", - "case.go", - "legal.go", - "mime.go", - "notwords.go", - "replace.go", - "stringreplacer.go", - "url.go", - "words.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/client9/misspell", - importpath = "github.com/client9/misspell", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//vendor/github.com/client9/misspell/cmd/misspell:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/client9/misspell/Dockerfile b/vendor/github.com/client9/misspell/Dockerfile deleted file mode 100644 index b8ea37b4c5a..00000000000 --- a/vendor/github.com/client9/misspell/Dockerfile +++ /dev/null @@ -1,37 +0,0 @@ -FROM golang:1.10.0-alpine - -# cache buster -RUN echo 4 - -# git is needed for "go get" below -RUN apk add --no-cache git make - -# these are my standard testing / linting tools -RUN /bin/true \ - && go get -u github.com/golang/dep/cmd/dep \ - && go get -u github.com/alecthomas/gometalinter \ - && gometalinter --install \ - && rm -rf /go/src /go/pkg -# -# * SCOWL word list -# -# Downloads -# http://wordlist.aspell.net/dicts/ -# --> http://app.aspell.net/create -# - -# use en_US large size -# use regular size for others -ENV SOURCE_US_BIG http://app.aspell.net/create?max_size=70&spelling=US&max_variant=2&diacritic=both&special=hacker&special=roman-numerals&download=wordlist&encoding=utf-8&format=inline - -# should be able tell difference between English variations using this -ENV SOURCE_US http://app.aspell.net/create?max_size=60&spelling=US&max_variant=1&diacritic=both&download=wordlist&encoding=utf-8&format=inline -ENV SOURCE_GB_ISE http://app.aspell.net/create?max_size=60&spelling=GBs&max_variant=2&diacritic=both&download=wordlist&encoding=utf-8&format=inline -ENV SOURCE_GB_IZE http://app.aspell.net/create?max_size=60&spelling=GBz&max_variant=2&diacritic=both&download=wordlist&encoding=utf-8&format=inline -ENV SOURCE_CA http://app.aspell.net/create?max_size=60&spelling=CA&max_variant=2&diacritic=both&download=wordlist&encoding=utf-8&format=inline - -RUN /bin/true \ - && mkdir /scowl-wl \ - && wget -O /scowl-wl/words-US-60.txt ${SOURCE_US} \ - && wget -O /scowl-wl/words-GB-ise-60.txt ${SOURCE_GB_ISE} - diff --git a/vendor/github.com/client9/misspell/Gopkg.lock b/vendor/github.com/client9/misspell/Gopkg.lock deleted file mode 100644 index 90ed45115f9..00000000000 --- a/vendor/github.com/client9/misspell/Gopkg.lock +++ /dev/null @@ -1,24 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - name = "github.com/gobwas/glob" - packages = [ - ".", - "compiler", - "match", - "syntax", - "syntax/ast", - "syntax/lexer", - "util/runes", - "util/strings" - ] - revision = "5ccd90ef52e1e632236f7326478d4faa74f99438" - version = "v0.2.3" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "087ea4c49358ea8258ad9edfe514cd5ce9975c889c258e5ec7b5d2b720aae113" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/client9/misspell/Gopkg.toml b/vendor/github.com/client9/misspell/Gopkg.toml deleted file mode 100644 index e9b8e6a45a9..00000000000 --- a/vendor/github.com/client9/misspell/Gopkg.toml +++ /dev/null @@ -1,34 +0,0 @@ -# Gopkg.toml example -# -# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" -# -# [prune] -# non-go = false -# go-tests = true -# unused-packages = true - - -[[constraint]] - name = "github.com/gobwas/glob" - version = "0.2.3" - -[prune] - go-tests = true - unused-packages = true diff --git a/vendor/github.com/client9/misspell/LICENSE b/vendor/github.com/client9/misspell/LICENSE deleted file mode 100644 index 423e1f9e0f9..00000000000 --- a/vendor/github.com/client9/misspell/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015-2017 Nick Galbreath - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/vendor/github.com/client9/misspell/Makefile b/vendor/github.com/client9/misspell/Makefile deleted file mode 100644 index 862ab77b0d6..00000000000 --- a/vendor/github.com/client9/misspell/Makefile +++ /dev/null @@ -1,74 +0,0 @@ -CONTAINER=nickg/misspell - -install: ## install misspell into GOPATH/bin - go install ./cmd/misspell - -build: hooks ## build and lint misspell - ./scripts/build.sh - -test: ## run all tests - go test . - -# real publishing is done only by travis -publish: ## test goreleaser - ./scripts/goreleaser-dryrun.sh - -# the grep in line 2 is to remove misspellings in the spelling dictionary -# that trigger false positives!! -falsepositives: /scowl-wl - cat /scowl-wl/words-US-60.txt | \ - grep -i -v -E "payed|Tyre|Euclidian|nonoccurence|dependancy|reenforced|accidently|surprize|dependance|idealogy|binominal|causalities|conquerer|withing|casette|analyse|analogue|dialogue|paralyse|catalogue|archaeolog|clarinettist|catalyses|cancell|chisell|ageing|cataloguing" | \ - misspell -debug -error - cat /scowl-wl/words-GB-ise-60.txt | \ - grep -v -E "payed|nonoccurence|withing" | \ - misspell -locale=UK -debug -error -# cat /scowl-wl/words-GB-ize-60.txt | \ -# grep -v -E "withing" | \ -# misspell -debug -error -# cat /scowl-wl/words-CA-60.txt | \ -# grep -v -E "withing" | \ -# misspell -debug -error - -bench: ## run benchmarks - go test -bench '.*' - -clean: ## clean up time - rm -rf dist/ bin/ - go clean ./... - git gc --aggressive - -ci: ## run test like travis-ci does, requires docker - docker run --rm \ - -v $(PWD):/go/src/github.com/client9/misspell \ - -w /go/src/github.com/client9/misspell \ - ${CONTAINER} \ - make build falsepositives - -docker-build: ## build a docker test image - docker build -t ${CONTAINER} . - -docker-pull: ## pull latest test image - docker pull ${CONTAINER} - -docker-console: ## log into the test image - docker run --rm -it \ - -v $(PWD):/go/src/github.com/client9/misspell \ - -w /go/src/github.com/client9/misspell \ - ${CONTAINER} sh - -.git/hooks/pre-commit: scripts/pre-commit.sh - cp -f scripts/pre-commit.sh .git/hooks/pre-commit -.git/hooks/commit-msg: scripts/commit-msg.sh - cp -f scripts/commit-msg.sh .git/hooks/commit-msg -hooks: .git/hooks/pre-commit .git/hooks/commit-msg ## install git precommit hooks - -.PHONY: help ci console docker-build bench - -# https://www.client9.com/self-documenting-makefiles/ -help: - @awk -F ':|##' '/^[^\t].+?:.*?##/ {\ - printf "\033[36m%-30s\033[0m %s\n", $$1, $$NF \ - }' $(MAKEFILE_LIST) -.DEFAULT_GOAL=help -.PHONY=help - diff --git a/vendor/github.com/client9/misspell/README.md b/vendor/github.com/client9/misspell/README.md deleted file mode 100644 index 5b68af04da9..00000000000 --- a/vendor/github.com/client9/misspell/README.md +++ /dev/null @@ -1,424 +0,0 @@ -[![Build Status](https://travis-ci.org/client9/misspell.svg?branch=master)](https://travis-ci.org/client9/misspell) [![Go Report Card](https://goreportcard.com/badge/github.com/client9/misspell)](https://goreportcard.com/report/github.com/client9/misspell) [![GoDoc](https://godoc.org/github.com/client9/misspell?status.svg)](https://godoc.org/github.com/client9/misspell) [![Coverage](http://gocover.io/_badge/github.com/client9/misspell)](http://gocover.io/github.com/client9/misspell) [![license](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](https://raw.githubusercontent.com/client9/misspell/master/LICENSE) - -Correct commonly misspelled English words... quickly. - -### Install - - -If you just want a binary and to start using `misspell`: - -``` -curl -L -o ./install-misspell.sh https://git.io/misspell -sh ./install-misspell.sh -``` - - -Both will install as `./bin/misspell`. You can adjust the download location using the `-b` flag. File a ticket if you want another platform supported. - - -If you use [Go](https://golang.org/), the best way to run `misspell` is by using [gometalinter](#gometalinter). Otherwise, install `misspell` the old-fashioned way: - -``` -go get -u github.com/client9/misspell/cmd/misspell -``` - -and misspell will be in your `GOPATH` - - -Also if you like to live dangerously, one could do - -```bash -curl -L https://git.io/misspell | bash -``` - -### Usage - - -```bash -$ misspell all.html your.txt important.md files.go -your.txt:42:10 found "langauge" a misspelling of "language" - -# ^ file, line, column -``` - -``` -$ misspell -help -Usage of misspell: - -debug - Debug matching, very slow - -error - Exit with 2 if misspelling found - -f string - 'csv', 'sqlite3' or custom Golang template for output - -i string - ignore the following corrections, comma separated - -j int - Number of workers, 0 = number of CPUs - -legal - Show legal information and exit - -locale string - Correct spellings using locale perferances for US or UK. Default is to use a neutral variety of English. Setting locale to US will correct the British spelling of 'colour' to 'color' - -o string - output file or [stderr|stdout|] (default "stdout") - -q Do not emit misspelling output - -source string - Source mode: auto=guess, go=golang source, text=plain or markdown-like text (default "auto") - -w Overwrite file with corrections (default is just to display) -``` - -## FAQ - -* [Automatic Corrections](#correct) -* [Converting UK spellings to US](#locale) -* [Using pipes and stdin](#stdin) -* [Golang special support](#golang) -* [gometalinter support](#gometalinter) -* [CSV Output](#csv) -* [Using SQLite3](#sqlite) -* [Changing output format](#output) -* [Checking a folder recursively](#recursive) -* [Performance](#performance) -* [Known Issues](#issues) -* [Debugging](#debug) -* [False Negatives and missing words](#missing) -* [Origin of Word Lists](#words) -* [Software License](#license) -* [Problem statement](#problem) -* [Other spelling correctors](#others) -* [Other ideas](#otherideas) - - -### How can I make the corrections automatically? - -Just add the `-w` flag! - -``` -$ misspell -w all.html your.txt important.md files.go -your.txt:9:21:corrected "langauge" to "language" - -# ^ File is rewritten only if a misspelling is found -``` - - -### How do I convert British spellings to American (or vice-versa)? - -Add the `-locale US` flag! - -```bash -$ misspell -locale US important.txt -important.txt:10:20 found "colour" a misspelling of "color" -``` - -Add the `-locale UK` flag! - -```bash -$ echo "My favorite color is blue" | misspell -locale UK -stdin:1:3:found "favorite color" a misspelling of "favourite colour" -``` - -Help is appreciated as I'm neither British nor an -expert in the English language. - - -### How do you check an entire folder recursively? - -Just list a directory you'd like to check - -```bash -misspell . -misspell aDirectory anotherDirectory aFile -``` - -You can also run misspell recursively using the following shell tricks: - -```bash -misspell directory/**/* -``` - -or - -```bash -find . -type f | xargs misspell -``` - -You can select a type of file as well. The following examples selects all `.txt` files that are *not* in the `vendor` directory: - -```bash -find . -type f -name '*.txt' | grep -v vendor/ | xargs misspell -error -``` - - -### Can I use pipes or `stdin` for input? - -Yes! - -Print messages to `stderr` only: - -```bash -$ echo "zeebra" | misspell -stdin:1:0:found "zeebra" a misspelling of "zebra" -``` - -Print messages to `stderr`, and corrected text to `stdout`: - -```bash -$ echo "zeebra" | misspell -w -stdin:1:0:corrected "zeebra" to "zebra" -zebra -``` - -Only print the corrected text to `stdout`: - -```bash -$ echo "zeebra" | misspell -w -q -zebra -``` - - -### Are there special rules for golang source files? - -Yes! If the file ends in `.go`, then misspell will only check spelling in -comments. - -If you want to force a file to be checked as a golang source, use `-source=go` -on the command line. Conversely, you can check a golang source as if it were -pure text by using `-source=text`. You might want to do this since many -variable names have misspellings in them! - -### Can I check only-comments in other other programming languages? - -I'm told the using `-source=go` works well for ruby, javascript, java, c and -c++. - -It doesn't work well for python and bash. - - -### Does this work with gometalinter? - -[gometalinter](https://github.com/alecthomas/gometalinter) runs -multiple golang linters. Starting on [2016-06-12](https://github.com/alecthomas/gometalinter/pull/134) -gometalinter supports `misspell` natively but it is disabled by default. - -```bash -# update your copy of gometalinter -go get -u github.com/alecthomas/gometalinter - -# install updates and misspell -gometalinter --install --update -``` - -To use, just enable `misspell` - -``` -gometalinter --enable misspell ./... -``` - -Note that gometalinter only checks golang files, and uses the default options -of `misspell` - -You may wish to run this on your plaintext (.txt) and/or markdown files too. - - - -### How Can I Get CSV Output? - -Using `-f csv`, the output is standard comma-seprated values with headers in the first row. - -``` -misspell -f csv * -file,line,column,typo,corrected -"README.md",9,22,langauge,language -"README.md",47,25,langauge,language -``` - - -### How can I export to SQLite3? - -Using `-f sqlite`, the output is a [sqlite3](https://www.sqlite.org/index.html) dump-file. - -```bash -$ misspell -f sqlite * > /tmp/misspell.sql -$ cat /tmp/misspell.sql - -PRAGMA foreign_keys=OFF; -BEGIN TRANSACTION; -CREATE TABLE misspell( - "file" TEXT, - "line" INTEGER,i - "column" INTEGER,i - "typo" TEXT, - "corrected" TEXT -); -INSERT INTO misspell VALUES("install.txt",202,31,"immediatly","immediately"); -# etc... -COMMIT; -``` - -```bash -$ sqlite3 -init /tmp/misspell.sql :memory: 'select count(*) from misspell' -1 -``` - -With some tricks you can directly pipe output to sqlite3 by using `-init /dev/stdin`: - -``` -misspell -f sqlite * | sqlite3 -init /dev/stdin -column -cmd '.width 60 15' ':memory' \ - 'select substr(file,35),typo,count(*) as count from misspell group by file, typo order by count desc;' -``` - - -### How can I ignore rules? - -Using the `-i "comma,separated,rules"` flag you can specify corrections to ignore. - -For example, if you were to run `misspell -w -error -source=text` against document that contains the string `Guy Finkelshteyn Braswell`, misspell would change the text to `Guy Finkelstheyn Bras well`. You can then -determine the rules to ignore by reverting the change and running the with the `-debug` flag. You can then see -that the corrections were `htey -> they` and `aswell -> as well`. To ignore these two rules, you add `-i "htey,aswell"` to -your command. With debug mode on, you can see it print the corrections, but it will no longer make them. - - -### How can I change the output format? - -Using the `-f template` flag you can pass in a -[golang text template](https://golang.org/pkg/text/template/) to format the output. - -One can use `printf "%q" VALUE` to safely quote a value. - -The default template is compatible with [gometalinter](https://github.com/alecthomas/gometalinter) -``` -{{ .Filename }}:{{ .Line }}:{{ .Column }}:corrected {{ printf "%q" .Original }} to "{{ printf "%q" .Corrected }}" -``` - -To just print probable misspellings: - -``` --f '{{ .Original }}' -``` - - -### What problem does this solve? - -This corrects commonly misspelled English words in computer source -code, and other text-based formats (`.txt`, `.md`, etc). - -It is designed to run quickly so it can be -used as a [pre-commit hook](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks) -with minimal burden on the developer. - -It does not work with binary formats (e.g. Word, etc). - -It is not a complete spell-checking program nor a grammar checker. - - -### What are other misspelling correctors and what's wrong with them? - -Some other misspelling correctors: - -* https://github.com/vlajos/misspell_fixer -* https://github.com/lyda/misspell-check -* https://github.com/lucasdemarchi/codespell - -They all work but had problems that prevented me from using them at scale: - -* slow, all of the above check one misspelling at a time (i.e. linear) using regexps -* not MIT/Apache2 licensed (or equivalent) -* have dependencies that don't work for me (python3, bash, linux sed, etc) -* don't understand American vs. British English and sometimes makes unwelcome "corrections" - -That said, they might be perfect for you and many have more features -than this project! - - -### How fast is it? - -Misspell is easily 100x to 1000x faster than other spelling correctors. You -should be able to check and correct 1000 files in under 250ms. - -This uses the mighty power of golang's -[strings.Replacer](https://golang.org/pkg/strings/#Replacer) which is -a implementation or variation of the -[Aho–Corasick algorithm](https://en.wikipedia.org/wiki/Aho–Corasick_algorithm). -This makes multiple substring matches *simultaneously*. - -In addition this uses multiple CPU cores to work on multiple files. - - -### What problems does it have? - -Unlike the other projects, this doesn't know what a "word" is. There may be -more false positives and false negatives due to this. On the other hand, it -sometimes catches things others don't. - -Either way, please file bugs and we'll fix them! - -Since it operates in parallel to make corrections, it can be non-obvious to -determine exactly what word was corrected. - - -### It's making mistakes. How can I debug? - -Run using `-debug` flag on the file you want. It should then print what word -it is trying to correct. Then [file a -bug](https://github.com/client9/misspell/issues) describing the problem. -Thanks! - - -### Why is it making mistakes or missing items in golang files? - -The matching function is *case-sensitive*, so variable names that are multiple -worlds either in all-upper or all-lower case sometimes can cause false -positives. For instance a variable named `bodyreader` could trigger a false -positive since `yrea` is in the middle that could be corrected to `year`. -Other problems happen if the variable name uses a English contraction that -should use an apostrophe. The best way of fixing this is to use the -[Effective Go naming -conventions](https://golang.org/doc/effective_go.html#mixed-caps) and use -[camelCase](https://en.wikipedia.org/wiki/CamelCase) for variable names. You -can check your code using [golint](https://github.com/golang/lint) - - -### What license is this? - -The main code is [MIT](https://github.com/client9/misspell/blob/master/LICENSE). - -Misspell also makes uses of the Golang standard library and contains a modified version of Golang's [strings.Replacer](https://golang.org/pkg/strings/#Replacer) -which are covered under a [BSD License](https://github.com/golang/go/blob/master/LICENSE). Type `misspell -legal` for more details or see [legal.go](https://github.com/client9/misspell/blob/master/legal.go) - - -### Where do the word lists come from? - -It started with a word list from -[Wikipedia](https://en.wikipedia.org/wiki/Wikipedia:Lists_of_common_misspellings/For_machines). -Unfortunately, this list had to be highly edited as many of the words are -obsolete or based from mistakes on mechanical typewriters (I'm guessing). - -Additional words were added based on actually mistakes seen in -the wild (meaning self-generated). - -Variations of UK and US spellings are based on many sources including: - -* http://www.tysto.com/uk-us-spelling-list.html (with heavy editing, many are incorrect) -* http://www.oxforddictionaries.com/us/words/american-and-british-spelling-american (excellent site but incomplete) -* Diffing US and UK [scowl dictionaries](http://wordlist.aspell.net) - -American English is more accepting of spelling variations than is British -English, so "what is American or not" is subject to opinion. Corrections and help welcome. - - -### What are some other enhancements that could be done? - -Here's some ideas for enhancements: - -*Capitalization of proper nouns* could be done (e.g. weekday and month names, country names, language names) - -*Opinionated US spellings* US English has a number of words with alternate -spellings. Think [adviser vs. -advisor](http://grammarist.com/spelling/adviser-advisor/). While "advisor" is not wrong, the opinionated US -locale would correct "advisor" to "adviser". - -*Versioning* Some type of versioning is needed so reporting mistakes and errors is easier. - -*Feedback* Mistakes would be sent to some server for agregation and feedback review. - -*Contractions and Apostrophes* This would optionally correct "isnt" to -"isn't", etc. diff --git a/vendor/github.com/client9/misspell/RELEASE-HOWTO.md b/vendor/github.com/client9/misspell/RELEASE-HOWTO.md deleted file mode 100644 index 55b52d962e9..00000000000 --- a/vendor/github.com/client9/misspell/RELEASE-HOWTO.md +++ /dev/null @@ -1,38 +0,0 @@ -# Release HOWTO - -since I forget. - - -1. Review existing tags and pick new release number - - ```sh - git tag - ``` - -2. Tag locally - - ```sh - git tag -a v0.1.0 -m "First release" - ``` - - If things get screwed up, delete the tag with - - ```sh - git tag -d v0.1.0 - ``` - -3. Test goreleaser - - TODO: how to install goreleaser - - ```sh - ./scripts/goreleaser-dryrun.sh - ``` - -4. Push - - ```bash - git push origin v0.1.0 - ``` - -5. Verify release and edit notes. See https://github.com/client9/misspell/releases diff --git a/vendor/github.com/client9/misspell/ascii.go b/vendor/github.com/client9/misspell/ascii.go deleted file mode 100644 index 1430718d6a2..00000000000 --- a/vendor/github.com/client9/misspell/ascii.go +++ /dev/null @@ -1,62 +0,0 @@ -package misspell - -// ByteToUpper converts an ascii byte to upper cases -// Uses a branchless algorithm -func ByteToUpper(x byte) byte { - b := byte(0x80) | x - c := b - byte(0x61) - d := ^(b - byte(0x7b)) - e := (c & d) & (^x & 0x7f) - return x - (e >> 2) -} - -// ByteToLower converts an ascii byte to lower case -// uses a branchless algorithm -func ByteToLower(eax byte) byte { - ebx := eax&byte(0x7f) + byte(0x25) - ebx = ebx&byte(0x7f) + byte(0x1a) - ebx = ((ebx & ^eax) >> 2) & byte(0x20) - return eax + ebx -} - -// ByteEqualFold does ascii compare, case insensitive -func ByteEqualFold(a, b byte) bool { - return a == b || ByteToLower(a) == ByteToLower(b) -} - -// StringEqualFold ASCII case-insensitive comparison -// golang toUpper/toLower for both bytes and strings -// appears to be Unicode based which is super slow -// based from https://codereview.appspot.com/5180044/patch/14007/21002 -func StringEqualFold(s1, s2 string) bool { - if len(s1) != len(s2) { - return false - } - for i := 0; i < len(s1); i++ { - c1 := s1[i] - c2 := s2[i] - // c1 & c2 - if c1 != c2 { - c1 |= 'a' - 'A' - c2 |= 'a' - 'A' - if c1 != c2 || c1 < 'a' || c1 > 'z' { - return false - } - } - } - return true -} - -// StringHasPrefixFold is similar to strings.HasPrefix but comparison -// is done ignoring ASCII case. -// / -func StringHasPrefixFold(s1, s2 string) bool { - // prefix is bigger than input --> false - if len(s1) < len(s2) { - return false - } - if len(s1) == len(s2) { - return StringEqualFold(s1, s2) - } - return StringEqualFold(s1[:len(s2)], s2) -} diff --git a/vendor/github.com/client9/misspell/case.go b/vendor/github.com/client9/misspell/case.go deleted file mode 100644 index 2ea3850dfa0..00000000000 --- a/vendor/github.com/client9/misspell/case.go +++ /dev/null @@ -1,59 +0,0 @@ -package misspell - -import ( - "strings" -) - -// WordCase is an enum of various word casing styles -type WordCase int - -// Various WordCase types.. likely to be not correct -const ( - CaseUnknown WordCase = iota - CaseLower - CaseUpper - CaseTitle -) - -// CaseStyle returns what case style a word is in -func CaseStyle(word string) WordCase { - upperCount := 0 - lowerCount := 0 - - // this iterates over RUNES not BYTES - for i := 0; i < len(word); i++ { - ch := word[i] - switch { - case ch >= 'a' && ch <= 'z': - lowerCount++ - case ch >= 'A' && ch <= 'Z': - upperCount++ - } - } - - switch { - case upperCount != 0 && lowerCount == 0: - return CaseUpper - case upperCount == 0 && lowerCount != 0: - return CaseLower - case upperCount == 1 && lowerCount > 0 && word[0] >= 'A' && word[0] <= 'Z': - return CaseTitle - } - return CaseUnknown -} - -// CaseVariations returns -// If AllUpper or First-Letter-Only is upcased: add the all upper case version -// If AllLower, add the original, the title and upcase forms -// If Mixed, return the original, and the all upcase form -// -func CaseVariations(word string, style WordCase) []string { - switch style { - case CaseLower: - return []string{word, strings.ToUpper(word[0:1]) + word[1:], strings.ToUpper(word)} - case CaseUpper: - return []string{strings.ToUpper(word)} - default: - return []string{word, strings.ToUpper(word)} - } -} diff --git a/vendor/github.com/client9/misspell/cmd/misspell/BUILD b/vendor/github.com/client9/misspell/cmd/misspell/BUILD deleted file mode 100644 index dc5bc396918..00000000000 --- a/vendor/github.com/client9/misspell/cmd/misspell/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") - -go_library( - name = "go_default_library", - srcs = ["main.go"], - importmap = "k8s.io/kubernetes/vendor/github.com/client9/misspell/cmd/misspell", - importpath = "github.com/client9/misspell/cmd/misspell", - visibility = ["//visibility:private"], - deps = ["//vendor/github.com/client9/misspell:go_default_library"], -) - -go_binary( - name = "misspell", - embed = [":go_default_library"], - tags = ["manual"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/client9/misspell/cmd/misspell/main.go b/vendor/github.com/client9/misspell/cmd/misspell/main.go deleted file mode 100644 index 174d79d882d..00000000000 --- a/vendor/github.com/client9/misspell/cmd/misspell/main.go +++ /dev/null @@ -1,326 +0,0 @@ -// The misspell command corrects commonly misspelled English words in source files. -package main - -import ( - "bytes" - "flag" - "fmt" - "io" - "io/ioutil" - "log" - "os" - "path/filepath" - "runtime" - "strings" - "text/template" - "time" - - "github.com/client9/misspell" -) - -var ( - defaultWrite *template.Template - defaultRead *template.Template - - stdout *log.Logger - debug *log.Logger - - version = "dev" -) - -const ( - // Note for gometalinter it must be "File:Line:Column: Msg" - // note space beteen ": Msg" - defaultWriteTmpl = `{{ .Filename }}:{{ .Line }}:{{ .Column }}: corrected "{{ .Original }}" to "{{ .Corrected }}"` - defaultReadTmpl = `{{ .Filename }}:{{ .Line }}:{{ .Column }}: "{{ .Original }}" is a misspelling of "{{ .Corrected }}"` - csvTmpl = `{{ printf "%q" .Filename }},{{ .Line }},{{ .Column }},{{ .Original }},{{ .Corrected }}` - csvHeader = `file,line,column,typo,corrected` - sqliteTmpl = `INSERT INTO misspell VALUES({{ printf "%q" .Filename }},{{ .Line }},{{ .Column }},{{ printf "%q" .Original }},{{ printf "%q" .Corrected }});` - sqliteHeader = `PRAGMA foreign_keys=OFF; -BEGIN TRANSACTION; -CREATE TABLE misspell( - "file" TEXT, "line" INTEGER, "column" INTEGER, "typo" TEXT, "corrected" TEXT -);` - sqliteFooter = "COMMIT;" -) - -func worker(writeit bool, r *misspell.Replacer, mode string, files <-chan string, results chan<- int) { - count := 0 - for filename := range files { - orig, err := misspell.ReadTextFile(filename) - if err != nil { - log.Println(err) - continue - } - if len(orig) == 0 { - continue - } - - debug.Printf("Processing %s", filename) - - var updated string - var changes []misspell.Diff - - if mode == "go" { - updated, changes = r.ReplaceGo(orig) - } else { - updated, changes = r.Replace(orig) - } - - if len(changes) == 0 { - continue - } - count += len(changes) - for _, diff := range changes { - // add in filename - diff.Filename = filename - - // output can be done by doing multiple goroutines - // and can clobber os.Stdout. - // - // the log package can be used simultaneously from multiple goroutines - var output bytes.Buffer - if writeit { - defaultWrite.Execute(&output, diff) - } else { - defaultRead.Execute(&output, diff) - } - - // goroutine-safe print to os.Stdout - stdout.Println(output.String()) - } - - if writeit { - ioutil.WriteFile(filename, []byte(updated), 0) - } - } - results <- count -} - -func main() { - t := time.Now() - var ( - workers = flag.Int("j", 0, "Number of workers, 0 = number of CPUs") - writeit = flag.Bool("w", false, "Overwrite file with corrections (default is just to display)") - quietFlag = flag.Bool("q", false, "Do not emit misspelling output") - outFlag = flag.String("o", "stdout", "output file or [stderr|stdout|]") - format = flag.String("f", "", "'csv', 'sqlite3' or custom Golang template for output") - ignores = flag.String("i", "", "ignore the following corrections, comma separated") - locale = flag.String("locale", "", "Correct spellings using locale perferances for US or UK. Default is to use a neutral variety of English. Setting locale to US will correct the British spelling of 'colour' to 'color'") - mode = flag.String("source", "auto", "Source mode: auto=guess, go=golang source, text=plain or markdown-like text") - debugFlag = flag.Bool("debug", false, "Debug matching, very slow") - exitError = flag.Bool("error", false, "Exit with 2 if misspelling found") - showVersion = flag.Bool("v", false, "Show version and exit") - - showLegal = flag.Bool("legal", false, "Show legal information and exit") - ) - flag.Parse() - - if *showVersion { - fmt.Println(version) - return - } - if *showLegal { - fmt.Println(misspell.Legal) - return - } - if *debugFlag { - debug = log.New(os.Stderr, "DEBUG ", 0) - } else { - debug = log.New(ioutil.Discard, "", 0) - } - - r := misspell.Replacer{ - Replacements: misspell.DictMain, - Debug: *debugFlag, - } - // - // Figure out regional variations - // - switch strings.ToUpper(*locale) { - case "": - // nothing - case "US": - r.AddRuleList(misspell.DictAmerican) - case "UK", "GB": - r.AddRuleList(misspell.DictBritish) - case "NZ", "AU", "CA": - log.Fatalf("Help wanted. https://github.com/client9/misspell/issues/6") - default: - log.Fatalf("Unknown locale: %q", *locale) - } - - // - // Stuff to ignore - // - if len(*ignores) > 0 { - r.RemoveRule(strings.Split(*ignores, ",")) - } - - // - // Source input mode - // - switch *mode { - case "auto": - case "go": - case "text": - default: - log.Fatalf("Mode must be one of auto=guess, go=golang source, text=plain or markdown-like text") - } - - // - // Custom output - // - switch { - case *format == "csv": - tmpl := template.Must(template.New("csv").Parse(csvTmpl)) - defaultWrite = tmpl - defaultRead = tmpl - stdout.Println(csvHeader) - case *format == "sqlite" || *format == "sqlite3": - tmpl := template.Must(template.New("sqlite3").Parse(sqliteTmpl)) - defaultWrite = tmpl - defaultRead = tmpl - stdout.Println(sqliteHeader) - case len(*format) > 0: - t, err := template.New("custom").Parse(*format) - if err != nil { - log.Fatalf("Unable to compile log format: %s", err) - } - defaultWrite = t - defaultRead = t - default: // format == "" - defaultWrite = template.Must(template.New("defaultWrite").Parse(defaultWriteTmpl)) - defaultRead = template.Must(template.New("defaultRead").Parse(defaultReadTmpl)) - } - - // we cant't just write to os.Stdout directly since we have multiple goroutine - // all writing at the same time causing broken output. Log is routine safe. - // we see it so it doesn't use a prefix or include a time stamp. - switch { - case *quietFlag || *outFlag == "/dev/null": - stdout = log.New(ioutil.Discard, "", 0) - case *outFlag == "/dev/stderr" || *outFlag == "stderr": - stdout = log.New(os.Stderr, "", 0) - case *outFlag == "/dev/stdout" || *outFlag == "stdout": - stdout = log.New(os.Stdout, "", 0) - case *outFlag == "" || *outFlag == "-": - stdout = log.New(os.Stdout, "", 0) - default: - fo, err := os.Create(*outFlag) - if err != nil { - log.Fatalf("unable to create outfile %q: %s", *outFlag, err) - } - defer fo.Close() - stdout = log.New(fo, "", 0) - } - - // - // Number of Workers / CPU to use - // - if *workers < 0 { - log.Fatalf("-j must >= 0") - } - if *workers == 0 { - *workers = runtime.NumCPU() - } - if *debugFlag { - *workers = 1 - } - - // - // Done with Flags. - // Compile the Replacer and process files - // - r.Compile() - - args := flag.Args() - debug.Printf("initialization complete in %v", time.Since(t)) - - // stdin/stdout - if len(args) == 0 { - // if we are working with pipes/stdin/stdout - // there is no concurrency, so we can directly - // send data to the writers - var fileout io.Writer - var errout io.Writer - switch *writeit { - case true: - // if we ARE writing the corrected stream - // the corrected stream goes to stdout - // and the misspelling errors goes to stderr - // so we can do something like this: - // curl something | misspell -w | gzip > afile.gz - fileout = os.Stdout - errout = os.Stderr - case false: - // if we are not writing out the corrected stream - // then work just like files. Misspelling errors - // are sent to stdout - fileout = ioutil.Discard - errout = os.Stdout - } - count := 0 - next := func(diff misspell.Diff) { - count++ - - // don't even evaluate the output templates - if *quietFlag { - return - } - diff.Filename = "stdin" - if *writeit { - defaultWrite.Execute(errout, diff) - } else { - defaultRead.Execute(errout, diff) - } - errout.Write([]byte{'\n'}) - - } - err := r.ReplaceReader(os.Stdin, fileout, next) - if err != nil { - os.Exit(1) - } - switch *format { - case "sqlite", "sqlite3": - fileout.Write([]byte(sqliteFooter)) - } - if count != 0 && *exitError { - // error - os.Exit(2) - } - return - } - - c := make(chan string, 64) - results := make(chan int, *workers) - - for i := 0; i < *workers; i++ { - go worker(*writeit, &r, *mode, c, results) - } - - for _, filename := range args { - filepath.Walk(filename, func(path string, info os.FileInfo, err error) error { - if err == nil && !info.IsDir() { - c <- path - } - return nil - }) - } - close(c) - - count := 0 - for i := 0; i < *workers; i++ { - changed := <-results - count += changed - } - - switch *format { - case "sqlite", "sqlite3": - stdout.Println(sqliteFooter) - } - - if count != 0 && *exitError { - os.Exit(2) - } -} diff --git a/vendor/github.com/client9/misspell/goreleaser.yml b/vendor/github.com/client9/misspell/goreleaser.yml deleted file mode 100644 index 560cb3810c4..00000000000 --- a/vendor/github.com/client9/misspell/goreleaser.yml +++ /dev/null @@ -1,38 +0,0 @@ -# goreleaser.yml -# https://github.com/goreleaser/goreleaser - -project_name: misspell - -builds: - - - main: cmd/misspell/main.go - binary: misspell - ldflags: -s -w -X main.version={{.Version}} - goos: - - darwin - - linux - - windows - goarch: - - amd64 - env: - - CGO_ENABLED=0 - ignore: - - goos: darwin - goarch: 386 - - goos: windows - goarch: 386 - -archive: - name_template: "{{ .Binary }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}" - replacements: - amd64: 64bit - 386: 32bit - darwin: mac - files: - - none* - -checksum: - name_template: "{{ .ProjectName }}_{{ .Version }}_checksums.txt" - -snapshot: - name_template: "SNAPSHOT-{{.Commit}}" diff --git a/vendor/github.com/client9/misspell/install-misspell.sh b/vendor/github.com/client9/misspell/install-misspell.sh deleted file mode 100644 index 8e0ff5d9470..00000000000 --- a/vendor/github.com/client9/misspell/install-misspell.sh +++ /dev/null @@ -1,318 +0,0 @@ -#!/bin/sh -set -e -# Code generated by godownloader. DO NOT EDIT. -# - -usage() { - this=$1 - cat </dev/null -} -uname_os() { - os=$(uname -s | tr '[:upper:]' '[:lower:]') - echo "$os" -} -uname_arch() { - arch=$(uname -m) - case $arch in - x86_64) arch="amd64" ;; - x86) arch="386" ;; - i686) arch="386" ;; - i386) arch="386" ;; - aarch64) arch="arm64" ;; - armv5*) arch="arm5" ;; - armv6*) arch="arm6" ;; - armv7*) arch="arm7" ;; - esac - echo ${arch} -} -uname_os_check() { - os=$(uname_os) - case "$os" in - darwin) return 0 ;; - dragonfly) return 0 ;; - freebsd) return 0 ;; - linux) return 0 ;; - android) return 0 ;; - nacl) return 0 ;; - netbsd) return 0 ;; - openbsd) return 0 ;; - plan9) return 0 ;; - solaris) return 0 ;; - windows) return 0 ;; - esac - echo "$0: uname_os_check: internal error '$(uname -s)' got converted to '$os' which is not a GOOS value. Please file bug at https://github.com/client9/shlib" - return 1 -} -uname_arch_check() { - arch=$(uname_arch) - case "$arch" in - 386) return 0 ;; - amd64) return 0 ;; - arm64) return 0 ;; - armv5) return 0 ;; - armv6) return 0 ;; - armv7) return 0 ;; - ppc64) return 0 ;; - ppc64le) return 0 ;; - mips) return 0 ;; - mipsle) return 0 ;; - mips64) return 0 ;; - mips64le) return 0 ;; - s390x) return 0 ;; - amd64p32) return 0 ;; - esac - echo "$0: uname_arch_check: internal error '$(uname -m)' got converted to '$arch' which is not a GOARCH value. Please file bug report at https://github.com/client9/shlib" - return 1 -} -untar() { - tarball=$1 - case "${tarball}" in - *.tar.gz | *.tgz) tar -xzf "${tarball}" ;; - *.tar) tar -xf "${tarball}" ;; - *.zip) unzip "${tarball}" ;; - *) - echo "Unknown archive format for ${tarball}" - return 1 - ;; - esac -} -mktmpdir() { - test -z "$TMPDIR" && TMPDIR="$(mktemp -d)" - mkdir -p "${TMPDIR}" - echo "${TMPDIR}" -} -http_download() { - local_file=$1 - source_url=$2 - header=$3 - headerflag='' - destflag='' - if is_command curl; then - cmd='curl --fail -sSL' - destflag='-o' - headerflag='-H' - elif is_command wget; then - cmd='wget -q' - destflag='-O' - headerflag='--header' - else - echo "http_download: unable to find wget or curl" - return 1 - fi - if [ -z "$header" ]; then - $cmd $destflag "$local_file" "$source_url" - else - $cmd $headerflag "$header" $destflag "$local_file" "$source_url" - fi -} -github_api() { - local_file=$1 - source_url=$2 - header="" - case "$source_url" in - https://api.github.com*) - test -z "$GITHUB_TOKEN" || header="Authorization: token $GITHUB_TOKEN" - ;; - esac - http_download "$local_file" "$source_url" "$header" -} -github_last_release() { - owner_repo=$1 - giturl="https://api.github.com/repos/${owner_repo}/releases/latest" - html=$(github_api - "$giturl") - version=$(echo "$html" | grep -m 1 "\"tag_name\":" | cut -f4 -d'"') - test -z "$version" && return 1 - echo "$version" -} -hash_sha256() { - TARGET=${1:-/dev/stdin} - if is_command gsha256sum; then - hash=$(gsha256sum "$TARGET") || return 1 - echo "$hash" | cut -d ' ' -f 1 - elif is_command sha256sum; then - hash=$(sha256sum "$TARGET") || return 1 - echo "$hash" | cut -d ' ' -f 1 - elif is_command shasum; then - hash=$(shasum -a 256 "$TARGET" 2>/dev/null) || return 1 - echo "$hash" | cut -d ' ' -f 1 - elif is_command openssl; then - hash=$(openssl -dst openssl dgst -sha256 "$TARGET") || return 1 - echo "$hash" | cut -d ' ' -f a - else - echo "hash_sha256: unable to find command to compute sha-256 hash" - return 1 - fi -} -hash_sha256_verify() { - TARGET=$1 - checksums=$2 - if [ -z "$checksums" ]; then - echo "hash_sha256_verify: checksum file not specified in arg2" - return 1 - fi - BASENAME=${TARGET##*/} - want=$(grep "${BASENAME}" "${checksums}" 2>/dev/null | tr '\t' ' ' | cut -d ' ' -f 1) - if [ -z "$want" ]; then - echo "hash_sha256_verify: unable to find checksum for '${TARGET}' in '${checksums}'" - return 1 - fi - got=$(hash_sha256 "$TARGET") - if [ "$want" != "$got" ]; then - echo "hash_sha256_verify: checksum for '$TARGET' did not verify ${want} vs $got" - return 1 - fi -} -cat /dev/null < 50000 { - fin, err := os.Open(filename) - if err != nil { - return "", fmt.Errorf("Unable to open large file %q: %s", filename, err) - } - defer fin.Close() - buf := make([]byte, 512) - _, err = io.ReadFull(fin, buf) - if err != nil { - return "", fmt.Errorf("Unable to read 512 bytes from %q: %s", filename, err) - } - if !isTextFile(buf) { - return "", nil - } - - // set so we don't double check this file - isText = true - } - - // read in whole file - raw, err := ioutil.ReadFile(filename) - if err != nil { - return "", fmt.Errorf("Unable to read all %q: %s", filename, err) - } - - if !isText && !isTextFile(raw) { - return "", nil - } - return string(raw), nil -} diff --git a/vendor/github.com/client9/misspell/notwords.go b/vendor/github.com/client9/misspell/notwords.go deleted file mode 100644 index 06d0d5a5adf..00000000000 --- a/vendor/github.com/client9/misspell/notwords.go +++ /dev/null @@ -1,85 +0,0 @@ -package misspell - -import ( - "bytes" - "regexp" - "strings" -) - -var ( - reEmail = regexp.MustCompile(`[a-zA-Z0-9_.%+-]+@[a-zA-Z0-9-.]+\.[a-zA-Z]{2,6}[^a-zA-Z]`) - reHost = regexp.MustCompile(`[a-zA-Z0-9-.]+\.[a-zA-Z]+`) - reBackslash = regexp.MustCompile(`\\[a-z]`) -) - -// RemovePath attempts to strip away embedded file system paths, e.g. -// /foo/bar or /static/myimg.png -// -// TODO: windows style -// -func RemovePath(s string) string { - out := bytes.Buffer{} - var idx int - for len(s) > 0 { - if idx = strings.IndexByte(s, '/'); idx == -1 { - out.WriteString(s) - break - } - - if idx > 0 { - idx-- - } - - var chclass string - switch s[idx] { - case '/', ' ', '\n', '\t', '\r': - chclass = " \n\r\t" - case '[': - chclass = "]\n" - case '(': - chclass = ")\n" - default: - out.WriteString(s[:idx+2]) - s = s[idx+2:] - continue - } - - endx := strings.IndexAny(s[idx+1:], chclass) - if endx != -1 { - out.WriteString(s[:idx+1]) - out.Write(bytes.Repeat([]byte{' '}, endx)) - s = s[idx+endx+1:] - } else { - out.WriteString(s) - break - } - } - return out.String() -} - -// replaceWithBlanks returns a string with the same number of spaces as the input -func replaceWithBlanks(s string) string { - return strings.Repeat(" ", len(s)) -} - -// RemoveEmail remove email-like strings, e.g. "nickg+junk@xfoobar.com", "nickg@xyz.abc123.biz" -func RemoveEmail(s string) string { - return reEmail.ReplaceAllStringFunc(s, replaceWithBlanks) -} - -// RemoveHost removes host-like strings "foobar.com" "abc123.fo1231.biz" -func RemoveHost(s string) string { - return reHost.ReplaceAllStringFunc(s, replaceWithBlanks) -} - -// RemoveBackslashEscapes removes characters that are preceeded by a backslash -// commonly found in printf format stringd "\nto" -func removeBackslashEscapes(s string) string { - return reBackslash.ReplaceAllStringFunc(s, replaceWithBlanks) -} - -// RemoveNotWords blanks out all the not words -func RemoveNotWords(s string) string { - // do most selective/specific first - return removeBackslashEscapes(RemoveHost(RemoveEmail(RemovePath(StripURL(s))))) -} diff --git a/vendor/github.com/client9/misspell/replace.go b/vendor/github.com/client9/misspell/replace.go deleted file mode 100644 index a99bbcc582a..00000000000 --- a/vendor/github.com/client9/misspell/replace.go +++ /dev/null @@ -1,246 +0,0 @@ -package misspell - -import ( - "bufio" - "bytes" - "io" - "regexp" - "strings" - "text/scanner" -) - -func max(x, y int) int { - if x > y { - return x - } - return y -} - -func inArray(haystack []string, needle string) bool { - for _, word := range haystack { - if needle == word { - return true - } - } - return false -} - -var wordRegexp = regexp.MustCompile(`[a-zA-Z0-9']+`) - -// Diff is datastructure showing what changed in a single line -type Diff struct { - Filename string - FullLine string - Line int - Column int - Original string - Corrected string -} - -// Replacer is the main struct for spelling correction -type Replacer struct { - Replacements []string - Debug bool - engine *StringReplacer - corrected map[string]string -} - -// New creates a new default Replacer using the main rule list -func New() *Replacer { - r := Replacer{ - Replacements: DictMain, - } - r.Compile() - return &r -} - -// RemoveRule deletes existings rules. -// TODO: make inplace to save memory -func (r *Replacer) RemoveRule(ignore []string) { - newwords := make([]string, 0, len(r.Replacements)) - for i := 0; i < len(r.Replacements); i += 2 { - if inArray(ignore, r.Replacements[i]) { - continue - } - newwords = append(newwords, r.Replacements[i:i+2]...) - } - r.engine = nil - r.Replacements = newwords -} - -// AddRuleList appends new rules. -// Input is in the same form as Strings.Replacer: [ old1, new1, old2, new2, ....] -// Note: does not check for duplictes -func (r *Replacer) AddRuleList(additions []string) { - r.engine = nil - r.Replacements = append(r.Replacements, additions...) -} - -// Compile compiles the rules. Required before using the Replace functions -func (r *Replacer) Compile() { - - r.corrected = make(map[string]string, len(r.Replacements)/2) - for i := 0; i < len(r.Replacements); i += 2 { - r.corrected[r.Replacements[i]] = r.Replacements[i+1] - } - r.engine = NewStringReplacer(r.Replacements...) -} - -/* -line1 and line2 are different -extract words from each line1 - -replace word -> newword -if word == new-word - continue -if new-word in list of replacements - continue -new word not original, and not in list of replacements - some substring got mixed up. UNdo -*/ -func (r *Replacer) recheckLine(s string, lineNum int, buf io.Writer, next func(Diff)) { - first := 0 - redacted := RemoveNotWords(s) - - idx := wordRegexp.FindAllStringIndex(redacted, -1) - for _, ab := range idx { - word := s[ab[0]:ab[1]] - newword := r.engine.Replace(word) - if newword == word { - // no replacement done - continue - } - - // ignore camelCase words - // https://github.com/client9/misspell/issues/113 - if CaseStyle(word) == CaseUnknown { - continue - } - - if StringEqualFold(r.corrected[strings.ToLower(word)], newword) { - // word got corrected into something we know - io.WriteString(buf, s[first:ab[0]]) - io.WriteString(buf, newword) - first = ab[1] - next(Diff{ - FullLine: s, - Line: lineNum, - Original: word, - Corrected: newword, - Column: ab[0], - }) - continue - } - // Word got corrected into something unknown. Ignore it - } - io.WriteString(buf, s[first:]) -} - -// ReplaceGo is a specialized routine for correcting Golang source -// files. Currently only checks comments, not identifiers for -// spelling. -func (r *Replacer) ReplaceGo(input string) (string, []Diff) { - var s scanner.Scanner - s.Init(strings.NewReader(input)) - s.Mode = scanner.ScanIdents | scanner.ScanFloats | scanner.ScanChars | scanner.ScanStrings | scanner.ScanRawStrings | scanner.ScanComments - lastPos := 0 - output := "" -Loop: - for { - switch s.Scan() { - case scanner.Comment: - origComment := s.TokenText() - newComment := r.engine.Replace(origComment) - - if origComment != newComment { - // s.Pos().Offset is the end of the current token - // subtract len(origComment) to get the start of the token - offset := s.Pos().Offset - output = output + input[lastPos:offset-len(origComment)] + newComment - lastPos = offset - } - case scanner.EOF: - break Loop - } - } - - if lastPos == 0 { - // no changes, no copies - return input, nil - } - if lastPos < len(input) { - output = output + input[lastPos:] - } - diffs := make([]Diff, 0, 8) - buf := bytes.NewBuffer(make([]byte, 0, max(len(input), len(output))+100)) - // faster that making a bytes.Buffer and bufio.ReadString - outlines := strings.SplitAfter(output, "\n") - inlines := strings.SplitAfter(input, "\n") - for i := 0; i < len(inlines); i++ { - if inlines[i] == outlines[i] { - buf.WriteString(outlines[i]) - continue - } - r.recheckLine(inlines[i], i+1, buf, func(d Diff) { - diffs = append(diffs, d) - }) - } - - return buf.String(), diffs - -} - -// Replace is corrects misspellings in input, returning corrected version -// along with a list of diffs. -func (r *Replacer) Replace(input string) (string, []Diff) { - output := r.engine.Replace(input) - if input == output { - return input, nil - } - diffs := make([]Diff, 0, 8) - buf := bytes.NewBuffer(make([]byte, 0, max(len(input), len(output))+100)) - // faster that making a bytes.Buffer and bufio.ReadString - outlines := strings.SplitAfter(output, "\n") - inlines := strings.SplitAfter(input, "\n") - for i := 0; i < len(inlines); i++ { - if inlines[i] == outlines[i] { - buf.WriteString(outlines[i]) - continue - } - r.recheckLine(inlines[i], i+1, buf, func(d Diff) { - diffs = append(diffs, d) - }) - } - - return buf.String(), diffs -} - -// ReplaceReader applies spelling corrections to a reader stream. Diffs are -// emitted through a callback. -func (r *Replacer) ReplaceReader(raw io.Reader, w io.Writer, next func(Diff)) error { - var ( - err error - line string - lineNum int - ) - reader := bufio.NewReader(raw) - for err == nil { - lineNum++ - line, err = reader.ReadString('\n') - - // if it's EOF, then line has the last line - // don't like the check of err here and - // in for loop - if err != nil && err != io.EOF { - return err - } - // easily 5x faster than regexp+map - if line == r.engine.Replace(line) { - io.WriteString(w, line) - continue - } - // but it can be inaccurate, so we need to double check - r.recheckLine(line, lineNum, w, next) - } - return nil -} diff --git a/vendor/github.com/client9/misspell/stringreplacer.go b/vendor/github.com/client9/misspell/stringreplacer.go deleted file mode 100644 index 3151eceb70f..00000000000 --- a/vendor/github.com/client9/misspell/stringreplacer.go +++ /dev/null @@ -1,336 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package misspell - -import ( - "io" - // "log" - "strings" -) - -// StringReplacer replaces a list of strings with replacements. -// It is safe for concurrent use by multiple goroutines. -type StringReplacer struct { - r replacer -} - -// replacer is the interface that a replacement algorithm needs to implement. -type replacer interface { - Replace(s string) string - WriteString(w io.Writer, s string) (n int, err error) -} - -// NewStringReplacer returns a new Replacer from a list of old, new string pairs. -// Replacements are performed in order, without overlapping matches. -func NewStringReplacer(oldnew ...string) *StringReplacer { - if len(oldnew)%2 == 1 { - panic("strings.NewReplacer: odd argument count") - } - - return &StringReplacer{r: makeGenericReplacer(oldnew)} -} - -// Replace returns a copy of s with all replacements performed. -func (r *StringReplacer) Replace(s string) string { - return r.r.Replace(s) -} - -// WriteString writes s to w with all replacements performed. -func (r *StringReplacer) WriteString(w io.Writer, s string) (n int, err error) { - return r.r.WriteString(w, s) -} - -// trieNode is a node in a lookup trie for prioritized key/value pairs. Keys -// and values may be empty. For example, the trie containing keys "ax", "ay", -// "bcbc", "x" and "xy" could have eight nodes: -// -// n0 - -// n1 a- -// n2 .x+ -// n3 .y+ -// n4 b- -// n5 .cbc+ -// n6 x+ -// n7 .y+ -// -// n0 is the root node, and its children are n1, n4 and n6; n1's children are -// n2 and n3; n4's child is n5; n6's child is n7. Nodes n0, n1 and n4 (marked -// with a trailing "-") are partial keys, and nodes n2, n3, n5, n6 and n7 -// (marked with a trailing "+") are complete keys. -type trieNode struct { - // value is the value of the trie node's key/value pair. It is empty if - // this node is not a complete key. - value string - // priority is the priority (higher is more important) of the trie node's - // key/value pair; keys are not necessarily matched shortest- or longest- - // first. Priority is positive if this node is a complete key, and zero - // otherwise. In the example above, positive/zero priorities are marked - // with a trailing "+" or "-". - priority int - - // A trie node may have zero, one or more child nodes: - // * if the remaining fields are zero, there are no children. - // * if prefix and next are non-zero, there is one child in next. - // * if table is non-zero, it defines all the children. - // - // Prefixes are preferred over tables when there is one child, but the - // root node always uses a table for lookup efficiency. - - // prefix is the difference in keys between this trie node and the next. - // In the example above, node n4 has prefix "cbc" and n4's next node is n5. - // Node n5 has no children and so has zero prefix, next and table fields. - prefix string - next *trieNode - - // table is a lookup table indexed by the next byte in the key, after - // remapping that byte through genericReplacer.mapping to create a dense - // index. In the example above, the keys only use 'a', 'b', 'c', 'x' and - // 'y', which remap to 0, 1, 2, 3 and 4. All other bytes remap to 5, and - // genericReplacer.tableSize will be 5. Node n0's table will be - // []*trieNode{ 0:n1, 1:n4, 3:n6 }, where the 0, 1 and 3 are the remapped - // 'a', 'b' and 'x'. - table []*trieNode -} - -func (t *trieNode) add(key, val string, priority int, r *genericReplacer) { - if key == "" { - if t.priority == 0 { - t.value = val - t.priority = priority - } - return - } - - if t.prefix != "" { - // Need to split the prefix among multiple nodes. - var n int // length of the longest common prefix - for ; n < len(t.prefix) && n < len(key); n++ { - if t.prefix[n] != key[n] { - break - } - } - if n == len(t.prefix) { - t.next.add(key[n:], val, priority, r) - } else if n == 0 { - // First byte differs, start a new lookup table here. Looking up - // what is currently t.prefix[0] will lead to prefixNode, and - // looking up key[0] will lead to keyNode. - var prefixNode *trieNode - if len(t.prefix) == 1 { - prefixNode = t.next - } else { - prefixNode = &trieNode{ - prefix: t.prefix[1:], - next: t.next, - } - } - keyNode := new(trieNode) - t.table = make([]*trieNode, r.tableSize) - t.table[r.mapping[t.prefix[0]]] = prefixNode - t.table[r.mapping[key[0]]] = keyNode - t.prefix = "" - t.next = nil - keyNode.add(key[1:], val, priority, r) - } else { - // Insert new node after the common section of the prefix. - next := &trieNode{ - prefix: t.prefix[n:], - next: t.next, - } - t.prefix = t.prefix[:n] - t.next = next - next.add(key[n:], val, priority, r) - } - } else if t.table != nil { - // Insert into existing table. - m := r.mapping[key[0]] - if t.table[m] == nil { - t.table[m] = new(trieNode) - } - t.table[m].add(key[1:], val, priority, r) - } else { - t.prefix = key - t.next = new(trieNode) - t.next.add("", val, priority, r) - } -} - -func (r *genericReplacer) lookup(s string, ignoreRoot bool) (val string, keylen int, found bool) { - // Iterate down the trie to the end, and grab the value and keylen with - // the highest priority. - bestPriority := 0 - node := &r.root - n := 0 - for node != nil { - if node.priority > bestPriority && !(ignoreRoot && node == &r.root) { - bestPriority = node.priority - val = node.value - keylen = n - found = true - } - - if s == "" { - break - } - if node.table != nil { - index := r.mapping[ByteToLower(s[0])] - if int(index) == r.tableSize { - break - } - node = node.table[index] - s = s[1:] - n++ - } else if node.prefix != "" && StringHasPrefixFold(s, node.prefix) { - n += len(node.prefix) - s = s[len(node.prefix):] - node = node.next - } else { - break - } - } - return -} - -// genericReplacer is the fully generic algorithm. -// It's used as a fallback when nothing faster can be used. -type genericReplacer struct { - root trieNode - // tableSize is the size of a trie node's lookup table. It is the number - // of unique key bytes. - tableSize int - // mapping maps from key bytes to a dense index for trieNode.table. - mapping [256]byte -} - -func makeGenericReplacer(oldnew []string) *genericReplacer { - r := new(genericReplacer) - // Find each byte used, then assign them each an index. - for i := 0; i < len(oldnew); i += 2 { - key := strings.ToLower(oldnew[i]) - for j := 0; j < len(key); j++ { - r.mapping[key[j]] = 1 - } - } - - for _, b := range r.mapping { - r.tableSize += int(b) - } - - var index byte - for i, b := range r.mapping { - if b == 0 { - r.mapping[i] = byte(r.tableSize) - } else { - r.mapping[i] = index - index++ - } - } - // Ensure root node uses a lookup table (for performance). - r.root.table = make([]*trieNode, r.tableSize) - - for i := 0; i < len(oldnew); i += 2 { - r.root.add(strings.ToLower(oldnew[i]), oldnew[i+1], len(oldnew)-i, r) - } - return r -} - -type appendSliceWriter []byte - -// Write writes to the buffer to satisfy io.Writer. -func (w *appendSliceWriter) Write(p []byte) (int, error) { - *w = append(*w, p...) - return len(p), nil -} - -// WriteString writes to the buffer without string->[]byte->string allocations. -func (w *appendSliceWriter) WriteString(s string) (int, error) { - *w = append(*w, s...) - return len(s), nil -} - -type stringWriterIface interface { - WriteString(string) (int, error) -} - -type stringWriter struct { - w io.Writer -} - -func (w stringWriter) WriteString(s string) (int, error) { - return w.w.Write([]byte(s)) -} - -func getStringWriter(w io.Writer) stringWriterIface { - sw, ok := w.(stringWriterIface) - if !ok { - sw = stringWriter{w} - } - return sw -} - -func (r *genericReplacer) Replace(s string) string { - buf := make(appendSliceWriter, 0, len(s)) - r.WriteString(&buf, s) - return string(buf) -} - -func (r *genericReplacer) WriteString(w io.Writer, s string) (n int, err error) { - sw := getStringWriter(w) - var last, wn int - var prevMatchEmpty bool - for i := 0; i <= len(s); { - // Fast path: s[i] is not a prefix of any pattern. - if i != len(s) && r.root.priority == 0 { - index := int(r.mapping[ByteToLower(s[i])]) - if index == r.tableSize || r.root.table[index] == nil { - i++ - continue - } - } - - // Ignore the empty match iff the previous loop found the empty match. - val, keylen, match := r.lookup(s[i:], prevMatchEmpty) - prevMatchEmpty = match && keylen == 0 - if match { - orig := s[i : i+keylen] - switch CaseStyle(orig) { - case CaseUnknown: - // pretend we didn't match - // i++ - // continue - case CaseUpper: - val = strings.ToUpper(val) - case CaseLower: - val = strings.ToLower(val) - case CaseTitle: - if len(val) < 2 { - val = strings.ToUpper(val) - } else { - val = strings.ToUpper(val[:1]) + strings.ToLower(val[1:]) - } - } - wn, err = sw.WriteString(s[last:i]) - n += wn - if err != nil { - return - } - //log.Printf("%d: Going to correct %q with %q", i, s[i:i+keylen], val) - wn, err = sw.WriteString(val) - n += wn - if err != nil { - return - } - i += keylen - last = i - continue - } - i++ - } - if last != len(s) { - wn, err = sw.WriteString(s[last:]) - n += wn - } - return -} diff --git a/vendor/github.com/client9/misspell/stringreplacer_test.gox b/vendor/github.com/client9/misspell/stringreplacer_test.gox deleted file mode 100644 index 70da997f6e0..00000000000 --- a/vendor/github.com/client9/misspell/stringreplacer_test.gox +++ /dev/null @@ -1,421 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package misspell_test - -import ( - "bytes" - "fmt" - "strings" - "testing" - - . "github.com/client9/misspell" -) - -var htmlEscaper = NewStringReplacer( - "&", "&", - "<", "<", - ">", ">", - `"`, """, - "'", "'", -) - -var htmlUnescaper = NewStringReplacer( - "&", "&", - "<", "<", - ">", ">", - """, `"`, - "'", "'", -) - -// The http package's old HTML escaping function. -func oldHTMLEscape(s string) string { - s = strings.Replace(s, "&", "&", -1) - s = strings.Replace(s, "<", "<", -1) - s = strings.Replace(s, ">", ">", -1) - s = strings.Replace(s, `"`, """, -1) - s = strings.Replace(s, "'", "'", -1) - return s -} - -var capitalLetters = NewStringReplacer("a", "A", "b", "B") - -// TestReplacer tests the replacer implementations. -func TestReplacer(t *testing.T) { - type testCase struct { - r *StringReplacer - in, out string - } - var testCases []testCase - - // str converts 0xff to "\xff". This isn't just string(b) since that converts to UTF-8. - str := func(b byte) string { - return string([]byte{b}) - } - var s []string - - // inc maps "\x00"->"\x01", ..., "a"->"b", "b"->"c", ..., "\xff"->"\x00". - for i := 0; i < 256; i++ { - s = append(s, str(byte(i)), str(byte(i+1))) - } - inc := NewStringReplacer(s...) - - // Test cases with 1-byte old strings, 1-byte new strings. - testCases = append(testCases, - testCase{capitalLetters, "brad", "BrAd"}, - testCase{capitalLetters, strings.Repeat("a", (32<<10)+123), strings.Repeat("A", (32<<10)+123)}, - testCase{capitalLetters, "", ""}, - - testCase{inc, "brad", "csbe"}, - testCase{inc, "\x00\xff", "\x01\x00"}, - testCase{inc, "", ""}, - - testCase{NewStringReplacer("a", "1", "a", "2"), "brad", "br1d"}, - ) - - // repeat maps "a"->"a", "b"->"bb", "c"->"ccc", ... - s = nil - for i := 0; i < 256; i++ { - n := i + 1 - 'a' - if n < 1 { - n = 1 - } - s = append(s, str(byte(i)), strings.Repeat(str(byte(i)), n)) - } - repeat := NewStringReplacer(s...) - - // Test cases with 1-byte old strings, variable length new strings. - testCases = append(testCases, - testCase{htmlEscaper, "No changes", "No changes"}, - testCase{htmlEscaper, "I <3 escaping & stuff", "I <3 escaping & stuff"}, - testCase{htmlEscaper, "&&&", "&&&"}, - testCase{htmlEscaper, "", ""}, - - testCase{repeat, "brad", "bbrrrrrrrrrrrrrrrrrradddd"}, - testCase{repeat, "abba", "abbbba"}, - testCase{repeat, "", ""}, - - testCase{NewStringReplacer("a", "11", "a", "22"), "brad", "br11d"}, - ) - - // The remaining test cases have variable length old strings. - - testCases = append(testCases, - testCase{htmlUnescaper, "&amp;", "&"}, - testCase{htmlUnescaper, "<b>HTML's neat</b>", "HTML's neat"}, - testCase{htmlUnescaper, "", ""}, - - testCase{NewStringReplacer("a", "1", "a", "2", "xxx", "xxx"), "brad", "br1d"}, - - testCase{NewStringReplacer("a", "1", "aa", "2", "aaa", "3"), "aaaa", "1111"}, - - testCase{NewStringReplacer("aaa", "3", "aa", "2", "a", "1"), "aaaa", "31"}, - ) - - // gen1 has multiple old strings of variable length. There is no - // overall non-empty common prefix, but some pairwise common prefixes. - gen1 := NewStringReplacer( - "aaa", "3[aaa]", - "aa", "2[aa]", - "a", "1[a]", - "i", "i", - "longerst", "most long", - "longer", "medium", - "long", "short", - "xx", "xx", - "x", "X", - "X", "Y", - "Y", "Z", - ) - testCases = append(testCases, - testCase{gen1, "fooaaabar", "foo3[aaa]b1[a]r"}, - testCase{gen1, "long, longerst, longer", "short, most long, medium"}, - testCase{gen1, "xxxxx", "xxxxX"}, - testCase{gen1, "XiX", "YiY"}, - testCase{gen1, "", ""}, - ) - - // gen2 has multiple old strings with no pairwise common prefix. - gen2 := NewStringReplacer( - "roses", "red", - "violets", "blue", - "sugar", "sweet", - ) - testCases = append(testCases, - testCase{gen2, "roses are red, violets are blue...", "red are red, blue are blue..."}, - testCase{gen2, "", ""}, - ) - - // gen3 has multiple old strings with an overall common prefix. - gen3 := NewStringReplacer( - "abracadabra", "poof", - "abracadabrakazam", "splat", - "abraham", "lincoln", - "abrasion", "scrape", - "abraham", "isaac", - ) - testCases = append(testCases, - testCase{gen3, "abracadabrakazam abraham", "poofkazam lincoln"}, - testCase{gen3, "abrasion abracad", "scrape abracad"}, - testCase{gen3, "abba abram abrasive", "abba abram abrasive"}, - testCase{gen3, "", ""}, - ) - - // foo{1,2,3,4} have multiple old strings with an overall common prefix - // and 1- or 2- byte extensions from the common prefix. - foo1 := NewStringReplacer( - "foo1", "A", - "foo2", "B", - "foo3", "C", - ) - foo2 := NewStringReplacer( - "foo1", "A", - "foo2", "B", - "foo31", "C", - "foo32", "D", - ) - foo3 := NewStringReplacer( - "foo11", "A", - "foo12", "B", - "foo31", "C", - "foo32", "D", - ) - foo4 := NewStringReplacer( - "foo12", "B", - "foo32", "D", - ) - testCases = append(testCases, - testCase{foo1, "fofoofoo12foo32oo", "fofooA2C2oo"}, - testCase{foo1, "", ""}, - - testCase{foo2, "fofoofoo12foo32oo", "fofooA2Doo"}, - testCase{foo2, "", ""}, - - testCase{foo3, "fofoofoo12foo32oo", "fofooBDoo"}, - testCase{foo3, "", ""}, - - testCase{foo4, "fofoofoo12foo32oo", "fofooBDoo"}, - testCase{foo4, "", ""}, - ) - - // genAll maps "\x00\x01\x02...\xfe\xff" to "[all]", amongst other things. - allBytes := make([]byte, 256) - for i := range allBytes { - allBytes[i] = byte(i) - } - allString := string(allBytes) - genAll := NewStringReplacer( - allString, "[all]", - "\xff", "[ff]", - "\x00", "[00]", - ) - testCases = append(testCases, - testCase{genAll, allString, "[all]"}, - testCase{genAll, "a\xff" + allString + "\x00", "a[ff][all][00]"}, - testCase{genAll, "", ""}, - ) - - // Test cases with empty old strings. - - blankToX1 := NewStringReplacer("", "X") - blankToX2 := NewStringReplacer("", "X", "", "") - blankHighPriority := NewStringReplacer("", "X", "o", "O") - blankLowPriority := NewStringReplacer("o", "O", "", "X") - blankNoOp1 := NewStringReplacer("", "") - blankNoOp2 := NewStringReplacer("", "", "", "A") - blankFoo := NewStringReplacer("", "X", "foobar", "R", "foobaz", "Z") - testCases = append(testCases, - testCase{blankToX1, "foo", "XfXoXoX"}, - testCase{blankToX1, "", "X"}, - - testCase{blankToX2, "foo", "XfXoXoX"}, - testCase{blankToX2, "", "X"}, - - testCase{blankHighPriority, "oo", "XOXOX"}, - testCase{blankHighPriority, "ii", "XiXiX"}, - testCase{blankHighPriority, "oiio", "XOXiXiXOX"}, - testCase{blankHighPriority, "iooi", "XiXOXOXiX"}, - testCase{blankHighPriority, "", "X"}, - - testCase{blankLowPriority, "oo", "OOX"}, - testCase{blankLowPriority, "ii", "XiXiX"}, - testCase{blankLowPriority, "oiio", "OXiXiOX"}, - testCase{blankLowPriority, "iooi", "XiOOXiX"}, - testCase{blankLowPriority, "", "X"}, - - testCase{blankNoOp1, "foo", "foo"}, - testCase{blankNoOp1, "", ""}, - - testCase{blankNoOp2, "foo", "foo"}, - testCase{blankNoOp2, "", ""}, - - testCase{blankFoo, "foobarfoobaz", "XRXZX"}, - testCase{blankFoo, "foobar-foobaz", "XRX-XZX"}, - testCase{blankFoo, "", "X"}, - ) - - // single string replacer - - abcMatcher := NewStringReplacer("abc", "[match]") - - testCases = append(testCases, - testCase{abcMatcher, "", ""}, - testCase{abcMatcher, "ab", "ab"}, - testCase{abcMatcher, "abc", "[match]"}, - testCase{abcMatcher, "abcd", "[match]d"}, - testCase{abcMatcher, "cabcabcdabca", "c[match][match]d[match]a"}, - ) - - // Issue 6659 cases (more single string replacer) - - noHello := NewStringReplacer("Hello", "") - testCases = append(testCases, - testCase{noHello, "Hello", ""}, - testCase{noHello, "Hellox", "x"}, - testCase{noHello, "xHello", "x"}, - testCase{noHello, "xHellox", "xx"}, - ) - - // No-arg test cases. - - nop := NewStringReplacer() - testCases = append(testCases, - testCase{nop, "abc", "abc"}, - testCase{nop, "", ""}, - ) - - // Run the test cases. - - for i, tc := range testCases { - if s := tc.r.Replace(tc.in); s != tc.out { - t.Errorf("%d. strings.Replace(%q) = %q, want %q", i, tc.in, s, tc.out) - } - var buf bytes.Buffer - n, err := tc.r.WriteString(&buf, tc.in) - if err != nil { - t.Errorf("%d. WriteString: %v", i, err) - continue - } - got := buf.String() - if got != tc.out { - t.Errorf("%d. WriteString(%q) wrote %q, want %q", i, tc.in, got, tc.out) - continue - } - if n != len(tc.out) { - t.Errorf("%d. WriteString(%q) wrote correct string but reported %d bytes; want %d (%q)", - i, tc.in, n, len(tc.out), tc.out) - } - } -} - -type errWriter struct{} - -func (errWriter) Write(p []byte) (n int, err error) { - return 0, fmt.Errorf("unwritable") -} - -func BenchmarkGenericNoMatch(b *testing.B) { - str := strings.Repeat("A", 100) + strings.Repeat("B", 100) - generic := NewStringReplacer("a", "A", "b", "B", "12", "123") // varying lengths forces generic - for i := 0; i < b.N; i++ { - generic.Replace(str) - } -} - -func BenchmarkGenericMatch1(b *testing.B) { - str := strings.Repeat("a", 100) + strings.Repeat("b", 100) - generic := NewStringReplacer("a", "A", "b", "B", "12", "123") - for i := 0; i < b.N; i++ { - generic.Replace(str) - } -} - -func BenchmarkGenericMatch2(b *testing.B) { - str := strings.Repeat("It's <b>HTML</b>!", 100) - for i := 0; i < b.N; i++ { - htmlUnescaper.Replace(str) - } -} - -func benchmarkSingleString(b *testing.B, pattern, text string) { - r := NewStringReplacer(pattern, "[match]") - b.SetBytes(int64(len(text))) - b.ResetTimer() - for i := 0; i < b.N; i++ { - r.Replace(text) - } -} - -func BenchmarkSingleMaxSkipping(b *testing.B) { - benchmarkSingleString(b, strings.Repeat("b", 25), strings.Repeat("a", 10000)) -} - -func BenchmarkSingleLongSuffixFail(b *testing.B) { - benchmarkSingleString(b, "b"+strings.Repeat("a", 500), strings.Repeat("a", 1002)) -} - -func BenchmarkSingleMatch(b *testing.B) { - benchmarkSingleString(b, "abcdef", strings.Repeat("abcdefghijklmno", 1000)) -} - -func BenchmarkByteByteNoMatch(b *testing.B) { - str := strings.Repeat("A", 100) + strings.Repeat("B", 100) - for i := 0; i < b.N; i++ { - capitalLetters.Replace(str) - } -} - -func BenchmarkByteByteMatch(b *testing.B) { - str := strings.Repeat("a", 100) + strings.Repeat("b", 100) - for i := 0; i < b.N; i++ { - capitalLetters.Replace(str) - } -} - -func BenchmarkByteStringMatch(b *testing.B) { - str := "<" + strings.Repeat("a", 99) + strings.Repeat("b", 99) + ">" - for i := 0; i < b.N; i++ { - htmlEscaper.Replace(str) - } -} - -func BenchmarkHTMLEscapeNew(b *testing.B) { - str := "I <3 to escape HTML & other text too." - for i := 0; i < b.N; i++ { - htmlEscaper.Replace(str) - } -} - -func BenchmarkHTMLEscapeOld(b *testing.B) { - str := "I <3 to escape HTML & other text too." - for i := 0; i < b.N; i++ { - oldHTMLEscape(str) - } -} - -func BenchmarkByteStringReplacerWriteString(b *testing.B) { - str := strings.Repeat("I <3 to escape HTML & other text too.", 100) - buf := new(bytes.Buffer) - for i := 0; i < b.N; i++ { - htmlEscaper.WriteString(buf, str) - buf.Reset() - } -} - -func BenchmarkByteReplacerWriteString(b *testing.B) { - str := strings.Repeat("abcdefghijklmnopqrstuvwxyz", 100) - buf := new(bytes.Buffer) - for i := 0; i < b.N; i++ { - capitalLetters.WriteString(buf, str) - buf.Reset() - } -} - -// BenchmarkByteByteReplaces compares byteByteImpl against multiple Replaces. -func BenchmarkByteByteReplaces(b *testing.B) { - str := strings.Repeat("a", 100) + strings.Repeat("b", 100) - for i := 0; i < b.N; i++ { - strings.Replace(strings.Replace(str, "a", "A", -1), "b", "B", -1) - } -} diff --git a/vendor/github.com/client9/misspell/url.go b/vendor/github.com/client9/misspell/url.go deleted file mode 100644 index 1a259f5f99c..00000000000 --- a/vendor/github.com/client9/misspell/url.go +++ /dev/null @@ -1,17 +0,0 @@ -package misspell - -import ( - "regexp" -) - -// Regexp for URL https://mathiasbynens.be/demo/url-regex -// -// original @imme_emosol (54 chars) has trouble with dashes in hostname -// @(https?|ftp)://(-\.)?([^\s/?\.#-]+\.?)+(/[^\s]*)?$@iS -var reURL = regexp.MustCompile(`(?i)(https?|ftp)://(-\.)?([^\s/?\.#]+\.?)+(/[^\s]*)?`) - -// StripURL attemps to replace URLs with blank spaces, e.g. -// "xxx http://foo.com/ yyy -> "xxx yyyy" -func StripURL(s string) string { - return reURL.ReplaceAllStringFunc(s, replaceWithBlanks) -} diff --git a/vendor/github.com/client9/misspell/words.go b/vendor/github.com/client9/misspell/words.go deleted file mode 100644 index c92dd19d040..00000000000 --- a/vendor/github.com/client9/misspell/words.go +++ /dev/null @@ -1,31158 +0,0 @@ -package misspell - -// Code generated automatically. DO NOT EDIT. - -// DictMain is the main rule set, not including locale-specific spellings -var DictMain = []string{ - "differentiatiations", "differentiations", - "disproportionaltely", "disproportionately", - "oversimplificiation", "oversimplification", - "transcendentational", "transcendental", - "anthromorphization", "anthropomorphization", - "disporportionately", "disproportionately", - "dispraportionately", "disproportionately", - "disproportianately", "disproportionately", - "disproportionatley", "disproportionately", - "disproprotionately", "disproportionately", - "fundamentalistisch", "fundamentalists", - "fundamentalistiska", "fundamentalists", - "fundamentalistiske", "fundamentalists", - "fundamentalistiskt", "fundamentalists", - "histocompatability", "histocompatibility", - "microtransacations", "microtransactions", - "microtransacciones", "microtransactions", - "microtransactional", "microtransactions", - "microtransactioned", "microtransactions", - "misunderstandingly", "misunderstandings", - "oversemplification", "oversimplification", - "oversimplifacation", "oversimplification", - "oversimplificaiton", "oversimplification", - "oversimplificating", "oversimplification", - "oversimplyfication", "oversimplification", - "cardiovasculaires", "cardiovascular", - "certificationkits", "certifications", - "counterporductive", "counterproductive", - "coutnerproductive", "counterproductive", - "disporportionatly", "disproportionately", - "disproportiantely", "disproportionately", - "disproportionatly", "disproportionately", - "disproportionnate", "disproportionate", - "disrepresentation", "misrepresentation", - "fundamentalistisk", "fundamentalists", - "incompatabilities", "incompatibilities", - "inconsequentional", "inconsequential", - "indistinguishible", "indistinguishable", - "indistingusihable", "indistinguishable", - "indistinquishable", "indistinguishable", - "indistuingishable", "indistinguishable", - "instatutionalized", "institutionalized", - "institucionalized", "institutionalized", - "institutionilized", "institutionalized", - "instutitionalized", "institutionalized", - "instututionalized", "institutionalized", - "interchangeablely", "interchangeably", - "interchangeablity", "interchangeably", - "intercontinential", "intercontinental", - "micortransactions", "microtransactions", - "microstansactions", "microtransactions", - "microtramsactions", "microtransactions", - "microtranasctions", "microtransactions", - "microtransacitons", "microtransactions", - "microtransacrions", "microtransactions", - "microtransactioms", "microtransactions", - "microtransactiosn", "microtransactions", - "microtranscations", "microtransactions", - "microtrasnactions", "microtransactions", - "mircotransactions", "microtransactions", - "misinterpretating", "misinterpreting", - "misrepresantation", "misrepresentation", - "misrepresentaiton", "misrepresentation", - "misrepresentating", "misrepresenting", - "misunderstantings", "misunderstandings", - "mocrotransactions", "microtransactions", - "oversimplifaction", "oversimplification", - "oversimplificaton", "oversimplification", - "oversimplifiction", "oversimplification", - "responsibillities", "responsibilities", - "unconstitutionnal", "unconstitutional", - "accomplishements", "accomplishments", - "admininistrative", "administrative", - "antidepresssants", "antidepressants", - "architechturally", "architecturally", - "cardiovasculaire", "cardiovascular", - "charactarization", "characterization", - "characterazation", "characterization", - "characterisitics", "characteristics", - "characteristsics", "characteristic", - "characterizarion", "characterization", - "charecterization", "characterization", - "charicterization", "characterization", - "circumstantional", "circumstantial", - "conversationable", "conversational", - "counterprodutive", "counterproductive", - "demonstrationens", "demonstrations", - "deterministische", "deterministic", - "differenciations", "differentiation", - "differentiantion", "differentiation", - "differentiatiors", "differentiation", - "differentitation", "differentiation", - "disperportionate", "disproportionate", - "disporportionate", "disproportionate", - "dispraportionate", "disproportionate", - "disproportianate", "disproportionate", - "disproportionaly", "disproportionately", - "disproprotionate", "disproportionate", - "electromagnectic", "electromagnetic", - "enviornmentalist", "environmentalist", - "environmentality", "environmentally", - "extraordinairily", "extraordinarily", - "extraordinarilly", "extraordinary", - "extraterrestials", "extraterrestrials", - "fundamentalismos", "fundamentalists", - "fundamentalismus", "fundamentalists", - "fundamentalistas", "fundamentalists", - "fundamentalisten", "fundamentalists", - "fundamentalister", "fundamentalists", - "imcomprehensible", "incomprehensible", - "immunosupressant", "immunosuppressant", - "imperfectionists", "imperfections", - "implementaciones", "implementations", - "implementationen", "implementations", - "implementationer", "implementations", - "inappropriatelly", "inappropriately", - "incompatablities", "incompatibilities", - "incompatiblities", "incompatibilities", - "incomprehencible", "incomprehensible", - "incomprehendible", "incomprehensible", - "incomprehenisble", "incomprehensible", - "incomprehensable", "incomprehensible", - "incomprehinsible", "incomprehensible", - "incomprihensible", "incomprehensible", - "inconprehensible", "incomprehensible", - "inconsistentcies", "inconsistencies", - "inconstitutional", "unconstitutional", - "incrompehensible", "incomprehensible", - "indistinguisable", "indistinguishable", - "institutionlized", "institutionalized", - "intellectualiser", "intellectuals", - "intellectualisme", "intellectuals", - "interchangeabley", "interchangeably", - "internationnally", "internationally", - "interpretaciones", "interpretations", - "interpretationen", "interpretations", - "manoeuverability", "maneuverability", - "massachusettians", "massachusetts", - "microtransacions", "microtransactions", - "microtransacting", "microtransactions", - "microtransactios", "microtransactions", - "microtransactons", "microtransactions", - "microtransations", "microtransactions", - "microtranscation", "microtransactions", - "mircotransaction", "microtransactions", - "miscommunciation", "miscommunication", - "miscommunicaiton", "miscommunication", - "miscomunnication", "miscommunication", - "miscummunication", "miscommunication", - "misinterpretated", "misinterpreted", - "misinterpretions", "misinterpreting", - "misinterpretting", "misinterpreting", - "misproportionate", "disproportionate", - "misrepresenation", "misrepresentation", - "misrepresentaion", "misrepresentation", - "misrepresentated", "misrepresented", - "misrepresentatie", "misrepresentation", - "misrepresentativ", "misrepresentation", - "misubderstanding", "misunderstandings", - "misudnerstanding", "misunderstandings", - "misundarstanding", "misunderstandings", - "misunderatanding", "misunderstandings", - "misunderdtanding", "misunderstandings", - "misundersatnding", "misunderstandings", - "misundersranding", "misunderstandings", - "misunderstadings", "misunderstandings", - "misunderstadning", "misunderstandings", - "misunderstamding", "misunderstandings", - "misunderstandigs", "misunderstandings", - "misunderstandimg", "misunderstandings", - "misunderstandind", "misunderstandings", - "misunderstanging", "misunderstandings", - "misunderstanidng", "misunderstandings", - "misunderstanings", "misunderstandings", - "misunderstansing", "misunderstandings", - "misunderstanting", "misunderstandings", - "misunderstending", "misunderstandings", - "misunderstnading", "misunderstandings", - "misunderstsnding", "misunderstandings", - "misunderstunding", "misunderstandings", - "misundertsanding", "misunderstandings", - "misundrestanding", "misunderstandings", - "misunterstanding", "misunderstandings", - "nationalistische", "nationalistic", - "nationalististic", "nationalistic", - "neconstitutional", "unconstitutional", - "notwhithstanding", "notwithstanding", - "objectificiation", "objectification", - "organisationnels", "organisations", - "perpendiculaires", "perpendicular", - "phillosophically", "philosophically", - "preinitalization", "preinitialization", - "prescriptionists", "prescriptions", - "procrastinarting", "procrastinating", - "procrastinationg", "procrastinating", - "procrastinazione", "procrastination", - "professionalisim", "professionalism", - "professionalisme", "professionals", - "professionallism", "professionalism", - "professionnalism", "professionalism", - "programattically", "programmatically", - "proportionallity", "proportionally", - "reaponsibilities", "responsibilities", - "reinitalizations", "reinitializations", - "representaciones", "representations", - "representationen", "representations", - "representationer", "representations", - "repsonsibilities", "responsibilities", - "responcibilities", "responsibilities", - "responisbilities", "responsibilities", - "responsabilities", "responsibilities", - "responsebilities", "responsibilities", - "straightforeward", "straightforward", - "surrepetitiously", "surreptitiously", - "technologicially", "technologically", - "unconditionnally", "unconditionally", - "unconfortability", "discomfort", - "unconstititional", "unconstitutional", - "uncontrollablely", "uncontrollably", - "underestimateing", "underestimating", - "understandablely", "understandably", - "unintentionnally", "unintentionally", - "unsubstantianted", "unsubstantiated", - "unsubstantiative", "unsubstantiated", - "acclimitization", "acclimatization", - "accomplishemnts", "accomplishments", - "accountabillity", "accountability", - "acknolwedgement", "acknowledgement", - "acknoweldgement", "acknowledgement", - "acknowldegement", "acknowledgement", - "acknowlegdement", "acknowledgement", - "administratieve", "administrative", - "administratiors", "administrators", - "administrativne", "administrative", - "aforementionned", "aforementioned", - "anitdepressants", "antidepressants", - "antidepressents", "antidepressants", - "archetecturally", "architecturally", - "associationthis", "associations", - "authobiographic", "autobiographic", - "awknowledgement", "acknowledgement", - "bureaucratische", "bureaucratic", - "cardiovascualar", "cardiovascular", - "carnagie-mellon", "carnegie-mellon", - "carnigie-mellon", "carnegie-mellon", - "celebrationists", "celebrations", - "charactaristics", "characteristics", - "characterisitcs", "characteristics", - "characterisitic", "characteristic", - "characterizaton", "characterization", - "charactersistic", "characteristic", - "charactersitics", "characteristics", - "charactoristics", "characteristics", - "charecteristics", "characteristics", - "comfrontational", "confrontational", - "commuinications", "communications", - "compatabilities", "compatibilities", - "complimentarity", "complimentary", - "compositionwise", "compositions", - "confidenciality", "confidential", - "confidentuality", "confidential", - "confrentational", "confrontational", - "confrontacional", "confrontational", - "conglaturations", "congratulations", - "congradulations", "congratulations", - "congragulations", "congratulations", - "congratualtions", "congratulations", - "congraturations", "congratulations", - "consequentually", "consequently", - "constitutionnal", "constitutional", - "deinitalization", "deinitialization", - "denominationals", "denominations", - "destinationhash", "destinations", - "deterministisch", "deterministic", - "developmentwise", "developments", - "differantiation", "differentiation", - "differenciation", "differentiation", - "differientation", "differentiation", - "discriminatoire", "discriminate", - "discriminatorie", "discriminate", - "disproportiante", "disproportionate", - "disproportinate", "disproportionate", - "elecrtomagnetic", "electromagnetic", - "electormagnetic", "electromagnetic", - "electromagentic", "electromagnetic", - "electromagnatic", "electromagnetic", - "electromangetic", "electromagnetic", - "electromegnetic", "electromagnetic", - "electronagnetic", "electromagnetic", - "enivronmentally", "environmentally", - "entrepreneurers", "entrepreneurs", - "enviornmentally", "environmentally", - "enviromentalist", "environmentalist", - "environemntally", "environmentally", - "envrionmentally", "environmentally", - "evolutionarilly", "evolutionary", - "experementation", "experimentation", - "experimantation", "experimentation", - "experimentacion", "experimentation", - "experimentating", "experimentation", - "experimenterade", "experimented", - "experimintation", "experimentation", - "expirementation", "experimentation", - "extraodrinarily", "extraordinarily", - "extraordinairly", "extraordinarily", - "extraordinarely", "extraordinarily", - "extraordinaryly", "extraordinarily", - "extraterrestial", "extraterrestrial", - "extroardinarily", "extraordinarily", - "fondamentalists", "fundamentalists", - "fundamendalists", "fundamentalists", - "fundamentalisme", "fundamentals", - "fundamentalismo", "fundamentals", - "fundamentalista", "fundamentals", - "fundamentalisti", "fundamentals", - "fundamnetalists", "fundamentalists", - "fundemantalists", "fundamentalists", - "fundimentalists", "fundamentalists", - "fundumentalists", "fundamentalists", - "gongratulations", "congratulations", - "grammaticallity", "grammatically", - "gundamentalists", "fundamentalists", - "idiosynchracies", "idiosyncrasies", - "implementaitons", "implementations", - "implimentations", "implementations", - "inapporpriately", "inappropriately", - "inappropraitely", "inappropriately", - "inappropriatley", "inappropriately", - "incompatability", "incompatibility", - "incompetentence", "incompetence", - "incomprehensibe", "incomprehensible", - "incomprehesible", "incomprehensible", - "inconcequential", "inconsequential", - "inconcistencies", "inconsistencies", - "inconditionally", "unconditionally", - "inconsecuential", "inconsequential", - "inconsequantial", "inconsequential", - "inconsequencial", "inconsequential", - "inconsequentual", "inconsequential", - "inconsiquential", "inconsequential", - "inconsistancies", "inconsistencies", - "inconsistencias", "inconsistencies", - "inconsistensies", "inconsistencies", - "inconsistenties", "inconsistencies", - "independentisme", "independents", - "independentiste", "independents", - "independentness", "independents", - "inexperiencable", "inexperience", - "inplementations", "implementations", - "instantaneoulsy", "instantaneous", - "institutionella", "institutional", - "institutionnels", "institutions", - "instutionalized", "institutionalized", - "insubstantiated", "unsubstantiated", - "interchangabley", "interchangeably", - "interchangebale", "interchangeable", - "intercontinetal", "intercontinental", - "interpertations", "interpretations", - "interpratations", "interpretations", - "interpritations", "interpretations", - "intersectionals", "intersections", - "intrepretations", "interpretations", - "investigationes", "investigations", - "journalistische", "journalistic", - "libertarianisim", "libertarianism", - "libertarianisme", "libertarians", - "libertarianismo", "libertarians", - "libertarianists", "libertarians", - "libertariansism", "libertarianism", - "manisfestations", "manifestations", - "manouverability", "maneuverability", - "manufacturerers", "manufacturers", - "marshmallowiest", "marshmallows", - "marshmallowness", "marshmallows", - "microtransacton", "microtransactions", - "mininterpreting", "misinterpreting", - "miscommuniation", "miscommunication", - "miscommunicatie", "miscommunication", - "miscommuniction", "miscommunication", - "misinterperting", "misinterpreting", - "misinterprating", "misinterpreting", - "misinterprented", "misinterpret", - "misinterprested", "misinterpret", - "misinterpretion", "misinterpreting", - "misinterpretted", "misinterpreted", - "misinterpriting", "misinterpreting", - "misintrepreting", "misinterpreting", - "misrepresention", "misrepresenting", - "misunderstading", "misunderstanding", - "misunderstandig", "misunderstandings", - "misunderstandng", "misunderstandings", - "misunderstaning", "misunderstanding", - "multicultralism", "multiculturalism", - "multinationella", "multinational", - "nationalistisch", "nationalists", - "nationalistisen", "nationalists", - "nationalistiska", "nationalists", - "nationalistiske", "nationalists", - "nationalistiskt", "nationalists", - "nationalistista", "nationalists", - "objectificaiton", "objectification", - "objectivication", "objectification", - "organisationens", "organisations", - "organisationers", "organisations", - "overestimateing", "overestimating", - "paychologically", "psychologically", - "performancetest", "performances", - "performancewise", "performances", - "perpendiculaire", "perpendicular", - "pharamceuticals", "pharmaceutical", - "pharmacueticals", "pharmaceutical", - "philoshopically", "philosophically", - "philosohpically", "philosophically", - "philosophycally", "philosophically", - "phsycologically", "psychologically", - "phychologically", "psychologically", - "phylosophically", "philosophically", - "physcologically", "psychologically", - "precrastination", "procrastination", - "prefessionalism", "professionalism", - "premonasterians", "premonstratensians", - "procastrinating", "procrastinating", - "procastrination", "procrastination", - "procrascinating", "procrastinating", - "procrastenating", "procrastinating", - "procrastiantion", "procrastination", - "procrastibating", "procrastinating", - "procrastibation", "procrastination", - "procrastonating", "procrastinating", - "procrestinating", "procrastinating", - "procrestination", "procrastination", - "professionalsim", "professionalism", - "prograstination", "procrastination", - "progressionists", "progressions", - "progressionwise", "progressions", - "prokrastination", "procrastination", - "proportionallly", "proportionally", - "proscratination", "procrastination", - "pscyhologically", "psychologically", - "pshycologically", "psychologically", - "psichologically", "psychologically", - "psychedelicious", "psychedelics", - "psychedelicness", "psychedelics", - "psycholigically", "psychologically", - "psychopathische", "psychopathic", - "pyschologically", "psychologically", - "racionalization", "rationalization", - "rationalizaiton", "rationalization", - "rationalizating", "rationalization", - "reccomendations", "recommendations", - "recommandations", "recommendations", - "recommondations", "recommendations", - "reinitalization", "reinitialization", - "repersentations", "representations", - "represantations", "representations", - "represantatives", "representatives", - "representatieve", "representative", - "representativas", "representatives", - "representetives", "representatives", - "representitives", "representatives", - "responibilities", "responsibilities", - "responsibilites", "responsibilities", - "responsibilitys", "responsibilities", - "responsibillity", "responsibility", - "responsibilties", "responsibilities", - "responsiblities", "responsibilities", - "ridiculoussness", "ridiculousness", - "saskatchewinian", "saskatchewan", - "satisfactorally", "satisfactory", - "satisfactorilly", "satisfactory", - "schizophreniiic", "schizophrenic", - "sensationalisim", "sensationalism", - "spreadsheeticus", "spreadsheets", - "starightforward", "straightforward", - "straigthforward", "straightforward", - "striaghtforward", "straightforward", - "sustainabillity", "sustainability", - "technoligically", "technologically", - "troubelshooting", "troubleshooting", - "troublehsooting", "troubleshooting", - "troubleshotting", "troubleshooting", - "trustworthyness", "trustworthiness", - "ubsubstantiated", "unsubstantiated", - "unappropriately", "inappropriately", - "uncomfortablely", "uncomfortably", - "uncomfortablity", "uncomfortably", - "unconditionable", "unconditional", - "unconstituional", "unconstitutional", - "uncontitutional", "unconstitutional", - "uncontrollabley", "uncontrollably", - "uncontrollablly", "uncontrollably", - "unconventionnal", "unconventional", - "underastimating", "underestimating", - "underestemating", "underestimating", - "understandabley", "understandably", - "unintensionally", "unintentionally", - "unprofessionnal", "unprofessional", - "unresponsivness", "unresponsive", - "unsibstantiated", "unsubstantiated", - "unsubstanciated", "unsubstantiated", - "unsubstansiated", "unsubstantiated", - "unsusbtantiated", "unsubstantiated", - "untranslateable", "untranslatable", - "vulernabilities", "vulnerabilities", - "vulnarabilities", "vulnerabilities", - "vulnurabilities", "vulnerabilities", - "vunlerabilities", "vulnerabilities", - "vurnerabilities", "vulnerabilities", - "accomplishemnt", "accomplishment", - "accomplishents", "accomplishes", - "acconplishment", "accomplishment", - "acknowledgeing", "acknowledging", - "acknowledgemnt", "acknowledgement", - "acomplishments", "accomplishments", - "administartion", "administration", - "administartors", "administrators", - "administraters", "administrators", - "administratief", "administrative", - "administratiei", "administrative", - "administratior", "administrator", - "administrativo", "administration", - "adminsitration", "administration", - "adminsitrative", "administrative", - "adminsitrators", "administrators", - "affectionatley", "affectionate", - "aforememtioned", "aforementioned", - "aforementioend", "aforementioned", - "alternativelly", "alternatively", - "amministrative", "administrative", - "anitdepressant", "antidepressants", - "approproximate", "approximate", - "approximatelly", "approximately", - "archeaologists", "archeologists", - "architechtures", "architectures", - "architectureal", "architectural", - "architecturial", "architectural", - "assassintation", "assassination", - "authenitcation", "authentication", - "authenticaiton", "authentication", - "authobiography", "autobiography", - "breakthroughts", "breakthroughs", - "bureaucratisch", "bureaucratic", - "calssification", "classification", - "capatilization", "capitalization", - "capitalizacion", "capitalization", - "capitalizaiton", "capitalization", - "capitalizating", "capitalization", - "capitilazation", "capitalization", - "capitolization", "capitalization", - "captialization", "capitalization", - "cardiocascular", "cardiovascular", - "cardiovascualr", "cardiovascular", - "cardiovasuclar", "cardiovascular", - "caridovascular", "cardiovascular", - "cessationalism", "sensationalism", - "cessationalist", "sensationalist", - "charactaristic", "characteristic", - "characterisics", "characteristics", - "characterisitc", "characteristics", - "characteristcs", "characteristics", - "characteritics", "characteristic", - "charactersitic", "characteristics", - "charasteristic", "characteristics", - "charecteristic", "characteristic", - "cheeseburguers", "cheeseburgers", - "cinematagraphy", "cinematography", - "cinematagrophy", "cinematography", - "cinematograhpy", "cinematography", - "cinematogrophy", "cinematography", - "cinematogrpahy", "cinematography", - "cinemetography", "cinematography", - "cinimatography", "cinematography", - "circumstansial", "circumstantial", - "circumstantual", "circumstantial", - "circumstential", "circumstantial", - "circunstantial", "circumstantial", - "classificaiton", "classification", - "coincedentally", "coincidentally", - "coinsidentally", "coincidentally", - "commemmorating", "commemorating", - "communciations", "communications", - "compatablities", "compatibilities", - "compatibillity", "compatibility", - "compatiblities", "compatibilities", - "competitioners", "competitions", - "comphrehensive", "comprehensive", - "computationnal", "computational", - "conciderations", "considerations", - "condescenscion", "condescension", - "condradictions", "contradictions", - "configuartions", "configurations", - "confugurations", "configurations", - "conglaturation", "congratulations", - "congratulatons", "congratulations", - "conicidentally", "coincidentally", - "conifgurations", "configurations", - "conscioussness", "consciousness", - "consentrations", "concentrations", - "consiciousness", "consciousness", - "considerablely", "considerably", - "considerstions", "considerations", - "constititional", "constitutional", - "constitucional", "constitutional", - "contamporaries", "contemporaries", - "contemporaneus", "contemporaneous", - "contraceptivos", "contraceptives", - "contradicitons", "contradictions", - "contradictiong", "contradicting", - "contriceptives", "contraceptives", - "controceptives", "contraceptives", - "controdictions", "contradictions", - "conversacional", "conversational", - "converstaional", "conversational", - "correpsondence", "correspondence", - "correspondants", "correspondents", - "correspondense", "correspondence", - "correspondente", "correspondence", - "corrispondants", "correspondents", - "corrispondence", "correspondence", - "corrospondence", "correspondence", - "costumizations", "customization", - "councidentally", "coincidentally", - "crystalisation", "crystallisation", - "curcumstantial", "circumstantial", - "demenstrations", "demonstrations", - "deminstrations", "demonstrations", - "demonstartions", "demonstrations", - "demonstrativno", "demonstrations", - "demonstrativos", "demonstrations", - "demosntrations", "demonstrations", - "desintegration", "disintegration", - "deterioriating", "deteriorating", - "determinisitic", "deterministic", - "differentiaton", "differentiation", - "disatisfaction", "dissatisfaction", - "discrimanatory", "discriminatory", - "discriminacion", "discrimination", - "discriminitory", "discriminatory", - "disillusionned", "disillusioned", - "diskrimination", "discrimination", - "disproportiate", "disproportionate", - "distingiushing", "distinguishing", - "distingquished", "distinguished", - "distingusihing", "distinguishing", - "distinquishing", "distinguishing", - "distuingishing", "distinguishing", - "dysfunctionnal", "dysfunctional", - "eldistribution", "redistribution", - "electromagnetc", "electromagnetic", - "electromagntic", "electromagnetic", - "endoctrination", "indoctrination", - "enthusiastisch", "enthusiastic", - "entrepreneuers", "entrepreneurs", - "entrepreneures", "entrepreneurs", - "enviormentally", "environmentally", - "enviromentally", "environmentally", - "environmentals", "environments", - "environmentaly", "environmentally", - "experimentaion", "experimentation", - "experimentella", "experimental", - "extraordinairy", "extraordinary", - "extraordinarly", "extraordinary", - "extrordinarily", "extraordinarily", - "fondamentalist", "fundamentalist", - "foreshadowning", "foreshadowing", - "functionallity", "functionality", - "fundamendalist", "fundamentalist", - "fundamentalits", "fundamentalists", - "fundamnetalist", "fundamentalist", - "fundemantalist", "fundamentalist", - "fundimentalist", "fundamentalist", - "fundumentalist", "fundamentalist", - "generalizacion", "generalization", - "generalizating", "generalization", - "generelization", "generalization", - "geographacilly", "geographically", - "geographycally", "geographically", - "geogrpahically", "geographically", - "geopraphically", "geographically", - "goegraphically", "geographically", - "grandchilderen", "grandchildren", - "gravitationnal", "gravitational", - "groubdbreaking", "groundbreaking", - "groudnbreaking", "groundbreaking", - "hallcuinations", "hallucination", - "hallicunations", "hallucinations", - "hallucenations", "hallucinations", - "halluciantions", "hallucinations", - "hallucinaitons", "hallucination", - "hallunications", "hallucinations", - "hallusinations", "hallucinations", - "halluzinations", "hallucinations", - "hellucinations", "hallucinations", - "heterosexuella", "heterosexual", - "hipothetically", "hypothetically", - "homosexuallity", "homosexuality", - "hullucinations", "hallucinations", - "hyopthetically", "hypothetically", - "hypathetically", "hypothetically", - "hypethetically", "hypothetically", - "hypotehtically", "hypothetically", - "hypotethically", "hypothetically", - "identificacion", "identification", - "identificaiton", "identification", - "identificativo", "identification", - "identifikation", "identification", - "imlpementation", "implementations", - "impelmentation", "implementations", - "impersonationg", "impersonating", - "implementacion", "implementation", - "implementaiton", "implementation", - "implementating", "implementation", - "implementatino", "implementations", - "implemetnation", "implementations", - "implimentation", "implementation", - "impossibillity", "impossibility", - "inadvertantely", "inadvertently", - "inappropriatly", "inappropriately", - "inapproprietly", "inappropriately", - "incompatablity", "incompatibility", - "incompatiblity", "incompatibility", - "inconsequental", "inconsequential", - "inconsistentcy", "inconsistency", - "incontrollably", "uncontrollably", - "inconventional", "unconventional", - "inconvienenced", "inconvenience", - "indestrictible", "indestructible", - "indestructuble", "indestructible", - "indetification", "identification", - "indistructible", "indestructible", - "individuallity", "individuality", - "indocrtination", "indoctrination", - "indoctrication", "indoctrination", - "indoktrination", "indoctrination", - "industiralized", "industrialized", - "industrailized", "industrialized", - "industrualized", "industrialized", - "industructible", "indestructible", - "inexplicablely", "inexplicably", - "infrastracture", "infrastructure", - "infrastructuur", "infrastructure", - "infrastrucutre", "infrastructure", - "infrastrukture", "infrastructure", - "infrastrutture", "infrastructure", - "infrasturcture", "infrastructure", - "initalisations", "initialisations", - "initalizations", "initializations", - "inplementation", "implementation", - "inspirationnal", "inspirational", - "instinctivelly", "instinctively", - "institutionale", "institutionalized", - "institutionals", "institutions", - "institutionnal", "institutional", - "intellectualis", "intellectuals", - "intellectualls", "intellectuals", - "intellecutally", "intellectually", - "intercepticons", "interceptions", - "interchangable", "interchangeable", - "interchangably", "interchangeably", - "interchangeble", "interchangeable", - "interchangebly", "interchangeably", - "interlectually", "intellectually", - "internationaal", "international", - "internationaly", "internationally", - "internationnal", "international", - "interpersonnal", "interpersonal", - "interpertation", "interpretation", - "interpratation", "interpretation", - "interpretacion", "interpretation", - "interpretaiton", "interpretations", - "interpretating", "interpretation", - "interpritation", "interpretation", - "interstellaire", "interstellar", - "intillectually", "intellectually", - "intrepretation", "interpretation", - "invesitgations", "investigations", - "investiagtions", "investigations", - "investigatiors", "investigations", - "investigativos", "investigations", - "investigstions", "investigations", - "irrationallity", "irrationally", - "irresponsibile", "irresponsible", - "journalistisch", "journalistic", - "justificativos", "justifications", - "koncentrations", "concentrations", - "liberatrianism", "libertarianism", - "libertarainism", "libertarianism", - "libertariansim", "libertarianism", - "libertarinaism", "libertarianism", - "libertaryanism", "libertarianism", - "libertatianism", "libertarianism", - "liberterianism", "libertarianism", - "libretarianism", "libertarianism", - "manufactureers", "manufactures", - "manufactureras", "manufactures", - "manufacturered", "manufactured", - "manufactureres", "manufacturers", - "manufactureros", "manufactures", - "massachusettes", "massachusetts", - "massachussetts", "massachusetts", - "mataphorically", "metaphorically", - "mathameticians", "mathematicians", - "mathemagically", "mathematically", - "mathematitians", "mathematicians", - "mathemetically", "mathematically", - "mathemeticians", "mathematicians", - "mathimatically", "mathematically", - "mediterainnean", "mediterranean", - "mediterrannean", "mediterranean", - "metaphotically", "metaphorically", - "metephorically", "metaphorically", - "methaporically", "metaphorically", - "metiphorically", "metaphorically", - "metophorically", "metaphorically", - "metropolitaine", "metropolitan", - "misconseptions", "misconceptions", - "misinterperted", "misinterpreted", - "misintrepreted", "misinterpreted", - "mulitnationals", "multinational", - "mulitplication", "multiplication", - "multiplicacion", "multiplication", - "multiplicaiton", "multiplication", - "multiplicativo", "multiplication", - "multiplikation", "multiplication", - "mutlinationals", "multinational", - "mutliplication", "multiplication", - "nationalisitic", "nationalistic", - "nationalistics", "nationalists", - "nationalisties", "nationalists", - "nationalistisk", "nationalists", - "neighbourhoood", "neighbourhood", - "nieghbourhoods", "neighbourhood", - "northereastern", "northeastern", - "objectificaton", "objectification", - "opthalmologist", "ophthalmologist", - "organizacional", "organizational", - "organizaitonal", "organizational", - "organziational", "organizational", - "orginazational", "organizational", - "overestemating", "overestimating", - "overextimating", "overestimating", - "overhwelmingly", "overwhelmingly", - "overhwlemingly", "overwhelmingly", - "overpolulation", "overpopulation", - "overpopluation", "overpopulation", - "oversetimating", "overestimating", - "overshadowered", "overshadowed", - "overwhemlingly", "overwhelmingly", - "overwhlemingly", "overwhelmingly", - "paliamentarian", "parliamentarian", - "parliamentiary", "parliamentary", - "performancepcs", "performances", - "personalitites", "personalities", - "pharamceutical", "pharmaceutical", - "pharmaceudical", "pharmaceutical", - "pharmacuetical", "pharmaceutical", - "pharmaseutical", "pharmaceutical", - "pharmeceutical", "pharmaceutical", - "philosophicaly", "philosophically", - "phramaceutical", "pharmaceutical", - "playthroughers", "playthroughs", - "porportionally", "proportionally", - "practitionners", "practitioners", - "predeterminded", "predetermined", - "predominantely", "predominantly", - "predominantley", "predominantly", - "preinitalizing", "preinitializing", - "prerequisities", "prerequisite", - "procrastinatin", "procrastination", - "procrastinaton", "procrastination", - "professionials", "professionalism", - "professionnals", "professionals", - "profitabillity", "profitability", - "progressivelly", "progressively", - "progressivisme", "progressives", - "pronounciation", "pronunciation", - "proportianally", "proportionally", - "proportionalty", "proportionally", - "proportionella", "proportionally", - "proprotionally", "proportionally", - "protruberances", "protuberances", - "pseudononymous", "pseudonymous", - "psychologicaly", "psychologically", - "qaulifications", "qualification", - "qualifiactions", "qualification", - "qualificaitons", "qualifications", - "quarterbackers", "quarterbacks", - "rationalizaton", "rationalization", - "reaponsibility", "responsibility", - "recommandation", "recommendation", - "recommedations", "recommendations", - "recommondation", "recommendation", - "reconnaissence", "reconnaissance", - "reconstruccion", "reconstruction", - "reconsturction", "reconstruction", - "redistirbution", "redistribution", - "redistribucion", "redistribution", - "redistributivo", "redistribution", - "redistrubition", "redistribution", - "refridgeration", "refrigeration", - "rehabilitacion", "rehabilitation", - "rehabilitaiton", "rehabilitation", - "reinforcemnets", "reinforcements", - "rekommendation", "recommendation", - "rektifications", "certifications", - "reniforcements", "reinforcements", - "repersentation", "representation", - "represantation", "representation", - "represantative", "representative", - "representacion", "representation", - "representaiton", "representations", - "representatief", "representative", - "representating", "representation", - "representativo", "representation", - "representetive", "representative", - "representitive", "representative", - "representstion", "representations", - "representstive", "representatives", - "represetnation", "representations", - "represnetation", "representations", - "reprezentative", "representative", - "repsonsibility", "responsibility", - "resistribution", "redistribution", - "responcibility", "responsibility", - "responisbility", "responsibility", - "responnsibilty", "responsibility", - "responsability", "responsibility", - "responsibilies", "responsibilities", - "responsibities", "responsibilities", - "restaraunteurs", "restaurateurs", - "retroactivelly", "retroactively", - "revolutionairy", "revolutionary", - "revolutionnary", "revolutionary", - "ridicilousness", "ridiculousness", - "ridicoulusness", "ridiculousness", - "rienforcements", "reinforcements", - "righteoussness", "righteousness", - "satisfactoraly", "satisfactory", - "satisfactority", "satisfactorily", - "sceintifically", "scientifically", - "schizophrentic", "schizophrenic", - "screenwrighter", "screenwriter", - "sensacionalism", "sensationalism", - "sensacionalist", "sensationalist", - "sensasionalism", "sensationalism", - "sensasionalist", "sensationalist", - "sensationality", "sensationalist", - "sensationalizm", "sensationalism", - "sensationalsim", "sensationalism", - "sensationilism", "sensationalism", - "sensationilist", "sensationalist", - "sensationslism", "sensationalism", - "sensetionalism", "sensationalism", - "sensibilisiert", "sensibilities", - "sentationalism", "sensationalism", - "sentationalist", "sensationalist", - "senzationalism", "sensationalism", - "senzationalist", "sensationalist", - "sepcifications", "specification", - "simaltaneously", "simultaneously", - "simeltaneously", "simultaneously", - "similtaneously", "simultaneously", - "simlutaneously", "simultaneously", - "simplificacion", "simplification", - "simplificaiton", "simplification", - "simplificating", "simplification", - "simulatenously", "simultaneously", - "simulatneously", "simultaneously", - "simultaenously", "simultaneously", - "simultainously", "simultaneously", - "simultaneoulsy", "simultaneously", - "simultaniously", "simultaneously", - "simulteanously", "simultaneously", - "sistematically", "systematically", - "slaugterhouses", "slaughterhouses", - "specailization", "specialization", - "specialication", "specialization", - "specializaiton", "specialization", - "specificaitons", "specification", - "speciliazation", "specialization", - "spectacularely", "spectacularly", - "spectacularily", "spectacularly", - "spesifications", "specifications", - "spezialisation", "specialization", - "sportsmansship", "sportsmanship", - "spreadsheeters", "spreadsheets", - "straightforwad", "straightforward", - "subconcsiously", "subconsciously", - "subconsicously", "subconsciously", - "subsconciously", "subconsciously", - "sunconsciously", "subconsciously", - "superintendant", "superintendent", - "suppliementing", "supplementing", - "surrepetitious", "surreptitious", - "survivabililty", "survivability", - "survivabillity", "survivability", - "sustainabiltiy", "sustainability", - "syncronization", "synchronization", - "systemetically", "systematically", - "systimatically", "systematically", - "technologicaly", "technologically", - "thermodinamics", "thermodynamics", - "thermodyanmics", "thermodynamics", - "thermodymamics", "thermodynamics", - "thermodymanics", "thermodynamics", - "thermodynamcis", "thermodynamics", - "thermodynanics", "thermodynamics", - "thermodynmaics", "thermodynamics", - "thernodynamics", "thermodynamics", - "theromdynamics", "thermodynamics", - "transformacion", "transformation", - "transfromation", "transformation", - "transitionable", "transitional", - "transitionning", "transitioning", - "transofrmation", "transformation", - "trasnformation", "transformation", - "trasnportation", "transportation", - "unbelievablely", "unbelievably", - "unchallengable", "unchallengeable", - "uncomfortabley", "uncomfortably", - "uncomfortablly", "uncomfortably", - "unconciousness", "unconsciousness", - "unconditionaly", "unconditionally", - "unconditionnal", "unconditional", - "unconsciouslly", "unconsciously", - "uncontrallable", "uncontrollable", - "uncontrallably", "uncontrollably", - "uncontrolablly", "uncontrollably", - "unconvectional", "unconventional", - "unconvencional", "unconventional", - "unconvensional", "unconventional", - "unconventianal", "unconventional", - "underastimated", "underestimated", - "underestamated", "underestimated", - "underestemated", "underestimated", - "underestimeted", "underestimated", - "undersetimated", "underestimated", - "understandebly", "understandably", - "understandible", "understandable", - "understandibly", "understandably", - "undestructible", "indestructible", - "unforetunately", "unfortunately", - "unfortunatelly", "unfortunately", - "unfourtunately", "unfortunately", - "uninitalizable", "uninitializable", - "unintelligient", "unintelligent", - "unintentionaly", "unintentionally", - "unintentionnal", "unintentional", - "unmanouverable", "unmaneuverable", - "unneccessarily", "unnecessarily", - "unnecessarilly", "unnecessarily", - "unprecendented", "unprecedented", - "unprofessionel", "unprofessional", - "unreasonablely", "unreasonably", - "unsubstantiaed", "unsubstantiated", - "unsurprizingly", "unsurprisingly", - "vizualisations", "visualization", - "vulnerabilites", "vulnerabilities", - "vulnerabillity", "vulnerability", - "vulnerablility", "vulnerability", - "wholeheartadly", "wholeheartedly", - "wholeheartidly", "wholeheartedly", - "abbrievations", "abbreviation", - "accelleration", "acceleration", - "accomadations", "accommodations", - "accommadating", "accommodating", - "accommadation", "accommodation", - "accommidation", "accommodation", - "accomodations", "accommodations", - "accomondating", "accommodating", - "accomondation", "accommodation", - "accomplishent", "accomplishment", - "accountabilty", "accountability", - "accredidation", "accreditation", - "acknolwedging", "acknowledging", - "acknowlegding", "acknowledging", - "acomplishment", "accomplishment", - "acquaintaince", "acquaintance", - "acquaintences", "acquaintances", - "acquaintinces", "acquaintances", - "acquanitances", "acquaintance", - "acquantainces", "acquaintances", - "acquantiances", "acquaintances", - "acquiantances", "acquaintances", - "acquiantences", "acquaintances", - "adminastrator", "administrator", - "administartor", "administrator", - "administraion", "administration", - "administraron", "administrator", - "administrater", "administrator", - "administratio", "administrator", - "administraton", "administration", - "adminsitrator", "administrator", - "adminstration", "administration", - "adminstrative", "administrative", - "admissability", "admissibility", - "adnimistrator", "administrators", - "adverticement", "advertisement", - "advertisiment", "advertisement", - "advertisments", "advertisements", - "advirtisement", "advertisement", - "aestethically", "aesthetically", - "aesthatically", "aesthetically", - "aesthitically", "aesthetically", - "affectionnate", "affectionate", - "aforementiond", "aforementioned", - "agriculturual", "agricultural", - "agrumentative", "argumentative", - "alterantively", "alternatively", - "alternativets", "alternatives", - "alternativley", "alternatively", - "alternitavely", "alternatively", - "alternitively", "alternatively", - "aninteresting", "uninteresting", - "annoucnements", "announcements", - "antagonisitic", "antagonistic", - "anthropolgist", "anthropologist", - "apporpriately", "appropriately", - "apporpriation", "appropriation", - "apporximately", "approximately", - "appreciateing", "appreciating", - "appreciateive", "appreciative", - "appreciationg", "appreciating", - "appropirately", "appropriately", - "appropiration", "appropriation", - "appropraitely", "appropriately", - "appropreation", "appropriation", - "appropriatley", "appropriately", - "appropropiate", "appropriate", - "approrpiation", "appropriation", - "approxamately", "approximately", - "approxiamtely", "approximately", - "approximatley", "approximately", - "approximitely", "approximately", - "aqcuaintances", "acquaintances", - "aqquaintances", "acquaintances", - "archaelogical", "archaeological", - "archaelogists", "archaeologists", - "archeaologist", "archeologist", - "archetectural", "architectural", - "architechture", "architecture", - "architechural", "architectural", - "architectrual", "architectural", - "architecutral", "architectural", - "argumentitive", "argumentative", - "arugmentative", "argumentative", - "asethetically", "aesthetically", - "assasinations", "assassinations", - "audomoderator", "automoderator", - "australianess", "australians", - "authenticaion", "authentication", - "authenticaton", "authentication", - "autherization", "authorization", - "authoratitive", "authoritative", - "authoritatian", "authoritarian", - "authoritation", "authorization", - "authorititive", "authoritative", - "authoritorian", "authoritarian", - "authorotative", "authoritative", - "authroization", "authorization", - "automoderador", "automoderator", - "automoderater", "automoderator", - "automodorator", "automoderator", - "automoterator", "automoderator", - "autoritharian", "authoritarian", - "availabillity", "availability", - "awknowledging", "acknowledging", - "billingualism", "bilingualism", - "billionairres", "billionaire", - "borderlanders", "borderlands", - "breadtfeeding", "breastfeeding", - "breastfeading", "breastfeeding", - "breatsfeeding", "breastfeeding", - "broadacasting", "broadcasting", - "bureaucractic", "bureaucratic", - "bureaucratics", "bureaucrats", - "bureaucratius", "bureaucrats", - "californiaman", "californian", - "calrification", "clarification", - "capitalizaton", "capitalization", - "carbohdyrates", "carbohydrates", - "carbohidrates", "carbohydrates", - "carbohyrdates", "carbohydrates", - "carboyhdrates", "carbohydrates", - "carthographer", "cartographer", - "catagorically", "categorically", - "catastrophies", "catastrophe", - "catastrophize", "catastrophe", - "catigorically", "categorically", - "catterpillars", "caterpillars", - "celebrationis", "celebrations", - "ceritfication", "certifications", - "certificaiton", "certification", - "championchips", "championship", - "championshiop", "championships", - "championsship", "championships", - "chanpionships", "championships", - "charactarized", "characterized", - "characterisic", "characteristic", - "characteristc", "characteristics", - "characterists", "characteristics", - "charicterized", "characterized", - "charismatisch", "charismatic", - "checkpointusa", "checkpoints", - "cheeseburgare", "cheeseburger", - "cheeseburgler", "cheeseburger", - "cheeseburguer", "cheeseburger", - "cheezeburgers", "cheeseburgers", - "chornological", "chronological", - "chronoligical", "chronological", - "chronologicly", "chronological", - "cinematograhy", "cinematography", - "cinematograpy", "cinematography", - "circomference", "circumference", - "circumcission", "circumcision", - "circumferance", "circumference", - "circumsicions", "circumcision", - "circumstanial", "circumstantial", - "circumstantal", "circumstantial", - "circumstnaces", "circumstance", - "circunference", "circumference", - "circunstances", "circumstances", - "cirucmference", "circumference", - "cirucmstances", "circumstances", - "civilications", "civilizations", - "civilizaitons", "civilizations", - "clarificaiton", "clarification", - "clasification", "clarification", - "clerification", "clarification", - "coincidentaly", "coincidentally", - "coincidential", "coincidental", - "colaborations", "collaborations", - "collabaration", "collaboration", - "collaberation", "collaboration", - "collaberative", "collaborative", - "collaboratore", "collaborate", - "collectioners", "collections", - "collectivelly", "collectively", - "collobaration", "collaboration", - "combatibility", "compatibility", - "comeptitively", "competitively", - "comfortablely", "comfortably", - "comfortablity", "comfortably", - "comfrontation", "confrontation", - "commemerative", "commemorative", - "commericially", "commercially", - "commerorative", "commemorative", - "comminication", "communication", - "comminucation", "communications", - "commissionees", "commissions", - "commissionned", "commissioned", - "commissionner", "commissioner", - "commmemorated", "commemorated", - "commuications", "communications", - "commuincation", "communications", - "communciation", "communication", - "communiaction", "communications", - "communicaiton", "communication", - "communicatoin", "communications", - "communicatons", "communications", - "compadibility", "compatibility", - "comparativley", "comparatively", - "comparetively", "comparatively", - "comparitavely", "comparatively", - "comparitively", "comparatively", - "compatability", "compatibility", - "compatibiltiy", "compatibility", - "compeditively", "competitively", - "compensantion", "compensation", - "compensationg", "compensating", - "comperatively", "comparatively", - "comperhension", "comprehension", - "competatively", "competitively", - "competitavely", "competitively", - "competitevely", "competitively", - "competitivley", "competitively", - "competiveness", "competitiveness", - "compilcations", "complication", - "compitability", "compatibility", - "complciations", "complication", - "complecations", "complications", - "compliactions", "complication", - "complicaitons", "complication", - "complilations", "complications", - "complimentery", "complimentary", - "complimentoni", "complimenting", - "complimentory", "complimentary", - "comprehention", "comprehension", - "computacional", "computational", - "comtamination", "contamination", - "comtemplating", "contemplating", - "concatination", "contamination", - "conceivablely", "conceivably", - "concencration", "concentration", - "concenrtation", "concentrations", - "concentartion", "concentrations", - "concentracion", "concentration", - "concentraited", "concentrated", - "concentraiton", "concentrations", - "concentratons", "concentrations", - "concervatives", "conservatives", - "concideration", "consideration", - "concioussness", "consciousness", - "concnetration", "concentrations", - "concsiousness", "consciousness", - "condascending", "condescending", - "condescencion", "condescension", - "condescendion", "condescension", - "condescensing", "condescension", - "condiscending", "condescending", - "conditionning", "conditioning", - "condradicting", "contradicting", - "condradiction", "contradiction", - "condradictory", "contradictory", - "conecntration", "concentrations", - "conenctration", "concentrations", - "confidentally", "confidentially", - "configruation", "configurations", - "configuartion", "configuration", - "configuracion", "configuration", - "configuraiton", "configuration", - "configuratoin", "configurations", - "configureable", "configurable", - "confrentation", "confrontation", - "confrontacion", "confrontation", - "confrontating", "confrontation", - "confrontativo", "confrontation", - "congratualted", "congratulate", - "conifguration", "configurations", - "conisderation", "considerations", - "connecticunts", "connecticut", - "connectivitiy", "connectivity", - "conpassionate", "compassionate", - "conplications", "complications", - "conplimentary", "complimentary", - "conplimenting", "complimenting", - "conprehension", "comprehension", - "consdieration", "considerations", - "consenquently", "consequently", - "consentrating", "concentrating", - "consentration", "concentration", - "consequencies", "consequence", - "consequentely", "consequently", - "consequeseces", "consequences", - "conservatisim", "conservatism", - "conservativsm", "conservatism", - "conservitives", "conservatives", - "consicousness", "consciousness", - "considerabely", "considerable", - "considerabile", "considerable", - "considerabley", "considerably", - "considerablly", "considerably", - "consideracion", "consideration", - "consideratoin", "considerations", - "considerstion", "considerations", - "considertaion", "considerations", - "consituencies", "constituencies", - "consitutional", "constitutional", - "constallation", "constellation", - "constarnation", "consternation", - "constillation", "constellation", - "constituintes", "constituents", - "constituional", "constitutional", - "constitutents", "constitutes", - "constitutinal", "constitutional", - "constructicon", "construction", - "constructieve", "constructive", - "constructiong", "constructing", - "consttruction", "construction", - "contaminacion", "contamination", - "contaminanted", "contaminated", - "contanimation", "contamination", - "contenplating", "contemplating", - "contimplating", "contemplating", - "contraceptivo", "contraception", - "contradiccion", "contradiction", - "contradicitng", "contradicting", - "contradiciton", "contradiction", - "contradictary", "contradictory", - "contradictons", "contradicts", - "contraticting", "contradicting", - "contravercial", "controversial", - "contraversial", "controversial", - "contreception", "contraception", - "contreversial", "controversial", - "contributeurs", "contributes", - "contributiors", "contributors", - "contriception", "contraception", - "contridictory", "contradictory", - "contritutions", "contributions", - "contriversial", "controversial", - "controception", "contraception", - "controdicting", "contradicting", - "controdiction", "contradiction", - "controvercial", "controversial", - "controverisal", "controversial", - "controversary", "controversy", - "controversity", "controversy", - "controvertial", "controversial", - "contstruction", "construction", - "conventionnal", "conventional", - "converastions", "conservation", - "conversationa", "conservation", - "conversationg", "conservation", - "conversationy", "conservation", - "conversatiosn", "conservation", - "conversatives", "conservatives", - "converstaions", "conversations", - "convorsations", "conversations", - "cooresponding", "corresponding", - "coorperations", "corporations", - "correctionals", "corrections", - "correpsonding", "corresponding", - "correspondant", "correspondent", - "correspondece", "correspondence", - "corresponders", "corresponds", - "corresponsing", "corresponding", - "corrispondant", "correspondent", - "corrisponding", "corresponding", - "corrosponding", "corresponding", - "costomization", "customization", - "costumization", "customization", - "counterfeight", "counterfeit", - "creationistas", "creationists", - "cricumference", "circumference", - "cringeworthey", "cringeworthy", - "cringeworthly", "cringeworthy", - "crytopgraphic", "cryptographic", - "curcumference", "circumference", - "curcumstances", "circumstances", - "custumization", "customization", - "cuztomization", "customization", - "decentraliced", "decentralized", - "decentrilized", "decentralized", - "decomissioned", "decommissioned", - "decompositing", "decomposing", - "definitivelly", "definitively", - "deinitalizing", "deinitializing", - "demenstration", "demonstration", - "democraticaly", "democratically", - "democraticlly", "democratically", - "demoninations", "denominations", - "demonstarting", "demonstrating", - "demonstartion", "demonstration", - "demonstraiton", "demonstrations", - "demonstratbly", "demonstrably", - "demonstraties", "demonstrate", - "demonstrativo", "demonstration", - "demosntrating", "demonstrating", - "demosntration", "demonstrations", - "denomenations", "denominations", - "denomonations", "denominations", - "deomnstration", "demonstrations", - "dermatalogist", "dermatologist", - "dermatolagist", "dermatologist", - "dermatoligist", "dermatologist", - "dermatologyst", "dermatologist", - "dermetologist", "dermatologist", - "dermitologist", "dermatologist", - "derpatologist", "dermatologist", - "desentralized", "decentralized", - "desillusioned", "disillusioned", - "desintegrated", "disintegrated", - "desinterested", "disinterested", - "determenation", "determination", - "determinacion", "determination", - "determinining", "determining", - "determinisitc", "deterministic", - "determinsitic", "deterministic", - "detmatologist", "dermatologist", - "developmently", "developmental", - "dezentralized", "decentralized", - "differantiate", "differentiate", - "differenciate", "differentiate", - "differintiate", "differentiate", - "diffirentiate", "differentiate", - "disadvandages", "disadvantaged", - "disadvantadge", "disadvantaged", - "disadvanteged", "disadvantaged", - "disadvanteges", "disadvantages", - "disadvatanges", "disadvantages", - "disadventaged", "disadvantaged", - "disadventages", "disadvantages", - "disallusioned", "disillusioned", - "disappearence", "disappearance", - "disappearnace", "disappearance", - "disappearring", "disappearing", - "disatvantaged", "disadvantaged", - "disatvantages", "disadvantages", - "disciplinairy", "disciplinary", - "disciplinerad", "disciplined", - "discipliniary", "disciplinary", - "disconnecters", "disconnects", - "discontinuted", "discontinued", - "discrimianted", "discriminated", - "discriminante", "discriminate", - "discriminatie", "discriminate", - "discriminatin", "discrimination", - "disillisioned", "disillusioned", - "disillutioned", "disillusioned", - "disingenuious", "disingenuous", - "disollusioned", "disillusioned", - "disrecpectful", "disrespectful", - "disrecpecting", "disrespecting", - "disrepsectful", "disrespectful", - "disrepsecting", "disrespecting", - "disresepctful", "disrespectful", - "disresepcting", "disrespecting", - "disrespection", "disrespecting", - "disrespekting", "disrespecting", - "disrispectful", "disrespectful", - "disrispecting", "disrespecting", - "dissagreement", "disagreement", - "dissapearance", "disappearance", - "dissapointted", "dissapointed", - "dissappointed", "disappointed", - "dissobediance", "disobedience", - "dissobedience", "disobedience", - "distingishing", "distinguishing", - "distinguising", "distinguishing", - "distinquished", "distinguished", - "distirbutions", "distributions", - "distiungished", "distinguished", - "distribustion", "distributions", - "distributiors", "distributors", - "distributivos", "distributions", - "distrobutions", "distributions", - "distrubitions", "distributions", - "distuingished", "distinguished", - "documantaries", "documentaries", - "documenatries", "documentaries", - "documentacion", "documentation", - "documentaires", "documentaries", - "documentaiton", "documentation", - "documentarios", "documentaries", - "documentaties", "documentaries", - "documentating", "documentation", - "documenteries", "documentaries", - "documentories", "documentaries", - "drammatically", "grammatically", - "dsyfunctional", "dysfunctional", - "dumbfoundeads", "dumbfounded", - "dusfunctional", "dysfunctional", - "dustification", "justification", - "dysfonctional", "dysfunctional", - "dysfucntional", "dysfunctional", - "dysfuncitonal", "dysfunctional", - "dysfunktional", "dysfunctional", - "easthetically", "aesthetically", - "effectiviness", "effectiveness", - "effictiveness", "effectiveness", - "effortlessely", "effortlessly", - "effortlessley", "effortlessly", - "embarrasement", "embarrassment", - "embarrasments", "embarrassment", - "embarressment", "embarrassment", - "emberrassment", "embarrassment", - "encarceration", "incarceration", - "encorporating", "incorporating", - "encyclopeadia", "encyclopedia", - "encyclopeadic", "encyclopedia", - "encyclopeedia", "encyclopedia", - "encycolpedias", "encyclopedia", - "endoctrinated", "indoctrinated", - "enlightenting", "enlightening", - "enlightnement", "enlightenment", - "enligthenment", "enlightenment", - "enteratinment", "entertainment", - "enterpreneurs", "entrepreneurs", - "enterprenuers", "entrepreneurs", - "enterpreuners", "entrepreneurs", - "entertianment", "entertainment", - "enthusiasists", "enthusiasts", - "enthusiastics", "enthusiasts", - "entrepraneurs", "entrepreneurs", - "entreprenaurs", "entrepreneurs", - "entrepreneuer", "entrepreneurs", - "entreprenours", "entrepreneurs", - "entreprenuers", "entrepreneurs", - "entreprenures", "entrepreneurs", - "entrepreuners", "entrepreneurs", - "entretainment", "entertainment", - "enviornmental", "environmental", - "environemntal", "environmental", - "environmently", "environmental", - "envolutionary", "evolutionary", - "envrionmental", "environmental", - "estabilshment", "establishments", - "establishemnt", "establishments", - "establishmnet", "establishments", - "establsihment", "establishments", - "estbalishment", "establishments", - "ethnocentricm", "ethnocentrism", - "evolutionairy", "evolutionary", - "evolutionarly", "evolutionary", - "evolutionnary", "evolutionary", - "exaggeratting", "exaggerating", - "excpetionally", "exceptionally", - "executioneers", "executioner", - "existentiella", "existential", - "expectionally", "exceptionally", - "experementing", "experimenting", - "experienceing", "experiencing", - "experimentais", "experiments", - "experimention", "experimenting", - "experimentors", "experiments", - "expirementing", "experimenting", - "expodentially", "exponentially", - "exponantially", "exponentially", - "exponencially", "exponentially", - "exponentiella", "exponential", - "extraodrinary", "extraordinary", - "extraordianry", "extraordinary", - "extraordinair", "extraordinary", - "extraordinaly", "extraordinary", - "extraoridnary", "extraordinary", - "extremeophile", "extremophile", - "extroardinary", "extraordinary", - "familiarizate", "familiarize", - "fantasitcally", "fantastically", - "fantasmically", "fantastically", - "fantistically", "fantastically", - "faptastically", "fantastically", - "figurativeley", "figuratively", - "figurativelly", "figuratively", - "frankenstiens", "frankenstein", - "frankenstined", "frankenstein", - "frankenstiner", "frankenstein", - "frankenstines", "frankenstein", - "friendzoneado", "friendzoned", - "fucntionality", "functionality", - "funcitonality", "functionality", - "functionailty", "functionality", - "fundamentalis", "fundamentals", - "fundamnetally", "fundamentally", - "fundementally", "fundamentally", - "fundimentally", "fundamentally", - "gamifications", "ramifications", - "generalizaing", "generalizing", - "generalizaton", "generalization", - "generationals", "generations", - "generationens", "generations", - "generationers", "generations", - "generationnal", "generational", - "geographicaly", "geographically", - "geographicial", "geographical", - "geometricians", "geometers", - "goreshadowing", "foreshadowing", - "governmential", "governmental", - "gradification", "gratification", - "grammarically", "grammatically", - "grandchildern", "grandchildren", - "gratificacion", "gratification", - "gratificaiton", "gratification", - "grativational", "gravitational", - "gravitacional", "gravitational", - "gravitaitonal", "gravitational", - "hallcuination", "hallucination", - "hallicunation", "hallucination", - "hallucenation", "hallucination", - "halluciantion", "hallucinations", - "hallukination", "hallucination", - "hallunication", "hallucination", - "hallusination", "hallucination", - "halluzination", "hallucination", - "heiroglyphics", "hieroglyphics", - "hellucination", "hallucination", - "highlightning", "highlighting", - "homesexuality", "homosexuality", - "homosexualtiy", "homosexuality", - "homosexulaity", "homosexuality", - "horizontallly", "horizontally", - "hullucination", "hallucination", - "hypocriticial", "hypocritical", - "hypotheticaly", "hypothetically", - "hystericallly", "hysterically", - "identificaton", "identification", - "ideoligically", "ideologically", - "ideosyncratic", "idiosyncratic", - "idiologically", "ideologically", - "illistrations", "illustrations", - "illustartions", "illustrations", - "imperfactions", "imperfections", - "impersinating", "impersonating", - "implementaion", "implementation", - "implementatin", "implementations", - "implimenation", "implementation", - "imprefections", "imperfections", - "impresonating", "impersonating", - "inaccessibile", "inaccessible", - "inadventently", "inadvertently", - "inadverdently", "inadvertently", - "inadvertantly", "inadvertently", - "inadvertendly", "inadvertently", - "inapporpriate", "inappropriate", - "inappropirate", "inappropriate", - "inappropraite", "inappropriate", - "inaproppriate", "inappropriate", - "incarcaration", "incarceration", - "incarciration", "incarceration", - "incarseration", "incarceration", - "incerceration", "incarceration", - "incidentially", "incidentally", - "incomfortable", "uncomfortable", - "incomfortably", "uncomfortably", - "incompatabile", "incompatible", - "incompatiable", "incompatible", - "incompatibile", "incompatible", - "inconciderate", "inconsiderate", - "inconcistency", "inconsistency", - "inconditional", "unconditional", - "inconsciously", "unconsciously", - "inconsiderant", "inconsiderate", - "inconsistance", "inconsistency", - "inconsistancy", "inconsistency", - "inconsistenly", "inconsistency", - "inconsistensy", "inconsistency", - "inconsistenty", "inconsistency", - "inconveinence", "inconvenience", - "inconveniance", "inconvenience", - "inconveniente", "inconvenience", - "inconvienence", "inconvenience", - "incoroporated", "incorporated", - "incorparating", "incorporating", - "incorperating", "incorporating", - "incorperation", "incorporation", - "incorruptable", "incorruptible", - "incramentally", "incrementally", - "incrementarla", "incremental", - "incrementarlo", "incremental", - "indavertently", "inadvertently", - "indefinitelly", "indefinitely", - "independantes", "independents", - "independantly", "independently", - "independendet", "independent", - "independendly", "independently", - "indepentently", "independently", - "indespensable", "indispensable", - "indespensible", "indispensable", - "indestructble", "indestructible", - "indestructibe", "indestructible", - "indictrinated", "indoctrinated", - "indipendently", "independently", - "indispensible", "indispensable", - "indivuduality", "individuality", - "indocrtinated", "indoctrinated", - "indocternated", "indoctrinated", - "indoctornated", "indoctrinated", - "indoctrinatie", "indoctrinated", - "indoctrinatin", "indoctrination", - "indoctronated", "indoctrinated", - "industrialied", "industrialized", - "industrialzed", "industrialized", - "inexeprienced", "inexperience", - "inexpeirenced", "inexperience", - "inexpereinced", "inexperienced", - "inexperianced", "inexperienced", - "inexperiecned", "inexperience", - "inexperineced", "inexperience", - "inexpierenced", "inexperienced", - "inexplicabley", "inexplicably", - "inexplicablly", "inexplicably", - "infilitration", "infiltration", - "infrastructre", "infrastructure", - "infrastrucure", "infrastructure", - "inintelligent", "unintelligent", - "ininteresting", "uninteresting", - "initalisation", "initialisation", - "initalization", "initialization", - "inperfections", "imperfections", - "inpersonating", "impersonating", - "inpossibility", "impossibility", - "inpredictable", "unpredictable", - "inresponsible", "irresponsible", - "insectiverous", "insectivorous", - "insecuritites", "insecurities", - "insiginficant", "insignificant", - "insiginifcant", "insignificant", - "insignificent", "insignificant", - "insignificunt", "insignificant", - "insignifigant", "insignificant", - "insiprational", "inspirational", - "insperational", "inspirational", - "inspiritional", "inspirational", - "inspriational", "inspirational", - "instantaenous", "instantaneous", - "instantanious", "instantaneous", - "instanteneous", "instantaneous", - "instantenious", "instantaneous", - "instincitvely", "instinctively", - "instinctivley", "instinctively", - "instititional", "institutional", - "institutionel", "institutional", - "insturmentals", "instrumental", - "instutitional", "institutional", - "insustainable", "unsustainable", - "intelelctuals", "intellectuals", - "intellectualy", "intellectually", - "intellectuels", "intellectuals", - "intellecutals", "intellectuals", - "intellegently", "intelligently", - "intelluctuals", "intellectuals", - "intepretation", "interpretation", - "intereactions", "intersections", - "interesctions", "intersections", - "interlectuals", "intellectuals", - "intermittient", "intermittent", - "intermittment", "intermittent", - "internacional", "international", - "interpersonel", "interpersonal", - "interpresonal", "interpersonal", - "interpretaion", "interpretation", - "interpretarea", "interpreter", - "interpretarem", "interpreter", - "interpretares", "interpreter", - "interpretarse", "interpreter", - "interpretarte", "interpreter", - "interpretatin", "interpretations", - "interpreteert", "interpreter", - "interragation", "interrogation", - "interregation", "interrogation", - "interrigation", "interrogation", - "interrogacion", "interrogation", - "interrogativo", "interrogation", - "intertainment", "entertainment", - "intillectuals", "intellectuals", - "intraspection", "introspection", - "intrensically", "intrinsically", - "intriniscally", "intrinsically", - "intrinsecally", "intrinsically", - "intrisincally", "intrinsically", - "intristically", "intrinsically", - "introductiory", "introductory", - "introspeccion", "introspection", - "introspectivo", "introspection", - "introspektion", "introspection", - "invertibrates", "invertebrates", - "invesitgation", "investigation", - "invesitgative", "investigative", - "invesitgators", "investigators", - "investagators", "investigators", - "investegating", "investigating", - "investegators", "investigators", - "investiagtion", "investigation", - "investiagtive", "investigative", - "investigacion", "investigation", - "investigaiton", "investigations", - "investigaters", "investigators", - "investigativo", "investigation", - "investigatons", "investigations", - "investigsting", "investigating", - "investigstion", "investigations", - "investogators", "investigators", - "invisibillity", "invisibility", - "involuntarely", "involuntary", - "involuntarity", "involuntary", - "invulnerabile", "invulnerable", - "irrationallly", "irrationally", - "irresponcible", "irresponsible", - "irresponisble", "irresponsible", - "irresponsable", "irresponsible", - "irresponsbile", "irresponsible", - "irreversiable", "irreversible", - "irreversibelt", "irreversible", - "irreversibile", "irreversible", - "irrisponsible", "irresponsible", - "jacksonvillle", "jacksonville", - "journalisitic", "journalistic", - "journalistens", "journalists", - "journalisters", "journalists", - "journalistisk", "journalists", - "jsutification", "justifications", - "jurisdicitons", "jurisdictions", - "jurisidctions", "jurisdictions", - "juristictions", "jurisdictions", - "jursidictions", "jurisdictions", - "jusitfication", "justifications", - "justifiaction", "justifications", - "justificacion", "justification", - "justificaiton", "justification", - "justificativo", "justification", - "justificatons", "justifications", - "justificstion", "justifications", - "justiifcation", "justifications", - "karbohydrates", "carbohydrates", - "knoweldgeable", "knowledgeable", - "knowledegable", "knowledgeable", - "knowledgebale", "knowledgable", - "knowlegdeable", "knowledgeable", - "kollaboration", "collaboration", - "koncentration", "concentration", - "konfiguration", "configuration", - "konfrontation", "confrontation", - "konservatives", "conservatives", - "konstellation", "constellation", - "kontamination", "contamination", - "legitimatelly", "legitimately", - "libertariaism", "libertarianism", - "libertariansm", "libertarianism", - "libitarianisn", "libertarianism", - "lighthearthed", "lighthearted", - "mainfestation", "manifestation", - "manafacturers", "manufacturers", - "manafacturing", "manufacturing", - "manafestation", "manifestation", - "manefestation", "manifestation", - "manfuacturers", "manufactures", - "manifacturers", "manufacturers", - "manifacturing", "manufacturing", - "manifastation", "manifestation", - "manifestacion", "manifestation", - "manifestating", "manifestation", - "manifistation", "manifestation", - "manipulationg", "manipulating", - "manufacterers", "manufacturers", - "manufactering", "manufacturing", - "manufacterurs", "manufactures", - "manufactorers", "manufacturers", - "manufactoring", "manufacturing", - "manufactuered", "manufactured", - "manufactuerer", "manufacturer", - "manufactueres", "manufactures", - "manufacturedd", "manufactured", - "manufactureds", "manufactures", - "manufacturerd", "manufactured", - "manufacturier", "manufacturer", - "manufacturors", "manufacturers", - "manufactuters", "manufactures", - "manufacutrers", "manufactures", - "manufcaturers", "manufactures", - "marshmalllows", "marshmallows", - "massachsuetts", "massachusetts", - "massachucetts", "massachusetts", - "massachuestts", "massachusetts", - "massachusents", "massachusetts", - "massachusites", "massachusetts", - "massachussets", "massachusetts", - "massechusetts", "massachusetts", - "masturbateing", "masturbating", - "materialisimo", "materialism", - "mathamatician", "mathematician", - "mathametician", "mathematician", - "mathematicals", "mathematics", - "mathematicaly", "mathematically", - "mathematicans", "mathematics", - "mathematicion", "mathematician", - "mathematitian", "mathematician", - "mathemetician", "mathematician", - "mathmatically", "mathematically", - "mathmaticians", "mathematicians", - "mechanicallly", "mechanically", - "medeterranean", "mediterranean", - "meditarrenean", "mediterranean", - "meditereanean", "mediterranean", - "membranaphone", "membranophone", - "metamorphysis", "metamorphosis", - "metaphoricaly", "metaphorically", - "metaphoricial", "metaphorical", - "metaphysicals", "metaphysics", - "metaphysicans", "metaphysics", - "methamatician", "mathematician", - "methematician", "mathematician", - "metropolitain", "metropolitan", - "metropolitcan", "metropolitan", - "metropolitian", "metropolitan", - "millionairres", "millionaire", - "minneapolites", "minneapolis", - "misanderstood", "misunderstood", - "miscellanious", "miscellaneous", - "misconcpetion", "misconceptions", - "misconecption", "misconceptions", - "misinterperet", "misinterpret", - "misinterprate", "misinterpret", - "misinterprent", "misinterpret", - "misinterprted", "misinterpret", - "misogynisitic", "misogynistic", - "misrepreseted", "misrepresented", - "misunterstood", "misunderstood", - "modificaitons", "modifications", - "motivationals", "motivations", - "motivationnal", "motivational", - "mulitnational", "multinational", - "multimational", "multinational", - "multiplicaton", "multiplication", - "muncipalities", "municipalities", - "munnicipality", "municipality", - "mutlinational", "multinational", - "nacionalistic", "nationalistic", - "narcissisitic", "narcissistic", - "narcississtic", "narcissistic", - "natioanlistic", "nationalistic", - "nationalisitc", "nationalistic", - "nationalistes", "nationalists", - "nationalsitic", "nationalistic", - "neigbhourhood", "neighbourhood", - "neighboorhoud", "neighbourhood", - "neighborehood", "neighbourhood", - "neighborhoood", "neighborhoods", - "neighbourbood", "neighbourhood", - "neighbourgood", "neighbourhood", - "neighbourhoud", "neighbourhood", - "neighourhoods", "neighborhoods", - "nieghborhoods", "neighborhoods", - "nieghbourhood", "neighbourhood", - "noncombatents", "noncombatants", - "noninitalized", "noninitialized", - "northwestener", "northwestern", - "notificaitons", "notifications", - "occassionally", "occasionally", - "operationable", "operational", - "oppertunities", "opportunities", - "opprotunities", "opportunities", - "oppurtunities", "opportunities", - "opthamologist", "ophthalmologist", - "organistaions", "organisations", - "organizatinal", "organizational", - "organizativos", "organizations", - "organsiations", "organisations", - "organziations", "organizations", - "orginasations", "organisations", - "orginazations", "organizations", - "overpopulaton", "overpopulation", - "overreactiong", "overreacting", - "overshaddowed", "overshadowed", - "overwheliming", "overwhelming", - "overwhelmigly", "overwhelmingly", - "overwhelmingy", "overwhelmingly", - "overwhelminly", "overwhelmingly", - "palestininans", "palestinians", - "paraphraseing", "paraphrasing", - "paraphrashing", "paraphrasing", - "parilamentary", "parliamentary", - "parlaimentary", "parliamentary", - "parliamantary", "parliamentary", - "parliamentery", "parliamentary", - "parliamnetary", "parliamentary", - "parliementary", "parliamentary", - "particiaption", "participation", - "participacion", "participation", - "participantes", "participants", - "participativo", "participation", - "particularely", "particularly", - "particularily", "particularly", - "particularlly", "particularly", - "partizipation", "participation", - "passionatelly", "passionately", - "paychiatrists", "psychiatrists", - "paychologists", "psychologists", - "pennsylvainia", "pennsylvania", - "pennsylvanica", "pennsylvania", - "pennsylvannia", "pennsylvania", - "perdominantly", "predominantly", - "perpandicular", "perpendicular", - "perpendicualr", "perpendicular", - "perpenticular", "perpendicular", - "perpetuationg", "perpetuating", - "perpindicular", "perpendicular", - "personalitits", "personalities", - "pessimistisch", "pessimistic", - "pharmaceutial", "pharmaceutical", - "philisophical", "philosophical", - "philosiphical", "philosophical", - "philosohpical", "philosophical", - "philosophycal", "philosophically", - "philospohical", "philosophical", - "phisiological", "physiological", - "photagraphers", "photographers", - "photographics", "photographs", - "photographied", "photographed", - "photographier", "photographer", - "photograpphed", "photographed", - "photogrophers", "photographers", - "photogrpahers", "photographers", - "photoshoppade", "photoshopped", - "photoshoppped", "photoshopped", - "phsyiological", "physiological", - "phychiatrists", "psychiatrists", - "phychological", "psychological", - "phychologists", "psychologists", - "phylosophical", "philosophical", - "physciatrists", "psychiatrists", - "physcological", "psychological", - "physcologists", "psychologists", - "physioligical", "physiological", - "planeswlakers", "planeswalker", - "plansewalkers", "planeswalker", - "playthroughts", "playthroughs", - "polysaccaride", "polysaccharide", - "practicallity", "practically", - "practicioners", "practitioners", - "practisioners", "practitioners", - "practitioneer", "practitioners", - "practitionner", "practitioner", - "pratictioners", "practitioners", - "preconceieved", "preconceived", - "predecessores", "predecessors", - "predetermiend", "predetermined", - "predetirmined", "predetermined", - "preditermined", "predetermined", - "predomenantly", "predominantly", - "predominently", "predominantly", - "pregressively", "progressively", - "preinitalized", "preinitialized", - "preinitalizes", "preinitializes", - "preliferation", "proliferation", - "prependicular", "perpendicular", - "preposterious", "preposterous", - "prerequisties", "prerequisite", - "prerequistite", "prerequisite", - "prescribtions", "prescriptions", - "presumptuious", "presumptuous", - "pretedermined", "predetermined", - "problematisch", "problematic", - "proclaimation", "proclamation", - "prodominantly", "predominantly", - "professionnal", "professional", - "profitiablity", "profitability", - "profitibality", "profitability", - "progressivily", "progressively", - "progressivley", "progressively", - "prononciation", "pronunciation", - "pronouciation", "pronunciation", - "pronunciacion", "pronunciation", - "pronunciating", "pronunciation", - "pronuncuation", "pronunciation", - "pronunication", "pronunciation", - "pronuntiation", "pronunciation", - "propabilities", "probabilities", - "proportionaly", "proportionally", - "proportionnal", "proportional", - "proseletyzing", "proselytizing", - "protagonistas", "protagonists", - "protagonistes", "protagonists", - "protestantisk", "protestants", - "protruberance", "protuberance", - "provocativley", "provocative", - "pscyhiatrists", "psychiatrists", - "pscyhological", "psychological", - "pscyhologists", "psychologists", - "pshycological", "psychological", - "pshycologists", "psychologists", - "psichological", "psychological", - "psychaitrists", "psychiatrists", - "psychedellics", "psychedelics", - "psychiatrisch", "psychiatric", - "psycholigical", "psychological", - "psycholigists", "psychologists", - "psychologycal", "psychologically", - "psychologysts", "psychologists", - "psychyatrists", "psychiatrists", - "psysiological", "physiological", - "purpendicular", "perpendicular", - "pyschiatrists", "psychiatrists", - "pyschological", "psychological", - "pyschologists", "psychologists", - "qaulification", "qualification", - "qualifiaction", "qualification", - "qualificaiton", "qualifications", - "qualificatons", "qualifications", - "qualifikation", "qualification", - "questionalble", "questionable", - "quinessential", "quintessential", - "ramificaitons", "ramifications", - "realisitcally", "realistically", - "realtionships", "relationships", - "reccommending", "recommending", - "receptionnist", "receptionist", - "receptionsist", "receptionist", - "reconaissance", "reconnaissance", - "reconcilation", "reconciliation", - "reconnaisance", "reconnaissance", - "reconstrucion", "reconstruction", - "recreationnal", "recreational", - "rectangulaire", "rectangular", - "redistribuito", "redistribution", - "redistributin", "redistribution", - "reencarnation", "reincarnation", - "refridgerator", "refrigerator", - "rehabilitaion", "rehabilitation", - "rehabilitatin", "rehabilitation", - "rehabilitaton", "rehabilitation", - "reincarantion", "reincarnation", - "reincatnation", "reincarnation", - "reinforcemens", "reinforcements", - "reinforcemnts", "reinforcements", - "reinitalising", "reinitialising", - "reinitalizing", "reinitializing", - "reinkarnation", "reincarnation", - "reinstallling", "reinstalling", - "reintarnation", "reincarnation", - "relationshits", "relationships", - "relationsship", "relationships", - "relatiopnship", "relationship", - "relentlessely", "relentlessly", - "relentlessley", "relentlessly", - "relinqushment", "relinquishment", - "remifications", "ramifications", - "reprehenisble", "reprehensible", - "reprehensable", "reprehensible", - "reprehinsible", "reprehensible", - "represenation", "representation", - "represensible", "reprehensible", - "representaion", "representation", - "representatie", "representatives", - "representatin", "representations", - "representerad", "represented", - "representitve", "representative", - "representives", "representatives", - "repricussions", "repercussions", - "reprihensible", "reprehensible", - "resolutionary", "revolutionary", - "respectivelly", "respectively", - "responsibiliy", "responsibility", - "responsibilty", "responsibility", - "responsiblity", "responsibility", - "respositories", "repositories", - "resssurecting", "resurrecting", - "ressurrection", "resurrection", - "restaraunteur", "restaurateur", - "retoractively", "retroactively", - "retroactivily", "retroactively", - "retroactivley", "retroactively", - "retrocatively", "retroactively", - "revelutionary", "revolutionary", - "revolutionair", "revolutionary", - "revolutionens", "revolutions", - "revolutioners", "revolutions", - "revoultionary", "revolutionary", - "ridiculouness", "ridiculousness", - "rienforcement", "reinforcements", - "righetousness", "righteousness", - "rightiousness", "righteousness", - "rigtheousness", "righteousness", - "rollarcoaster", "rollercoaster", - "rollercaoster", "rollercoaster", - "rollercoaters", "rollercoaster", - "rollercoatser", "rollercoaster", - "rollerocaster", "rollercoaster", - "rollertoaster", "rollercoaster", - "rollorcoaster", "rollercoaster", - "sacrastically", "sarcastically", - "sarcasitcally", "sarcastically", - "satisfactorly", "satisfactory", - "scandianvians", "scandinavian", - "scateboarding", "skateboarding", - "schisophrenic", "schizophrenic", - "schiziphrenic", "schizophrenic", - "schizophernia", "schizophrenia", - "schizophernic", "schizophrenic", - "schizophrania", "schizophrenia", - "schizoprhenia", "schizophrenia", - "schizoprhenic", "schizophrenic", - "schozophrenia", "schizophrenia", - "schozophrenic", "schizophrenic", - "schyzophrenia", "schizophrenia", - "schyzophrenic", "schizophrenic", - "schziophrenia", "schizophrenia", - "schziophrenic", "schizophrenic", - "scientificaly", "scientifically", - "scientificlly", "scientifically", - "segementation", "segmentation", - "sensationable", "sensational", - "sensationails", "sensationalism", - "sensationaism", "sensationalism", - "sensationalim", "sensationalism", - "sensationella", "sensational", - "shcizophrenic", "schizophrenic", - "significanlty", "significantly", - "significently", "significantly", - "signifigantly", "significantly", - "simultaneosly", "simultaneously", - "simultaneuous", "simultaneous", - "simultanously", "simultaneously", - "singificantly", "significantly", - "skatebaording", "skateboarding", - "skateborading", "skateboarding", - "socioecenomic", "socioeconomic", - "socioecomonic", "socioeconomic", - "socioeconimic", "socioeconomic", - "sohpisticated", "sophisticated", - "sophisitcated", "sophisticated", - "sophistacated", "sophisticated", - "sophistocated", "sophisticated", - "sophosticated", "sophisticated", - "spacification", "specification", - "specializaton", "specialization", - "specificaiton", "specifications", - "specificatons", "specifications", - "specifikation", "specification", - "spectaculaire", "spectacular", - "spectaculalry", "spectacularly", - "spectatularly", "spectacularly", - "spesification", "specification", - "spirituallity", "spiritually", - "sponatenously", "spontaneously", - "spontaenously", "spontaneously", - "spontainously", "spontaneously", - "spontaneoulsy", "spontaneously", - "spontaneuosly", "spontaneously", - "spontaniously", "spontaneously", - "spontanuously", "spontaneously", - "sponteanously", "spontaneously", - "sponteneously", "spontaneously", - "sporstmanship", "sportsmanship", - "sportmansship", "sportsmanship", - "sportsmamship", "sportsmanship", - "sportsmenship", "sportsmanship", - "sprotsmanship", "sportsmanship", - "stakeboarding", "skateboarding", - "startegically", "strategically", - "statisitcally", "statistically", - "statistacally", "statistically", - "stereotipical", "stereotypical", - "stereotpyical", "stereotypical", - "stereotypcial", "stereotypical", - "stereotypeing", "stereotyping", - "stereotypying", "stereotyping", - "steriotypical", "stereotypical", - "steroetypical", "stereotypical", - "steryotypical", "stereotypical", - "storytellling", "storytelling", - "stragegically", "strategically", - "stragetically", "strategically", - "straightenend", "straightened", - "straitforward", "straightforward", - "stratagically", "strategically", - "stratigically", "strategically", - "strawberrries", "strawberries", - "stregnthening", "strengthening", - "strenghtening", "strengthening", - "strengthining", "strengthening", - "stretegically", "strategically", - "subcatagories", "subcategories", - "subconsciosly", "subconsciously", - "subconsciouly", "subconsciously", - "subconsiously", "subconsciously", - "subjectivelly", "subjectively", - "subscribtions", "subscriptions", - "substancially", "substantially", - "substanitally", "substantially", - "substansially", "substantially", - "substantiable", "substantial", - "substantually", "substantially", - "substitutents", "substitutes", - "successfullly", "successfully", - "supermarkedet", "supermarket", - "supermarkerts", "supermarkets", - "superpowereds", "superpowers", - "supersticious", "superstitious", - "superstisious", "superstitious", - "superstitiosi", "superstitious", - "superstitiuos", "superstitious", - "superstituous", "superstitious", - "suphisticated", "sophisticated", - "supscriptions", "subscriptions", - "surreptiously", "surreptitiously", - "survavibility", "survivability", - "survibability", "survivability", - "survivabiltiy", "survivability", - "survivalibity", "survivability", - "survivavility", "survivability", - "survivebility", "survivability", - "susbtantially", "substantially", - "sustainabilty", "sustainability", - "synchornously", "synchronously", - "systematicaly", "systematically", - "systematiclly", "systematically", - "techmological", "technological", - "technicallity", "technically", - "technoligical", "technological", - "technologicly", "technological", - "techonlogical", "technological", - "telaportation", "teleportation", - "teleportating", "teleportation", - "teleprotation", "teleportation", - "teliportation", "teleportation", - "teloportation", "teleportation", - "territoriella", "territorial", - "theoratically", "theoretically", - "theoritically", "theoretically", - "therapeutisch", "therapeutic", - "thereotically", "theoretically", - "thermodynaics", "thermodynamics", - "thermodynamcs", "thermodynamics", - "theroetically", "theoretically", - "thoeretically", "theoretically", - "tranistioning", "transitioning", - "transcendance", "transcendence", - "transcribtion", "transcription", - "transcripcion", "transcription", - "transferrring", "transferring", - "transformarea", "transformer", - "transformarem", "transformer", - "transformarse", "transformers", - "transformaton", "transformation", - "transformered", "transformed", - "transgengered", "transgendered", - "transisioning", "transitioning", - "transitionals", "transitions", - "transitionnal", "transitional", - "transitionned", "transitioned", - "transkription", "transcription", - "translyvanian", "transylvania", - "transmisisons", "transmissions", - "transmissable", "transmissible", - "transmisssion", "transmissions", - "transparantie", "transparent", - "transparentcy", "transparency", - "transplantees", "transplants", - "transporation", "transportation", - "transportaion", "transportation", - "transportarme", "transporter", - "transportarse", "transporter", - "transportarte", "transporter", - "transporteurs", "transporter", - "transsexuella", "transsexual", - "transylvannia", "transylvania", - "trasngendered", "transgendered", - "troubleshooot", "troubleshoot", - "udnerestimate", "underestimated", - "umcomfortable", "uncomfortable", - "umcomfortably", "uncomfortably", - "umpredictable", "unpredictable", - "unappropriate", "inappropriate", - "unbelievabley", "unbelievably", - "unbelievablly", "unbelievably", - "uncertaintity", "uncertainty", - "uncomfertable", "uncomfortable", - "uncomfertably", "uncomfortably", - "uncomfortabel", "uncomfortably", - "uncomforyable", "uncomfortably", - "uncomfrotable", "uncomfortable", - "uncomfrotably", "uncomfortably", - "uncomftorable", "uncomfortable", - "uncomftorably", "uncomfortably", - "unconcsiously", "unconsciously", - "unconfortable", "uncomfortable", - "unconfortably", "uncomfortably", - "unconscioulsy", "unconsciously", - "unconsicously", "unconsciously", - "unconsiderate", "inconsiderate", - "uncontrollabe", "uncontrollable", - "uncontrollaby", "uncontrollably", - "unconventinal", "unconventional", - "uncounciously", "unconsciously", - "uncousciously", "unconsciously", - "underastimate", "underestimate", - "underesitmate", "underestimated", - "underestamate", "underestimate", - "underestemate", "underestimate", - "underestiamte", "underestimated", - "undergratuate", "undergraduate", - "underhwelming", "underwhelming", - "underhwleming", "underwhelming", - "underminining", "undermining", - "underpowererd", "underpowered", - "undersetimate", "underestimate", - "understandble", "understandable", - "understandbly", "understandably", - "underwealming", "underwhelming", - "underwhemling", "underwhelming", - "underwhleming", "underwhelming", - "undoctrinated", "indoctrinated", - "unexpectadely", "unexpectedly", - "unfomfortable", "uncomfortable", - "unforgiveable", "unforgivable", - "unfortuantely", "unfortunately", - "unfortunantly", "unfortunately", - "unfortunatley", "unfortunately", - "unfortuneatly", "unfortunately", - "unfortunetely", "unfortunately", - "unilaterallly", "unilaterally", - "uninstallling", "uninstalling", - "unintellegent", "unintelligent", - "unintelligant", "unintelligent", - "unintensional", "unintentional", - "uninteristing", "uninteresting", - "universitites", "universities", - "unnecassarily", "unnecessarily", - "unneccesarily", "unnecessarily", - "unnecessairly", "unnecessarily", - "unnecessarely", "unnecessarily", - "unnecessarity", "unnecessarily", - "unnecesserily", "unnecessarily", - "unnecissarily", "unnecessarily", - "unnessecarily", "unnecessarily", - "unoperational", "nonoperational", - "unprecendeted", "unprecedented", - "unprecidented", "unprecedented", - "unpredecented", "unprecedented", - "unpredicatble", "unpredictable", - "unpredictible", "unpredictable", - "unpresedented", "unprecedented", - "unpridictable", "unpredictable", - "unprofessinal", "unprofessional", - "unrealistisch", "unrealistic", - "unreasonabley", "unreasonably", - "unreasonablly", "unreasonably", - "unrestrictred", "unrestricted", - "unsistainable", "unsustainable", - "unsubscribade", "unsubscribed", - "unsubscribbed", "unsubscribe", - "unsuccesfully", "unsuccessfully", - "unsuccessfull", "unsuccessful", - "unsucessfully", "unsuccessfully", - "unsuprisingly", "unsurprisingly", - "unsuprizingly", "unsurprisingly", - "unsustainible", "unsustainable", - "unsustianable", "unsustainable", - "vertification", "certification", - "villification", "vilification", - "virualization", "visualization", - "visualizacion", "visualization", - "visualizaiton", "visualization", - "visualizating", "visualization", - "vitualization", "visualization", - "vizualization", "visualization", - "volounteering", "volunteering", - "vulberability", "vulnerability", - "vulernability", "vulnerability", - "vulnarability", "vulnerability", - "vulnerabiltiy", "vulnerability", - "vulnurability", "vulnerability", - "vunlerability", "vulnerability", - "vurnerability", "vulnerability", - "weightlfiting", "weightlifting", - "weightlifitng", "weightlifting", - "weightligting", "weightlifting", - "weigthlifting", "weightlifting", - "wholeheartdly", "wholeheartedly", - "wholeheartedy", "wholeheartedly", - "wholeheartely", "wholeheartedly", - "wieghtlifting", "weightlifting", - "abberivation", "abbreviation", - "abberviation", "abbreviation", - "abbreivation", "abbreviation", - "abbreveation", "abbreviation", - "abbrievation", "abbreviation", - "abortificant", "abortifacient", - "abrreviation", "abbreviation", - "academcially", "academically", - "accedentally", "accidentally", - "accelarating", "accelerating", - "accelaration", "acceleration", - "acceleartion", "acceleration", - "acceleraptor", "accelerator", - "accelorating", "accelerating", - "accessibilty", "accessibility", - "accidentlaly", "accidently", - "accomadating", "accommodating", - "accomadation", "accommodation", - "accomodating", "accommodating", - "accomodation", "accommodation", - "accrediation", "accreditation", - "acculumation", "accumulation", - "accumalation", "accumulation", - "accumilation", "accumulation", - "acedemically", "academically", - "acheivements", "achievements", - "acknolwedged", "acknowledged", - "acknolwedges", "acknowledges", - "acknoweldged", "acknowledged", - "acknoweldges", "acknowledges", - "acknowiedged", "acknowledged", - "acknowladges", "acknowledges", - "acknowldeged", "acknowledged", - "acknowledget", "acknowledgement", - "acknowleding", "acknowledging", - "acknowlegded", "acknowledged", - "acknowlegdes", "acknowledges", - "ackumulation", "accumulation", - "acquaintaces", "acquaintances", - "acquaintence", "acquaintance", - "acquantaince", "acquaintance", - "acquantiance", "acquaintances", - "acquiantance", "acquaintances", - "acquiantence", "acquaintance", - "adknowledged", "acknowledged", - "adknowledges", "acknowledges", - "administored", "administer", - "adminsitered", "administered", - "adminstrator", "administrator", - "advantagious", "advantageous", - "advantegeous", "advantageous", - "adventageous", "advantageous", - "adventureous", "adventures", - "adventureres", "adventures", - "adventurious", "adventurous", - "adventuruous", "adventurous", - "advertisiers", "advertisers", - "advertisment", "advertisement", - "advertisters", "advertisers", - "advertisting", "advertising", - "aestheticaly", "aesthetically", - "aestheticlly", "aesthetically", - "afficianados", "aficionados", - "afficionados", "aficionados", - "afghanisthan", "afghanistan", - "afterhtought", "afterthought", - "afterthougth", "afterthought", - "aggressivley", "aggressively", - "agircultural", "agricultural", - "agknowledged", "acknowledged", - "agnosticisim", "agnosticism", - "agracultural", "agricultural", - "agriculteral", "agricultural", - "agriculteurs", "agriculture", - "agricultrual", "agricultural", - "agriculutral", "agricultural", - "agrigultural", "agricultural", - "agrocultural", "agricultural", - "allegiancies", "allegiance", - "alterantives", "alternatives", - "alternatevly", "alternately", - "alternatiely", "alternately", - "alternatieve", "alternative", - "alternativly", "alternatively", - "alternativos", "alternatives", - "alternatvely", "alternately", - "alternitives", "alternatives", - "altruistisch", "altruistic", - "amendmenters", "amendments", - "amohetamines", "amphetamines", - "ampehtamines", "amphetamines", - "ampethamines", "amphetamines", - "amphatamines", "amphetamines", - "amphedamines", "amphetamines", - "amphetamenes", "amphetamines", - "amphetemines", "amphetamines", - "amphetimines", "amphetamines", - "amphetmaines", "amphetamines", - "anecdotallly", "anecdotally", - "annhiliation", "annihilation", - "annihalition", "annihilation", - "annihilatron", "annihilation", - "annihliation", "annihilation", - "annilihation", "annihilation", - "anniversairy", "anniversary", - "anniversarry", "anniversary", - "anniversiary", "anniversary", - "annoucenment", "announcements", - "annoucnement", "announcement", - "announcemnet", "announcements", - "announcemnts", "announcements", - "anphetamines", "amphetamines", - "ansalisation", "nasalisation", - "ansalization", "nasalization", - "antaganistic", "antagonistic", - "antagonisitc", "antagonistic", - "antagonostic", "antagonist", - "antibioticos", "antibiotics", - "anticiaption", "anticipation", - "anticipacion", "anticipation", - "antisipation", "anticipation", - "antogonistic", "antagonistic", - "antrhopology", "anthropology", - "antrophology", "anthropology", - "apllications", "applications", - "apocalypitic", "apocalyptic", - "apologistics", "apologists", - "apologizeing", "apologizing", - "apostrophied", "apostrophe", - "apostrophies", "apostrophe", - "apperciation", "appreciation", - "applicaitons", "applications", - "appoitnments", "appointments", - "apporachable", "approachable", - "appraochable", "approachable", - "appreceating", "appreciating", - "appreciaters", "appreciates", - "appreciatied", "appreciative", - "appreicating", "appreciating", - "appreication", "appreciation", - "appretiation", "appreciation", - "appropriatin", "appropriation", - "appropriatly", "appropriately", - "appropriaton", "appropriation", - "approprietly", "appropriately", - "approstraphe", "apostrophe", - "approxiately", "approximately", - "approximatly", "approximately", - "approximetly", "approximately", - "aproximately", "approximately", - "aqcuaintance", "acquaintance", - "aqquaintance", "acquaintance", - "arbitrariliy", "arbitrarily", - "arbitrarilly", "arbitrarily", - "archetecture", "architecture", - "architechure", "architecture", - "architectual", "architectural", - "architectuur", "architecture", - "architecutre", "architecture", - "architexture", "architecture", - "arcitechture", "architecture", - "areodynamics", "aerodynamics", - "argicultural", "agricultural", - "argumentatie", "argumentative", - "arithmetisch", "arithmetic", - "armageddomon", "armageddon", - "arrengements", "arrangements", - "articifially", "artificially", - "artificailly", "artificially", - "artificiella", "artificial", - "artificually", "artificially", - "artifiically", "artificially", - "assasination", "assassination", - "assassinatin", "assassination", - "assissinated", "assassinated", - "associationg", "associating", - "assoications", "associations", - "assosiations", "associations", - "assosication", "assassination", - "assotiations", "associations", - "assymetrical", "asymmetrical", - "asthetically", "aesthetically", - "astranomical", "astronomical", - "astromonical", "astronomical", - "astronautlis", "astronauts", - "astronimical", "astronomical", - "astronomicly", "astronomical", - "athleticisim", "athleticism", - "atmosphereic", "atmospheric", - "audiobookmrs", "audiobooks", - "auhtenticate", "authenticate", - "australianas", "australians", - "australianos", "australians", - "authentisity", "authenticity", - "authorithies", "authorities", - "authoritiers", "authorities", - "authorizaton", "authorization", - "authrorities", "authorities", - "autochtonous", "autochthonous", - "autocorrrect", "autocorrect", - "automobilies", "automobile", - "automodertor", "automoderator", - "automonomous", "autonomous", - "auxilliaries", "auxiliaries", - "avaliability", "availability", - "avialability", "availability", - "awknowledged", "acknowledged", - "awknowledges", "acknowledges", - "awkwardsness", "awkwardness", - "babysittting", "babysitting", - "beaurocratic", "bureaucratic", - "beautifullly", "beautifully", - "belligerante", "belligerent", - "beuraucratic", "bureaucratic", - "billionairre", "billionaire", - "billionaries", "billionaires", - "billioniares", "billionaires", - "bioligically", "biologically", - "birmingharam", "birmingham", - "bittersweeet", "bittersweet", - "blamethrower", "flamethrower", - "blueberrries", "blueberries", - "blueprintcss", "blueprints", - "boardcasting", "broadcasting", - "bobybuilding", "bodybuilding", - "bodybuidling", "bodybuilding", - "bodybuilidng", "bodybuilding", - "bodybuliding", "bodybuilding", - "bodydbuilder", "bodybuilder", - "bombardement", "bombardment", - "boradcasting", "broadcasting", - "botivational", "motivational", - "brainwahsing", "brainwashing", - "brakethrough", "breakthrough", - "braodcasting", "broadcasting", - "brazilianese", "brazilians", - "brazilianess", "brazilians", - "breakthorugh", "breakthrough", - "breaktrhough", "breakthrough", - "breastfeedig", "breastfeeding", - "breastfeeing", "breastfeeding", - "breasttaking", "breathtaking", - "brianwashing", "brainwashing", - "broadcastors", "broadcasts", - "brotherhoood", "brotherhood", - "buearucratic", "bureaucratic", - "bueraucratic", "bureaucratic", - "bulletprooof", "bulletproof", - "bureaocratic", "bureaucratic", - "bureaucracie", "bureaucratic", - "bureaucracts", "bureaucrats", - "bureaucrates", "bureaucrats", - "bureuacratic", "bureaucratic", - "businessemen", "businessmen", - "cababilities", "capabilities", - "caclulations", "calculations", - "calcluations", "calculation", - "calcualtions", "calculations", - "calculationg", "calculating", - "calculatoare", "calculator", - "californains", "californian", - "californican", "californian", - "californinan", "californian", - "caluclations", "calculations", - "camouflagued", "camouflage", - "canceltation", "cancellation", - "cannibalisim", "cannibalism", - "canniballism", "cannibalism", - "cannotations", "connotations", - "capitalistes", "capitalists", - "caracterized", "characterized", - "carbohydrats", "carbohydrates", - "carbohyrdate", "carbohydrates", - "caricaturale", "caricature", - "caricaturile", "caricature", - "caricaturise", "caricature", - "caricaturize", "caricature", - "catastraphic", "catastrophic", - "catastrohpic", "catastrophic", - "catastrophie", "catastrophe", - "categoricaly", "categorically", - "categoriezed", "categorized", - "catergorized", "categorized", - "caterpillers", "caterpillars", - "catestrophic", "catastrophic", - "catholicisim", "catholicism", - "catholocisim", "catholicism", - "catistrophic", "catastrophic", - "catostraphic", "catastrophic", - "catostrophic", "catastrophic", - "catterpilars", "caterpillars", - "catterpillar", "caterpillar", - "celebratings", "celebrations", - "celebritites", "celebrities", - "celibrations", "celebrations", - "cententenial", "centennial", - "cercumstance", "circumstance", - "cerification", "verification", - "certificiate", "certificate", - "challengeing", "challenging", - "chamiponship", "championships", - "champinoship", "championships", - "championchip", "championship", - "championsihp", "championships", - "championsips", "championships", - "champiosnhip", "championships", - "champoinship", "championship", - "chanpionship", "championship", - "charactarize", "characterize", - "charaterized", "characterized", - "charismastic", "charismatic", - "cheerlearder", "cheerleader", - "cheerleeders", "cheerleaders", - "cheeseberger", "cheeseburger", - "cheeseborger", "cheeseburger", - "cheesebruger", "cheeseburgers", - "cheeseburges", "cheeseburgers", - "cheeseburgie", "cheeseburger", - "cheezeburger", "cheeseburger", - "chirstianity", "christianity", - "chocolateers", "chocolates", - "chrisitanity", "christianity", - "christainity", "christianity", - "christiantiy", "christianity", - "christinaity", "christianity", - "chromosomers", "chromosomes", - "chronologial", "chronological", - "chrsitianity", "christianity", - "cilivization", "civilizations", - "circulatiing", "circulating", - "circulationg", "circulating", - "circumcisied", "circumcised", - "circumcition", "circumcision", - "circumsicion", "circumcision", - "circumsision", "circumcision", - "circumsition", "circumcision", - "circumsizion", "circumcision", - "circumstanes", "circumstance", - "circumstanta", "circumstantial", - "circumstante", "circumstance", - "circuncision", "circumcision", - "circunstance", "circumstance", - "civiliaztion", "civilizations", - "civilizacion", "civilization", - "civilizaiton", "civilization", - "civilizatoin", "civilizations", - "civilizatons", "civilizations", - "civilziation", "civilizations", - "civizilation", "civilizations", - "claculations", "calculations", - "classificato", "classification", - "cockroachers", "cockroaches", - "coefficienct", "coefficient", - "coencidental", "coincidental", - "coincedental", "coincidental", - "coincidencal", "coincidental", - "coincidentia", "coincidental", - "coindidental", "coincidental", - "coinsidental", "coincidental", - "cointerpoint", "counterpoint", - "collaberator", "collaborate", - "collaboratie", "collaborate", - "collaboratin", "collaboration", - "collectivily", "collectively", - "collectivley", "collectively", - "colonialisim", "colonialism", - "colonizacion", "colonization", - "colonizators", "colonizers", - "colonozation", "colonization", - "combanations", "combinations", - "combonations", "combinations", - "comdemnation", "condemnation", - "comemmorates", "commemorates", - "comemoretion", "commemoration", - "comeptitions", "competitions", - "comfirmation", "confirmation", - "comfortabley", "comfortably", - "comfortablly", "comfortably", - "comissioning", "commissioning", - "commandemnts", "commandment", - "commandmants", "commandments", - "commandmends", "commandments", - "commemmorate", "commemorate", - "commendments", "commandments", - "commenteries", "commenters", - "commenwealth", "commonwealth", - "commerciales", "commercials", - "commerically", "commercially", - "comminicated", "communicated", - "commishioned", "commissioned", - "commishioner", "commissioner", - "commisioning", "commissioning", - "commissionar", "commissioner", - "commissionor", "commissioner", - "committments", "commitments", - "commoditites", "commodities", - "commomwealth", "commonwealth", - "commonhealth", "commonwealth", - "commonweatlh", "commonwealth", - "commonwelath", "commonwealth", - "communciated", "communicated", - "communiation", "communication", - "communicatie", "communicate", - "communicatin", "communications", - "communicaton", "communication", - "communitites", "communities", - "compansating", "compensating", - "compansation", "compensation", - "comparativly", "comparatively", - "comparisions", "comparisons", - "comparission", "comparisons", - "comparissons", "comparisons", - "compatablity", "compatibility", - "compatibiliy", "compatibility", - "compatibilty", "compatibility", - "compatiblity", "compatibility", - "compensacion", "compensation", - "compensative", "compensate", - "compesitions", "compositions", - "competetions", "competitions", - "competitevly", "competitively", - "competitiion", "competition", - "competitiors", "competitors", - "competitivly", "competitively", - "competitivos", "competitions", - "compinsating", "compensating", - "compinsation", "compensation", - "complainging", "complaining", - "completetion", "completion", - "compliations", "compilation", - "complicacion", "complication", - "complicatied", "complicate", - "complicaties", "complicate", - "complicatred", "complicate", - "complicatted", "complicate", - "complilation", "complication", - "complimation", "complication", - "complimenary", "complimentary", - "complimentje", "complimented", - "complimentry", "complimentary", - "complination", "complication", - "complitation", "complication", - "composistion", "compositions", - "compramising", "compromising", - "compremising", "compromising", - "compresssion", "compression", - "compromissen", "compromise", - "compromisses", "compromises", - "compromizing", "compromising", - "compromosing", "compromising", - "comptability", "compatibility", - "compulsivley", "compulsive", - "compulsorary", "compulsory", - "computarized", "computerized", - "comrpomising", "compromising", - "comtaminated", "contaminated", - "comtemporary", "contemporary", - "conbinations", "combinations", - "concatinated", "contaminated", - "conceivabley", "conceivably", - "concellation", "cancellation", - "concentraded", "concentrated", - "concentraing", "concentrating", - "concentraion", "concentration", - "concentrarte", "concentrate", - "concentratie", "concentrate", - "concentratin", "concentration", - "concequences", "consequences", - "concequently", "consequently", - "concersation", "conservation", - "concervation", "conservation", - "concervatism", "conservatism", - "concervative", "conservative", - "conciderable", "considerable", - "conciderably", "considerably", - "conciousness", "consciousness", - "conclusiones", "conclusions", - "conclusivley", "conclusive", - "condamnation", "condemnation", - "condemantion", "condemnation", - "condenmation", "condemnation", - "condescening", "condescending", - "condescenion", "condescension", - "conditionnal", "conditional", - "conditionned", "conditioned", - "conditionner", "conditioner", - "condmenation", "condemnation", - "condolencies", "condolences", - "condolensces", "condolences", - "condomnation", "condemnation", - "condradicted", "contradicted", - "conenctivity", "connectivity", - "confedential", "confidential", - "confederancy", "confederacy", - "confederatie", "confederate", - "confermation", "confirmation", - "confersation", "conservation", - "confessionis", "confessions", - "confidencial", "confidential", - "confidentail", "confidential", - "confidentaly", "confidently", - "confidentely", "confidently", - "confidentiel", "confidential", - "configuratin", "configurations", - "configuraton", "configuration", - "confirmacion", "confirmation", - "confrimation", "confirmation", - "confrontaion", "confrontation", - "congegration", "congregation", - "congergation", "congregation", - "congradulate", "congratulate", - "congragation", "congregation", - "congragulate", "congratulate", - "congratualte", "congratulate", - "congregacion", "congregation", - "congresional", "congressional", - "congresssman", "congressman", - "congresssmen", "congressmen", - "congretation", "congregation", - "congrigation", "congregation", - "conicidental", "coincidental", - "connatations", "connotations", - "connecticuit", "connecticut", - "connectivety", "connectivity", - "connetations", "connotations", - "connitations", "connotations", - "connonations", "connotations", - "conolization", "colonization", - "conpensating", "compensating", - "conpensation", "compensation", - "conpetitions", "competitions", - "conplimented", "complimented", - "conpromising", "compromising", - "consciouness", "consciousness", - "consciouslly", "consciously", - "consectutive", "consecutive", - "consecuences", "consequences", - "consecuentes", "consequences", - "consecuently", "consequently", - "consensuarlo", "consensual", - "consentrated", "concentrated", - "consentrates", "concentrates", - "conseqeunces", "consequence", - "consequenses", "consequences", - "consequental", "consequently", - "consequneces", "consequence", - "conservacion", "conservation", - "conservaties", "conservatives", - "conservativo", "conservation", - "conservativs", "conservatism", - "conservitave", "conservatives", - "conservitism", "conservatism", - "conservitive", "conservative", - "considerarle", "considerable", - "considerarte", "considerate", - "consideraste", "considerate", - "consideratie", "considerate", - "consideratin", "considerations", - "consideribly", "considerably", - "consilidated", "consolidated", - "consipracies", "conspiracies", - "consiquently", "consequently", - "consistantly", "consistently", - "consistencey", "consistency", - "consistentcy", "consistently", - "consitutents", "constituents", - "consoldiated", "consolidated", - "consolitated", "consolidate", - "consolodated", "consolidated", - "consoltation", "consultation", - "conspericies", "conspiracies", - "conspiracize", "conspiracies", - "conspiriator", "conspirator", - "conspiricies", "conspiracies", - "conspriacies", "conspiracies", - "consqeuences", "consequence", - "constinually", "continually", - "constitition", "constitution", - "constituante", "constituents", - "constituants", "constituents", - "constituates", "constitutes", - "constitucion", "constitution", - "constituient", "constitute", - "constituinte", "constituents", - "constitutiei", "constitute", - "constitutues", "constitute", - "constiutents", "constituents", - "constracting", "constructing", - "constraction", "construction", - "constrainsts", "constraints", - "construccion", "construction", - "construciton", "construction", - "constructeds", "constructs", - "constructief", "constructive", - "constructies", "constructs", - "constructifs", "constructs", - "constructiin", "constructing", - "constructivo", "construction", - "consturction", "construction", - "consultating", "consultation", - "consumerisim", "consumerism", - "contaiminate", "contaminate", - "contaminatie", "contaminated", - "contaminaton", "contamination", - "contaminents", "containment", - "contamporary", "contemporary", - "contanimated", "contaminated", - "contaniments", "containment", - "contemperary", "contemporary", - "contemporany", "contemporary", - "continentais", "continents", - "continential", "continental", - "contineously", "continuously", - "continiously", "continuously", - "continuacion", "continuation", - "continuating", "continuation", - "continuativo", "continuation", - "continuining", "continuing", - "contirbution", "contribution", - "contirbutors", "contributors", - "contiunation", "continuation", - "contrabution", "contribution", - "contraceptie", "contraceptives", - "contradicing", "contradicting", - "contradicion", "contradiction", - "contradicory", "contradictory", - "contradictie", "contradicted", - "contradictin", "contradiction", - "contradicton", "contradiction", - "contraticted", "contradicted", - "contribucion", "contribution", - "contribuitor", "contributor", - "contributers", "contributors", - "contributivo", "contribution", - "contributons", "contributors", - "contrictions", "contractions", - "contridicted", "contradicted", - "controlleras", "controllers", - "controlllers", "controllers", - "controverial", "controversial", - "controveries", "controversies", - "controversal", "controversial", - "controversey", "controversy", - "contructions", "contractions", - "conveinently", "conveniently", - "convencional", "conventional", - "conveniantly", "conveniently", - "converastion", "conversations", - "converdation", "conservation", - "conversacion", "conversation", - "conversaiton", "conversations", - "conversatino", "conservation", - "conversatism", "conservatism", - "conversatoin", "conversations", - "conversiones", "conversions", - "converstaion", "conversation", - "convertables", "convertibles", - "convertiable", "convertible", - "convertibile", "convertible", - "convervation", "conservation", - "convervatism", "conservatism", - "converzation", "conservation", - "convesration", "conservation", - "convienently", "conveniently", - "convorsation", "conversation", - "convseration", "conservation", - "coordenation", "coordination", - "coordiantion", "coordination", - "coordinacion", "coordination", - "coordinaters", "coordinates", - "coordinatior", "coordinator", - "coordinatore", "coordinate", - "coordonation", "coordination", - "cooridnation", "coordination", - "coorperation", "cooperation", - "coprorations", "corporations", - "corinthianos", "corinthians", - "corinthinans", "corinthians", - "corparations", "corporations", - "corperations", "corporations", - "corporativos", "corporations", - "corproations", "corporations", - "corrdination", "coordination", - "correponding", "corresponding", - "correposding", "corresponding", - "correspondes", "corresponds", - "correspondig", "corresponding", - "corresponing", "corresponding", - "corrisponded", "corresponded", - "costomizable", "customizable", - "costumizable", "customizable", - "councidental", "coincidental", - "counsellling", "counselling", - "counterfiets", "counterfeit", - "counterfited", "counterfeit", - "counterracts", "counterparts", - "countertraps", "counterparts", - "countrywides", "countryside", - "coutnerparts", "counterparts", - "coutnerpoint", "counterpoint", - "covnersation", "conservation", - "crankenstein", "frankenstein", - "creationisim", "creationism", - "creationnism", "creationism", - "creationnist", "creationist", - "creationsism", "creationism", - "creationsist", "creationist", - "creationsits", "creationists", - "credibillity", "credibility", - "crigneworthy", "cringeworthy", - "cringewhorty", "cringeworthy", - "cringeworhty", "cringeworthy", - "cringewrothy", "cringeworthy", - "cringyworthy", "cringeworthy", - "criticallity", "critically", - "criticiszing", "criticising", - "croporations", "corporations", - "crucifiction", "crucifixion", - "cuestionable", "questionable", - "culiminating", "culminating", - "cumulatative", "cumulative", - "cuntaminated", "contaminated", - "curcumcision", "circumcision", - "curcumstance", "circumstance", - "custamizable", "customizable", - "custimizable", "customizable", - "customizaton", "customization", - "customizeble", "customizable", - "customizible", "customizable", - "custumizable", "customizable", - "cuztomizable", "customizable", - "dabilitating", "debilitating", - "dangerousely", "dangerously", - "decensitized", "desensitized", - "deceptionist", "receptionist", - "declareation", "declaration", - "decomposeion", "decomposition", - "decomposited", "decomposed", - "decscription", "description", - "deffensively", "defensively", - "deficiancies", "deficiencies", - "deficiencias", "deficiencies", - "deficiensies", "deficiencies", - "definatively", "definitively", - "defininitely", "definitively", - "definitavely", "definitively", - "definitevely", "definitively", - "definitifely", "definitively", - "definitinely", "definitively", - "definititely", "definitively", - "definitivley", "definitively", - "deinitalized", "deinitialized", - "deinitalizes", "deinitializes", - "delibaretely", "deliberately", - "deliberatley", "deliberately", - "delibirately", "deliberately", - "delibitating", "debilitating", - "deliverately", "deliberately", - "delusionally", "delusively", - "demesticated", "domesticated", - "democracries", "democracies", - "democraphics", "demographics", - "democratisch", "democratic", - "demograhpics", "demographics", - "demogrpahics", "demographics", - "demonination", "denominations", - "demonstarted", "demonstrated", - "demonstartes", "demonstrates", - "demonstrabil", "demonstrably", - "demonstraion", "demonstration", - "demonstraits", "demonstrates", - "demonstrants", "demonstrates", - "demonstratie", "demonstrate", - "demonstratin", "demonstration", - "demonstrerat", "demonstrate", - "demosntrably", "demonstrably", - "demosntrated", "demonstrated", - "demosntrates", "demonstrates", - "demostration", "demonstration", - "denomenation", "denomination", - "denominacion", "denomination", - "denominatior", "denominator", - "denominatons", "denominations", - "denomonation", "denomination", - "deomgraphics", "demographics", - "depencencies", "dependencies", - "dependancies", "dependencies", - "dependencias", "dependencies", - "dependenices", "dependencies", - "dependensies", "dependencies", - "deperecation", "deprecation", - "deplacements", "replacements", - "deregualtion", "deregulation", - "deregulaiton", "deregulation", - "derugulation", "deregulation", - "describtions", "descriptions", - "descriminant", "discriminant", - "descriptivos", "descriptions", - "desctiptions", "descriptions", - "desctruction", "destruction", - "desencitized", "desensitized", - "desensatized", "desensitized", - "desensitived", "desensitized", - "desentisized", "desensitized", - "desentitized", "desensitized", - "desentizised", "desensitized", - "desginations", "destinations", - "desgustingly", "disgustingly", - "desitnations", "destinations", - "despectively", "respectively", - "despensaries", "dispensaries", - "desperatedly", "desperately", - "desperatelly", "desperately", - "desqualified", "disqualified", - "desregarding", "disregarding", - "dessertation", "dissertation", - "destiantions", "destinations", - "destinctions", "destinations", - "destractions", "distractions", - "destributors", "distributors", - "determinanti", "determination", - "determinaton", "determination", - "determinging", "determining", - "determinisic", "deterministic", - "determinisim", "determinism", - "deterministc", "deterministic", - "determinitic", "deterministic", - "detrimential", "detrimental", - "developement", "development", - "developmenet", "developments", - "develpoments", "developments", - "devolopement", "development", - "devolopments", "developments", - "diasspointed", "dissapointed", - "dicitonaries", "dictionaries", - "dictadorship", "dictatorship", - "dictarorship", "dictatorship", - "dictatorshop", "dictatorship", - "dictionaires", "dictionaries", - "didsapointed", "dissapointed", - "differencial", "differential", - "differencies", "differences", - "differentate", "differentiate", - "differnetial", "differential", - "difficulites", "difficulties", - "difficutlies", "difficulties", - "diffuculties", "difficulties", - "dimensionals", "dimensions", - "dimensionnal", "dimensional", - "dimensionsal", "dimensional", - "diplomatisch", "diplomatic", - "directionnal", "directional", - "disaapointed", "dissapointed", - "disadvandage", "disadvantaged", - "disadvantged", "disadvantaged", - "disadvantges", "disadvantages", - "disadvatange", "disadvantage", - "disadventage", "disadvantage", - "disagremeent", "disagreements", - "disapointing", "disappointing", - "disappearnce", "disappearance", - "disappearred", "disappeared", - "disapperaing", "disappearing", - "disaspointed", "dissapointed", - "disastisfied", "dissatisfied", - "disatissfied", "dissatisfied", - "disatvantage", "disadvantage", - "discertation", "dissertation", - "disciniplary", "disciplinary", - "disciplanary", "disciplinary", - "disciplenary", "disciplinary", - "disciplinare", "discipline", - "disciplinera", "disciplinary", - "disciplinery", "disciplinary", - "disclipinary", "disciplinary", - "disconencted", "disconnected", - "disconnectes", "disconnects", - "disconnectme", "disconnected", - "disconnectus", "disconnects", - "discontiuned", "discontinued", - "discountined", "discontinued", - "discreditied", "discredited", - "discreditted", "discredited", - "discriminare", "discriminate", - "discriminted", "discriminated", - "disctinction", "distinction", - "disctinctive", "distinctive", - "disctintions", "distinctions", - "discualified", "disqualified", - "discustingly", "disgustingly", - "disemination", "dissemination", - "disenchanged", "disenchanted", - "disengenuous", "disingenuous", - "disenginuous", "disingenuous", - "disensitized", "desensitized", - "disgareement", "disagreements", - "disgruntaled", "disgruntled", - "disgrunteled", "disgruntled", - "disguntingly", "disgustingly", - "disingeneous", "disingenuous", - "disingenious", "disingenuous", - "disinteresed", "disinterested", - "disintereted", "disinterested", - "dismantleing", "dismantling", - "disobediance", "disobedience", - "disobeidence", "disobedience", - "dispalcement", "displacement", - "dispapointed", "dissapointed", - "dispencaries", "dispensaries", - "dispensaires", "dispensaries", - "dispensarios", "dispensaries", - "dispensiries", "dispensaries", - "dispensories", "dispensaries", - "disqaulified", "disqualified", - "disqualifyed", "disqualified", - "disqustingly", "disgustingly", - "disrecpected", "disrespected", - "disrepsected", "disrespected", - "disresepcted", "disrespected", - "disrespecful", "disrespectful", - "disrespecing", "disrespecting", - "disrespectul", "disrespectful", - "disrespekted", "disrespected", - "disrtibution", "distributions", - "dissapearing", "disappearing", - "dissapionted", "dissapointed", - "dissapoimted", "dissapointed", - "dissapoitned", "dissapointed", - "dissaponited", "dissapointed", - "dissapoonted", "dissapointed", - "dissapounted", "dissapointed", - "dissappinted", "dissapointed", - "dissapponted", "dissapointed", - "dissastified", "dissatisfied", - "dissatisifed", "dissatisfied", - "dissatsified", "dissatisfied", - "dissepointed", "dissapointed", - "dissipointed", "dissapointed", - "dissobediant", "disobedient", - "dissobedient", "disobedient", - "dissopointed", "dissapointed", - "disspaointed", "dissapointed", - "dissppointed", "dissapointed", - "dissspointed", "dissapointed", - "distinations", "distinctions", - "distincitons", "distinctions", - "distingished", "distinguished", - "distingishes", "distinguishes", - "distinguised", "distinguished", - "distirbuting", "distributing", - "distirbution", "distribution", - "distrabution", "distribution", - "distribitors", "distributors", - "distribtuion", "distributions", - "distribucion", "distribution", - "distribuited", "distributed", - "distribuiton", "distributions", - "distribuitor", "distributor", - "distribusion", "distributions", - "distributino", "distributions", - "distributior", "distributor", - "distributons", "distributors", - "distributore", "distribute", - "distriubtion", "distributions", - "distrobution", "distribution", - "distrubances", "disturbance", - "distrubiting", "distributing", - "distrubition", "distribution", - "distrubitors", "distributors", - "distrubution", "distribution", - "distrubutors", "distributors", - "distructions", "distractions", - "distustingly", "disgustingly", - "ditactorship", "dictatorship", - "documenation", "documentation", - "documentaion", "documentation", - "documentaire", "documentaries", - "documentarse", "documentaries", - "documentarsi", "documentaries", - "domesitcated", "domesticated", - "domisticated", "domesticated", - "donesticated", "domesticated", - "donwloadable", "downloadable", - "dossapointed", "dissapointed", - "downlaodable", "downloadable", - "downloadbale", "downloadable", - "downloadeble", "downloadable", - "drankenstein", "frankenstein", - "dublications", "publications", - "dusgustingly", "disgustingly", - "dynamicallly", "dynamically", - "dyregulation", "deregulation", - "earthquackes", "earthquakes", - "earthquakers", "earthquakes", - "econimically", "economically", - "economisesti", "economists", - "educationnal", "educational", - "effectionate", "affectionate", - "effectivelly", "effectively", - "effectivenss", "effectiveness", - "efficienctly", "efficiency", - "effordlessly", "effortlessly", - "ejacualtions", "ejaculation", - "electorlytes", "electrolytes", - "electricrain", "electrician", - "electrictian", "electrician", - "electrobytes", "electrolytes", - "electrocytes", "electrolytes", - "electrolites", "electrolytes", - "electroltyes", "electrolytes", - "electronicas", "electronics", - "electronicos", "electronics", - "electroyltes", "electrolytes", - "elektrolytes", "electrolytes", - "eloctrolytes", "electrolytes", - "embarassment", "embarrassment", - "embarasssing", "embarassing", - "embarrasment", "embarrassment", - "embarressing", "embarrassing", - "embarrissing", "embarrassing", - "emberrassing", "embarrassing", - "emphetamines", "amphetamines", - "emprisonment", "imprisonment", - "encarcerated", "incarcerated", - "enceclopedia", "encyclopedia", - "enchancement", "enhancement", - "enchancments", "enchantments", - "enchantmants", "enchantments", - "enchentments", "enchantments", - "enciclopedia", "encyclopedia", - "enclycopedia", "encyclopedia", - "encorporated", "incorporated", - "encourageing", "encouraging", - "encyclapedia", "encyclopedia", - "encyclepedia", "encyclopedia", - "encyclopadia", "encyclopedia", - "encyclopeida", "encyclopedia", - "encyclopidia", "encyclopedia", - "encycolpedia", "encyclopedia", - "encyklopedia", "encyclopedia", - "encylcopedia", "encyclopedia", - "encyplopedia", "encyclopedia", - "endoresments", "endorsement", - "enemployment", "unemployment", - "enfringement", "infringement", - "enlightended", "enlightened", - "enlightenend", "enlightened", - "enlightented", "enlightened", - "enlightining", "enlightening", - "enligthening", "enlightening", - "entaglements", "entanglements", - "entartaining", "entertaining", - "enterpreneur", "entrepreneurs", - "enterprenuer", "entrepreneur", - "entertainted", "entertained", - "enthusiaists", "enthusiasts", - "enthusuastic", "enthusiastic", - "entoxication", "intoxication", - "entrepeneurs", "entrepreneurs", - "entreperneur", "entrepreneurs", - "entreprenaur", "entrepreneur", - "entrepreners", "entrepreneurs", - "entrepreneus", "entrepreneurs", - "entreprenour", "entrepreneur", - "entreprenure", "entrepreneurs", - "entreprenurs", "entrepreneurs", - "entrepreuner", "entrepreneurs", - "entretaining", "entertaining", - "enviormental", "environmental", - "enviornments", "environments", - "enviromental", "environmental", - "environemnts", "environments", - "environmentl", "environmentally", - "environmetal", "environmental", - "envrionments", "environments", - "establishmet", "establishments", - "evelutionary", "evolutionary", - "exagerrating", "exaggerating", - "exaggarating", "exaggerating", - "exaggaration", "exaggeration", - "exaggeratted", "exaggerated", - "exaggurating", "exaggerating", - "exagguration", "exaggeration", - "exceptionaly", "exceptionally", - "exceptionnal", "exceptional", - "exclusiveity", "exclusivity", - "exclusivelly", "exclusively", - "exclusivitiy", "exclusivity", - "excorciating", "excruciating", - "excrusiating", "excruciating", - "excurciating", "excruciating", - "exectuioners", "executioner", - "executioneer", "executioner", - "executionees", "executions", - "executioness", "executions", - "executionier", "executioner", - "executionner", "executioner", - "exeggerating", "exaggerating", - "exeggeration", "exaggeration", - "expeditonary", "expeditionary", - "expendatures", "expenditures", - "expendetures", "expenditures", - "expentitures", "expenditures", - "experamental", "experimental", - "expereincing", "experiencing", - "experemental", "experimental", - "experiancing", "experiencing", - "experiemntal", "experimental", - "experiemnted", "experimented", - "experimantal", "experimental", - "experimentan", "experimentation", - "experimentes", "experiments", - "experimentle", "experimented", - "experimentos", "experiments", - "experimentul", "experimental", - "expidentures", "expenditures", - "expierencing", "experiencing", - "expiremental", "experimental", - "expiremented", "experimented", - "explaination", "explanation", - "explenations", "explanations", - "expliotation", "exploitation", - "exploitaiton", "exploitation", - "exploitating", "exploitation", - "exploititive", "exploitative", - "explortation", "exploitation", - "explotiation", "exploitation", - "explotiative", "exploitative", - "expolitation", "exploitation", - "expolitative", "exploitative", - "exponentialy", "exponentially", - "expropiation", "expropriation", - "extensivelly", "extensively", - "extradiction", "extradition", - "extraordiary", "extraordinary", - "extraordinay", "extraordinary", - "extrapolerat", "extrapolate", - "extrapoloate", "extrapolate", - "extremistisk", "extremists", - "extrordinary", "extraordinary", - "extruciating", "excruciating", - "facilitatile", "facilitate", - "fahrenheight", "fahrenheit", - "falmethrower", "flamethrower", - "familiarlize", "familiarize", - "fanslaughter", "manslaughter", - "fantasticaly", "fantastically", - "fantasticlly", "fantastically", - "fashionalble", "fashionable", - "fermantation", "fermentation", - "fermentacion", "fermentation", - "fermentaiton", "fermentation", - "fermentating", "fermentation", - "fermintation", "fermentation", - "fictionaries", "dictionaries", - "figuartively", "figuratively", - "figuratevely", "figuratively", - "figurativley", "figuratively", - "figuretively", "figuratively", - "figuritively", "figuratively", - "fingerpoints", "fingerprints", - "firefigthers", "firefighters", - "flamethorwer", "flamethrower", - "flametrhower", "flamethrower", - "flanethrower", "flamethrower", - "flexibillity", "flexibility", - "flourishment", "flourishing", - "fluctiations", "fluctuations", - "flucutations", "fluctuations", - "fluxtuations", "fluctuations", - "forgivenness", "forgiveness", - "fortunatelly", "fortunately", - "framethrower", "flamethrower", - "frankenstain", "frankenstein", - "frankensteen", "frankenstein", - "frankenstine", "frankenstein", - "frankinstein", "frankenstein", - "frementation", "fermentation", - "friendzonded", "friendzoned", - "friendzonned", "friendzoned", - "friendzowned", "friendzoned", - "fringeworthy", "cringeworthy", - "fronkenstein", "frankenstein", - "fruitsations", "frustrations", - "frustrastion", "frustrations", - "fucntionally", "functionally", - "funcitonally", "functionally", - "functionable", "functional", - "functionaliy", "functionally", - "functionalty", "functionality", - "functionlity", "functionality", - "functionning", "functioning", - "fundamentais", "fundamentals", - "fundamentalt", "fundamentalist", - "fundamentaly", "fundamentally", - "fundemantals", "fundamentals", - "fundementals", "fundamentals", - "fundimentals", "fundamentals", - "furstrations", "frustrations", - "futuristisch", "futuristic", - "fwankenstein", "frankenstein", - "geneological", "genealogical", - "generacional", "generational", - "generalizare", "generalize", - "generalizate", "generalize", - "generelizing", "generalizing", - "geograhpical", "geographical", - "geographicly", "geographical", - "geographisch", "geographic", - "geogrpahical", "geographical", - "goegraphical", "geographical", - "governemntal", "governmental", - "governmently", "governmental", - "grammaticaal", "grammatical", - "grammaticaly", "grammatically", - "grandchilden", "grandchildren", - "grandchilder", "grandchildren", - "grandchilren", "grandchildren", - "grassrooters", "grassroots", - "gringeworthy", "cringeworthy", - "guantanameow", "guantanamo", - "guantanamero", "guantanamo", - "hallucinatin", "hallucinations", - "hallucinaton", "hallucination", - "handwritting", "handwriting", - "harrassments", "harassments", - "headqaurters", "headquarters", - "headquatered", "headquartered", - "healthercare", "healthcare", - "heavywieghts", "heavyweight", - "helicopteros", "helicopters", - "hererosexual", "heterosexual", - "heretosexual", "heterosexual", - "heteresexual", "heterosexual", - "hetreosexual", "heterosexual", - "highligthing", "highlighting", - "hipocritical", "hypocritical", - "hipothetical", "hypothetical", - "histarically", "historically", - "histerically", "historically", - "historicians", "historians", - "homogeneized", "homogenized", - "homogenenous", "homogeneous", - "homosexuales", "homosexuals", - "homosexualiy", "homosexuality", - "homosexualls", "homosexuals", - "homosexualty", "homosexuality", - "homosexuella", "homosexual", - "hopsitalized", "hospitalized", - "horisontally", "horizontally", - "horizantally", "horizontally", - "horiztonally", "horizontally", - "horozontally", "horizontally", - "hospitallity", "hospitality", - "hospitilized", "hospitalized", - "hospitolized", "hospitalized", - "hosptialized", "hospitalized", - "humanitarien", "humanitarian", - "humanitarion", "humanitarian", - "humanitatian", "humanitarian", - "humaniterian", "humanitarian", - "humantiarian", "humanitarian", - "huminatarian", "humanitarian", - "hurricanefps", "hurricanes", - "hyopthetical", "hypothetical", - "hypathetical", "hypothetical", - "hypertrophey", "hypertrophy", - "hypethetical", "hypothetical", - "hypocrticial", "hypocritical", - "hypocrytical", "hypocritical", - "hypotehtical", "hypothetical", - "hypotethical", "hypothetical", - "hypotherical", "hypothetical", - "hypotheticly", "hypothetical", - "hystarically", "hysterically", - "hystorically", "hysterically", - "idealistisch", "idealistic", - "identificato", "identification", - "identifierad", "identified", - "identifieras", "identifies", - "identifyable", "identifiable", - "ideologicaly", "ideologically", - "idiosyncracy", "idiosyncrasy", - "illegetimate", "illegitimate", - "illegitamate", "illegitimate", - "illegitamite", "illegitimate", - "illegitemate", "illegitimate", - "illegitimite", "illegitimate", - "illigetimate", "illegitimate", - "illigitemate", "illegitimate", - "illistration", "illustration", - "illsutration", "illustrations", - "illustartion", "illustration", - "illustraitor", "illustrator", - "illustraties", "illustrate", - "illustratior", "illustrator", - "imcompatible", "incompatible", - "imcompetence", "incompetence", - "imexperience", "inexperience", - "immediatelly", "immediately", - "immortallity", "immortality", - "imperialfist", "imperialist", - "imperialisim", "imperialism", - "imperialstic", "imperialist", - "implamenting", "implementing", - "implausibile", "implausible", - "implecations", "implications", - "implementase", "implements", - "implementasi", "implements", - "implementato", "implementation", - "implentation", "implementation", - "implimenting", "implementing", - "imporvements", "improvements", - "impossibilty", "impossibility", - "impossiblely", "impossibly", - "impossiblity", "impossibly", - "impovershied", "impoverished", - "impoversihed", "impoverished", - "imprefection", "imperfections", - "improsonment", "imprisonment", - "improviserad", "improvised", - "imrpovements", "improvements", - "imtimidating", "intimidating", - "imtimidation", "intimidation", - "inaccesibles", "inaccessible", - "inaccessable", "inaccessible", - "inaccessbile", "inaccessible", - "inaccurasies", "inaccuracies", - "inaccuraties", "inaccuracies", - "inaccuricies", "inaccuracies", - "inacuraccies", "inaccuracies", - "inadvertenly", "inadvertently", - "inappropiate", "inappropriate", - "inapproprate", "inappropriate", - "inappropriae", "inappropriately", - "inappropriet", "inappropriately", - "inattractive", "unattractive", - "inbelievable", "unbelievable", - "incarcelated", "incarcerated", - "incarcirated", "incarcerated", - "incarserated", "incarcerated", - "incedentally", "incidentally", - "incentiveise", "incentives", - "incestigator", "investigator", - "incomaptible", "incompatible", - "incomparible", "incompatible", - "incompatable", "incompatible", - "incompatibil", "incompatible", - "incompetance", "incompetence", - "incompetente", "incompetence", - "incompitable", "incompatible", - "incomptetent", "incompetent", - "inconcistent", "inconsistent", - "inconsistant", "inconsistent", - "inconsistecy", "inconsistency", - "inconsisteny", "inconsistency", - "inconveinent", "inconvenient", - "inconveniant", "inconvenient", - "inconveniece", "inconvenience", - "inconvenince", "inconvenience", - "inconvienent", "inconvenient", - "incorparated", "incorporated", - "incorperated", "incorporated", - "incorportaed", "incorporated", - "incorportate", "incorporate", - "incrediblely", "incredibly", - "incrementers", "increments", - "incremential", "incremental", - "indefinately", "indefinitely", - "indefineable", "undefinable", - "indefinetely", "indefinitely", - "indefinitive", "indefinite", - "indefinitley", "indefinitely", - "indefintiely", "indefinitely", - "indepedantly", "independently", - "indepencence", "independence", - "independance", "independence", - "independante", "independents", - "independenet", "independents", - "independenly", "independently", - "independense", "independents", - "independente", "independence", - "independetly", "independently", - "indepentents", "independents", - "indetifiable", "identifiable", - "indianaoplis", "indianapolis", - "indianopolis", "indianapolis", - "indicentally", "incidentally", - "indifferance", "indifference", - "indifferente", "indifference", - "indiffernece", "indifference", - "indimidating", "intimidating", - "indimidation", "intimidation", - "indipendence", "independence", - "indisputible", "indisputable", - "indisputibly", "indisputably", - "individuales", "individuals", - "individualty", "individuality", - "individuella", "individual", - "indiviudally", "individually", - "indivudually", "individually", - "indpendently", "independently", - "indroduction", "introduction", - "indroductory", "introductory", - "industriella", "industrial", - "industrijske", "industries", - "inefficienct", "inefficient", - "inefficienty", "inefficiently", - "inevitablely", "inevitably", - "inevitablity", "inevitably", - "inevititably", "inevitably", - "inexblicably", "inexplicably", - "inexpectedly", "unexpectedly", - "inexpereince", "inexperience", - "inexperiance", "inexperience", - "inexperieced", "inexperienced", - "inexperiened", "inexperienced", - "inexperiente", "inexperience", - "inexpierence", "inexperienced", - "inexplicabil", "inexplicably", - "inexplicibly", "inexplicably", - "infalability", "infallibility", - "infilitrated", "infiltrated", - "infiltraitor", "infiltrator", - "infiltratior", "infiltrator", - "infiltratred", "infiltrate", - "influenceing", "influencing", - "infogrpahics", "infographic", - "inforgivable", "unforgivable", - "infrantryman", "infantryman", - "infridgement", "infringement", - "infrignement", "infringement", - "ingestigator", "investigator", - "ingredientes", "ingredients", - "ingreediants", "ingredients", - "ininterested", "uninterested", - "initalizable", "initializable", - "inkompatible", "incompatible", - "inkompetence", "incompetence", - "inkonsistent", "inconsistent", - "inlightening", "enlightening", - "innersection", "intersection", - "innerstellar", "interstellar", - "inpenetrable", "impenetrable", - "inplementing", "implementing", - "inplications", "implications", - "inpoverished", "impoverished", - "inprisonment", "imprisonment", - "inproductive", "unproductive", - "inprovements", "improvements", - "inresponsive", "unresponsive", - "insentivised", "insensitive", - "insentivises", "insensitive", - "insignifiant", "insignificant", - "insignificat", "insignificant", - "insinuationg", "insinuating", - "instabillity", "instability", - "instalaltion", "installations", - "installatons", "installations", - "installatron", "installation", - "instantaneos", "instantaneous", - "instantaneus", "instantaneous", - "instantanous", "instantaneous", - "instinctivly", "instinctively", - "institutuion", "institution", - "instramental", "instrumental", - "instrcutions", "instruction", - "instrucitons", "instruction", - "instructiosn", "instruction", - "instructores", "instructors", - "instrumentos", "instruments", - "instrumentul", "instrumental", - "insturmental", "instrumental", - "instutitions", "institutions", - "insuccessful", "unsuccessful", - "insufficiant", "insufficient", - "insuffucient", "insufficient", - "insuspecting", "unsuspecting", - "intaxication", "intoxication", - "intelelctual", "intellectuals", - "intellectals", "intellectuals", - "intellectaul", "intellectuals", - "intellectuel", "intellectual", - "intellecutal", "intellectual", - "intelligance", "intelligence", - "intelligenly", "intelligently", - "intelligente", "intelligence", - "intelligenty", "intelligently", - "intelligient", "intelligent", - "intenational", "international", - "intentionnal", "intentional", - "intepretator", "interpretor", - "interatellar", "interstellar", - "interational", "international", - "intercection", "interception", - "intercepcion", "interception", - "interceptons", "interceptions", - "intereaction", "intersection", - "interections", "interactions", - "interersting", "interpreting", - "interesction", "intersection", - "interestigly", "interestingly", - "interestinly", "interestingly", - "interferance", "interference", - "interfereing", "interfering", - "interferisce", "interferes", - "interferisse", "interferes", - "interferring", "interfering", - "intergration", "integration", - "interlectual", "intellectual", - "intermediare", "intermediate", - "intermediete", "intermediate", - "intermettent", "intermittent", - "intermideate", "intermediate", - "intermidiate", "intermediate", - "internatinal", "international", - "internationl", "international", - "internations", "interactions", - "internediate", "intermediate", - "internelized", "internalized", - "internilized", "internalized", - "interperters", "interpreter", - "interperting", "interpreting", - "interprating", "interpreting", - "interpretare", "interpreter", - "interpretato", "interpretation", - "interpreteer", "interpreter", - "interpretier", "interpreter", - "interpretion", "interpreting", - "interpretter", "interpreter", - "interpriting", "interpreting", - "interraccial", "interracial", - "interractial", "interracial", - "interrogatin", "interrogation", - "interrumping", "interrupting", - "interrupteds", "interrupts", - "interruptors", "interrupts", - "interseccion", "intersection", - "interseciton", "intersections", - "interseption", "interception", - "intersetllar", "interstellar", - "interstallar", "interstellar", - "interstaller", "interstellar", - "intersteller", "interstellar", - "interstellor", "interstellar", - "intertaining", "entertaining", - "intertwinded", "intertwined", - "intertwinned", "intertwined", - "interveiwing", "interviewing", - "intervencion", "intervention", - "interveneing", "intervening", - "intervension", "intervention", - "interviening", "interviewing", - "intidimation", "intimidation", - "intillectual", "intellectual", - "intimidacion", "intimidation", - "intimidative", "intimidate", - "intimitading", "intimidating", - "intimitating", "intimidating", - "intimitation", "intimidation", - "intorduction", "introduction", - "intorductory", "introductory", - "intoxicacion", "intoxication", - "intoxination", "intoxication", - "intrepreting", "interpreting", - "intrinsicaly", "intrinsically", - "introdiction", "introduction", - "introduccion", "introduction", - "introduceras", "introduces", - "introduceres", "introduces", - "introduciton", "introduction", - "introductary", "introductory", - "introducting", "introduction", - "introductury", "introductory", - "introduktion", "introduction", - "introspectin", "introspection", - "intruduction", "introduction", - "intruductory", "introductory", - "intsrumental", "instrumental", - "intuitivelly", "intuitively", - "inturrupting", "interrupting", - "invervention", "intervention", - "investagated", "investigated", - "investagator", "investigator", - "investegated", "investigated", - "investegator", "investigator", - "investigaron", "investigator", - "investigater", "investigator", - "investigatie", "investigative", - "investigatin", "investigation", - "investigatio", "investigator", - "investigaton", "investigation", - "investingate", "investigate", - "investogator", "investigator", - "invicibility", "invisibility", - "invididually", "individually", - "invisibiltiy", "invisibility", - "invisilibity", "invisibility", - "invisivility", "invisibility", - "invlunerable", "invulnerable", - "involnerable", "invulnerable", - "involuntairy", "involuntary", - "involuntarly", "involuntary", - "invonvenient", "inconvenient", - "invulenrable", "invulnerable", - "invulernable", "invulnerable", - "invulnarable", "invulnerable", - "invulnerbale", "invulnerable", - "invulnurable", "invulnerable", - "invulverable", "invulnerable", - "invunlerable", "invulnerable", - "invurnerable", "invulnerable", - "irrationably", "irrationally", - "irrationatly", "irrationally", - "irrationella", "irrational", - "irreplacable", "irreplaceable", - "irresistable", "irresistible", - "irresistably", "irresistibly", - "irrespecitve", "irrespective", - "irresponsble", "irresponsible", - "irresponsibe", "irresponsible", - "irreverisble", "irreversible", - "irreversebly", "irreversible", - "irreversibel", "irreversible", - "irrevirsible", "irreversible", - "irrispective", "irrespective", - "irriversible", "irreversible", - "isdefinitely", "indefinitely", - "isntallation", "installation", - "isntrumental", "instrumental", - "jackonsville", "jacksonville", - "jounralistic", "journalistic", - "jouranlistic", "journalistic", - "journalisitc", "journalistic", - "journalistes", "journalists", - "judgementals", "judgements", - "juggernaunts", "juggernaut", - "juridisction", "jurisdictions", - "jurisdiccion", "jurisdiction", - "jurisdiciton", "jurisdiction", - "jurisdiktion", "jurisdiction", - "jurisfiction", "jurisdiction", - "jurisidction", "jurisdiction", - "juristiction", "jurisdiction", - "jursidiction", "jurisdiction", - "jusridiction", "jurisdiction", - "justificatin", "justifications", - "katastrophic", "catastrophic", - "kidnergarten", "kindergarten", - "kindergarden", "kindergarten", - "kingergarten", "kindergarten", - "kintergarten", "kindergarten", - "knolwedgable", "knowledgable", - "knoweldgable", "knowledgable", - "knowladgable", "knowledgable", - "knowldegable", "knowledgable", - "knowldgeable", "knowledgable", - "knowleagable", "knowledgable", - "knowledagble", "knowledgable", - "knowledeable", "knowledgable", - "knowledgabel", "knowledgable", - "knowledgeble", "knowledgeable", - "knowledgebly", "knowledgable", - "knowledgible", "knowledgable", - "knowlegdable", "knowledgable", - "knowlegeable", "knowledgeable", - "knwoledgable", "knowledgable", - "kolonization", "colonization", - "kombinations", "combinations", - "kommissioner", "commissioner", - "kompensation", "compensation", - "konfidential", "confidential", - "konfirmation", "confirmation", - "kongregation", "congregation", - "konservatism", "conservatism", - "konservative", "conservative", - "konsultation", "consultation", - "konversation", "conversation", - "koordination", "coordination", - "krankenstein", "frankenstein", - "leaglization", "legalization", - "legalizacion", "legalization", - "legalizaiton", "legalization", - "legendariske", "legendaries", - "legimitately", "legitimately", - "legislatiors", "legislators", - "legistration", "registration", - "legitamately", "legitimately", - "legitamitely", "legitimately", - "legitemately", "legitimately", - "legitimatley", "legitimately", - "legitimitely", "legitimately", - "liberatrians", "libertarians", - "libertarains", "libertarians", - "libertariens", "libertarians", - "libertaryans", "libertarians", - "libertatians", "libertarians", - "liberterians", "libertarians", - "libretarians", "libertarians", - "lighthearded", "lighthearted", - "linguisticas", "linguistics", - "linguisticos", "linguistics", - "linguistisch", "linguistics", - "litllefinger", "littlefinger", - "littelfinger", "littlefinger", - "litterfinger", "littlefinger", - "littiefinger", "littlefinger", - "littlefigner", "littlefinger", - "littlefinder", "littlefinger", - "littlepinger", "littlefinger", - "lnowledgable", "knowledgable", - "longitudonal", "longitudinal", - "madturbating", "masturbating", - "madturbation", "masturbation", - "magnificient", "magnificent", - "maintainance", "maintenance", - "maintainence", "maintenance", - "maintenaince", "maintenance", - "malfucntions", "malfunction", - "manafactured", "manufactured", - "manafacturer", "manufacturer", - "manafactures", "manufactures", - "manifactured", "manufactured", - "manifacturer", "manufacturer", - "manifactures", "manufactures", - "manifestaion", "manifestation", - "manifestanti", "manifestation", - "manipluating", "manipulating", - "manipluation", "manipulation", - "manipualting", "manipulating", - "manipualtion", "manipulation", - "manipualtive", "manipulative", - "manipulacion", "manipulation", - "manipulitive", "manipulative", - "maniuplating", "manipulating", - "maniuplation", "manipulation", - "maniuplative", "manipulative", - "manouverable", "maneuverable", - "mansalughter", "manslaughter", - "manslaugther", "manslaughter", - "mansluaghter", "manslaughter", - "manufactered", "manufactured", - "manufacterer", "manufacturer", - "manufacteres", "manufactures", - "manufacteurs", "manufactures", - "manufactored", "manufactured", - "manufactorer", "manufacturer", - "manufactores", "manufactures", - "manufactuers", "manufacturers", - "manufactuing", "manufacturing", - "manufacturas", "manufactures", - "manufacturor", "manufacturer", - "manufactuter", "manufacture", - "manufacuters", "manufactures", - "manufacutred", "manufacture", - "manufacutres", "manufactures", - "manufaturing", "manufacturing", - "manupilating", "manipulating", - "manupulating", "manipulating", - "manupulation", "manipulation", - "manupulative", "manipulative", - "marchmallows", "marshmallows", - "marganilized", "marginalized", - "margenalized", "marginalized", - "marginilized", "marginalized", - "marhsmallows", "marshmallows", - "marshamllows", "marshmallows", - "marshmallons", "marshmallows", - "masoginistic", "misogynistic", - "masogynistic", "misogynistic", - "massachusets", "massachusetts", - "massachustts", "massachusetts", - "masterbation", "masturbation", - "masterpeices", "masterpiece", - "mastrubating", "masturbating", - "mastrubation", "masturbation", - "mastubration", "masturbation", - "masturabting", "masturbating", - "masturabtion", "masturbation", - "masturbacion", "masturbation", - "masturbaited", "masturbated", - "masturbathon", "masturbation", - "masturbsting", "masturbating", - "masturdating", "masturbating", - "mastutbation", "masturbation", - "mataphorical", "metaphorical", - "mataphysical", "metaphysical", - "matchmakeing", "matchmaking", - "mathemathics", "mathematics", - "mathematican", "mathematician", - "mathematicas", "mathematics", - "mathematicks", "mathematics", - "mathematicly", "mathematical", - "mathematisch", "mathematics", - "mathemetical", "mathematical", - "matheticians", "mathematicians", - "mathimatical", "mathematical", - "mathmatician", "mathematician", - "mecahnically", "mechanically", - "mechancially", "mechanically", - "meditaciones", "medications", - "mediteranean", "mediterranean", - "mediterraean", "mediterranean", - "mediterranen", "mediterranean", - "memerization", "memorization", - "memorizacion", "memorization", - "memorozation", "memorization", - "metalurgical", "metallurgical", - "metaphisical", "metaphysical", - "metaphoricly", "metaphorical", - "metaphsyical", "metaphysical", - "metaphyiscal", "metaphysical", - "metaphyscial", "metaphysical", - "metaphysisch", "metaphysics", - "metephorical", "metaphorical", - "metephysical", "metaphysical", - "meterologist", "meteorologist", - "meterosexual", "heterosexual", - "methaporical", "metaphorical", - "methematical", "mathematical", - "metiphorical", "metaphorical", - "metophorical", "metaphorical", - "metorpolitan", "metropolitan", - "metrololitan", "metropolitan", - "metropilitan", "metropolitan", - "metroploitan", "metropolitan", - "metropolians", "metropolis", - "metropoliten", "metropolitan", - "metropolitin", "metropolitan", - "metropoliton", "metropolitan", - "microcentres", "microcenter", - "microphonies", "microphones", - "microscophic", "microscopic", - "microscopice", "microscope", - "microscoptic", "microscopic", - "midfieldiers", "midfielders", - "millenialism", "millennialism", - "millionairre", "millionaire", - "millionaries", "millionaires", - "millioniares", "millionaires", - "minimalisitc", "minimalist", - "minimalisity", "minimalist", - "mininterpret", "misinterpret", - "minipulating", "manipulating", - "minipulation", "manipulation", - "minipulative", "manipulative", - "miracilously", "miraculously", - "miracurously", "miraculous", - "miscarraiges", "miscarriage", - "miscelaneous", "miscellaneous", - "miscellanous", "miscellaneous", - "mischievious", "mischievous", - "misdameanors", "misdemeanors", - "misdeamenors", "misdemeanor", - "misfourtunes", "misfortunes", - "misgoynistic", "misogynistic", - "misinterpert", "misinterpret", - "misinterpred", "misinterpreted", - "misinterprit", "misinterpreting", - "misinterpted", "misinterpret", - "misintrepret", "misinterpret", - "misisonaries", "missionaries", - "misoganistic", "misogynistic", - "misogenistic", "misogynistic", - "misoginystic", "misogynistic", - "misognyistic", "misogynistic", - "misogonistic", "misogynistic", - "misogynisitc", "misogynistic", - "misogynsitic", "misogynistic", - "misogynystic", "misogynistic", - "missionaires", "missionaries", - "mississipppi", "mississippi", - "misspellling", "misspelling", - "misteriously", "mysteriously", - "misundersood", "misunderstood", - "misunderstod", "misunderstood", - "misygonistic", "misogynistic", - "modificacion", "modification", - "modificaiton", "modification", - "modificatons", "modifications", - "modifikation", "modification", - "modivational", "motivational", - "moisterizing", "moisturizing", - "moistorizing", "moisturizing", - "moisutrizing", "moisturizing", - "momentarilly", "momentarily", - "monolithisch", "monolithic", - "mositurizing", "moisturizing", - "motherbaords", "motherboards", - "motherborads", "motherboards", - "motivacional", "motivational", - "motovational", "motivational", - "mousturizing", "moisturizing", - "muktitasking", "multitasking", - "mulittasking", "multitasking", - "multinatinal", "multinational", - "multitaksing", "multitasking", - "munipulative", "manipulative", - "mutlitasking", "multitasking", - "mysoganistic", "misogynistic", - "mysogenistic", "misogynistic", - "mysogonistic", "misogynistic", - "mysterioulsy", "mysteriously", - "nacionalists", "nationalists", - "narcisisstic", "narcissistic", - "narcissictic", "narcissistic", - "narcissisism", "narcissism", - "narcissisist", "narcissist", - "narcissisitc", "narcissist", - "narcississts", "narcissist", - "narssicistic", "narcissistic", - "natioanlists", "nationalists", - "nationalisic", "nationalistic", - "nationalisim", "nationalism", - "nationalistc", "nationalistic", - "nationalites", "nationalist", - "nationalitic", "nationalistic", - "nationalitys", "nationalist", - "nationallity", "nationally", - "nationalsits", "nationalists", - "nationalties", "nationalist", - "nazionalists", "nationalists", - "neccessarily", "necessarily", - "neccessities", "necessities", - "necessarilly", "necessarily", - "necessitites", "necessities", - "neckbearders", "neckbeards", - "neckbeardese", "neckbeards", - "neckbeardest", "neckbeards", - "neckbeardies", "neckbeards", - "neckbeardius", "neckbeards", - "negociations", "negotiations", - "negoitations", "negotiations", - "negotiatians", "negotiations", - "negotiatiing", "negotiating", - "negotiationg", "negotiating", - "negotiatiors", "negotiations", - "neigbhorhood", "neighborhoods", - "neigbourhood", "neighbourhood", - "neighboorhod", "neighbourhood", - "neighborhing", "neighboring", - "neighborhods", "neighborhoods", - "neighbourghs", "neighbours", - "neighbourhod", "neighbourhood", - "neighbourood", "neighbourhood", - "neighbrohood", "neighborhoods", - "neighourhood", "neighborhood", - "neoroscience", "neuroscience", - "neruological", "neurological", - "neruoscience", "neuroscience", - "netropolitan", "metropolitan", - "neuorscience", "neuroscience", - "neuralogical", "neurological", - "neuroligical", "neurological", - "neurosceince", "neuroscience", - "neuroscienze", "neuroscience", - "neurosicence", "neuroscience", - "neverhteless", "nevertheless", - "nieghborhood", "neighborhood", - "norhtwestern", "northwestern", - "nothingsness", "nothingness", - "noticeablely", "noticeably", - "notificacion", "notification", - "notificaiton", "notification", - "notificatons", "notifications", - "nuerological", "neurological", - "nueroscience", "neuroscience", - "nutritionnal", "nutritional", - "obersvations", "observations", - "objectivelly", "objectively", - "objectiviser", "objectives", - "objectivitiy", "objectivity", - "obversations", "observations", - "ocassionally", "occasionally", - "occaisonally", "occasionally", - "occasioanlly", "occasionally", - "occassionaly", "occasionally", - "occationally", "occasionally", - "occurrencies", "occurrences", - "offensivelly", "offensively", - "ogranisation", "organisation", - "omniverously", "omnivorously", - "operationnal", "operational", - "opportuniste", "opportunities", - "opportunites", "opportunities", - "oppositition", "opposition", - "opthalmology", "ophthalmology", - "optimistisch", "optimistic", - "optimizacion", "optimization", - "optimizating", "optimization", - "optimziation", "optimization", - "optmizations", "optimizations", - "oragnisation", "organisation", - "orchastrated", "orchestrated", - "orchestarted", "orchestrated", - "orchestraded", "orchestrated", - "orchistrated", "orchestrated", - "orgainsation", "organisation", - "orgainzation", "organizations", - "organisaiton", "organisation", - "organisatons", "organisations", - "organistaion", "organisation", - "organizacion", "organization", - "organizaiton", "organization", - "organizativo", "organization", - "organizatons", "organizations", - "organsiation", "organisation", - "organziation", "organization", - "orginasation", "organisation", - "orginazation", "organization", - "orgnaisation", "organisations", - "originallity", "originality", - "outraegously", "outrageously", - "outrageoulsy", "outrageously", - "outragesouly", "outrageously", - "outrageuosly", "outrageously", - "outragiously", "outrageously", - "outsourceing", "outsourcing", - "overbearring", "overbearing", - "overblocking", "overclocking", - "overclcoking", "overclocking", - "overclicking", "overclocking", - "overcloaking", "overclocking", - "overclockign", "overclocking", - "overclokcing", "overclocking", - "overhearting", "overreacting", - "overheathing", "overheating", - "overhtinking", "overthinking", - "overhwelming", "overwhelming", - "overlappping", "overlapping", - "overlcocking", "overclocking", - "overreaktion", "overreaction", - "overwealming", "overwhelming", - "overwhelemed", "overwhelmed", - "overwhemling", "overwhelming", - "overwhleming", "overwhelming", - "owerpowering", "overpowering", - "painkilllers", "painkillers", - "palastinians", "palestinians", - "palesitnians", "palestinians", - "palestenians", "palestinians", - "palestinains", "palestinians", - "palestiniens", "palestinians", - "palestininan", "palestinian", - "palestininas", "palestinians", - "palistinians", "palestinians", - "palythroughs", "playthroughs", - "parapharsing", "paraphrasing", - "paraphenalia", "paraphernalia", - "paraphrashed", "paraphrase", - "paraphrazing", "paraphrasing", - "paraprashing", "paraphrasing", - "paraprhasing", "paraphrasing", - "parenthesees", "parentheses", - "parenthesies", "parenthesis", - "parliamentry", "parliamentary", - "partecipants", "participants", - "partecipated", "participated", - "parternships", "partnership", - "particapated", "participated", - "particiapnts", "participant", - "particiapted", "participated", - "participante", "participate", - "participaste", "participants", - "participatie", "participated", - "participatin", "participation", - "participatns", "participant", - "participaton", "participant", - "participents", "participants", - "particualrly", "particularly", - "particulalry", "particularly", - "particullary", "particularly", - "passionatley", "passionately", - "pathalogical", "pathological", - "pathelogical", "pathological", - "patholigical", "pathological", - "paychedelics", "psychedelics", - "paychiatrist", "psychiatrist", - "paychologist", "psychologist", - "paychopathic", "psychopathic", - "penetratiing", "penetrating", - "penisylvania", "pennsylvania", - "pennsilvania", "pennsylvania", - "pennslyvania", "pennsylvania", - "pennsylvaina", "pennsylvania", - "pennsyvlania", "pennsylvania", - "pennyslvania", "pennsylvania", - "penssylvania", "pennsylvania", - "pentsylvania", "pennsylvania", - "percentagens", "percentages", - "perferential", "preferential", - "performantes", "performances", - "performences", "performances", - "perfromances", "performances", - "peridoically", "periodically", - "peripathetic", "peripatetic", - "periphereals", "peripherals", - "peripherials", "peripherals", - "permanantely", "permanently", - "permanentely", "permanently", - "permissiable", "permissible", - "peroidically", "periodically", - "perpatrators", "perpetrators", - "perpatuating", "perpetuating", - "perpertators", "perpetrators", - "perpertrated", "perpetrated", - "perpetraitor", "perpetrator", - "perpetraters", "perpetrators", - "perpetuaters", "perpetuates", - "perpitrators", "perpetrators", - "perposefully", "purposefully", - "perposterous", "preposterous", - "perpretators", "perpetrators", - "perpsectives", "perspectives", - "perputrators", "perpetrators", - "perputuating", "perpetuating", - "persepctives", "perspectives", - "perservation", "preservation", - "perseverence", "perseverance", - "personalites", "personalities", - "personallity", "personally", - "personilized", "personalized", - "perspecitves", "perspectives", - "perspectivas", "perspectives", - "persumptuous", "presumptuous", - "perticularly", "particularly", - "pertubations", "perturbations", - "pessimisitic", "pessimistic", - "pessimisstic", "pessimistic", - "phenomenonal", "phenomenal", - "phenomenonly", "phenomenally", - "phenomonenon", "phenomenon", - "phialdelphia", "philadelphia", - "philadalphia", "philadelphia", - "philadelhpia", "philadelphia", - "philadeplhia", "philadelphia", - "philadlephia", "philadelphia", - "philedalphia", "philadelphia", - "philedelphia", "philadelphia", - "philidalphia", "philadelphia", - "philippinnes", "philippines", - "philippinoes", "philippines", - "philisophers", "philosophers", - "philisophies", "philosophies", - "phillippines", "philippines", - "philosiphers", "philosophers", - "philosiphies", "philosophies", - "philosohpers", "philosopher", - "philosohpies", "philosophies", - "philosophiae", "philosophies", - "philosophics", "philosophies", - "philosophios", "philosophies", - "philospohers", "philosophers", - "philospohies", "philosophies", - "photagrapher", "photographer", - "photochopped", "photoshopped", - "photograhper", "photographer", - "photograpers", "photographers", - "photographes", "photographs", - "photographyi", "photographic", - "photogropher", "photographer", - "photogrpahed", "photographed", - "photogrpaher", "photographer", - "photoshipped", "photoshopped", - "photoshooped", "photoshopped", - "photoshoppad", "photoshopped", - "phychedelics", "psychedelics", - "phychiatrist", "psychiatrist", - "phychologist", "psychologist", - "phychopathic", "psychopathic", - "physcedelics", "psychedelics", - "physciatrist", "psychiatrist", - "physcologist", "psychologist", - "physcopathic", "psychopathic", - "physicallity", "physically", - "physiologial", "physiological", - "pilgrimmages", "pilgrimages", - "pitchforkers", "pitchforks", - "pkaythroughs", "playthroughs", - "plabeswalker", "planeswalker", - "plaestinians", "palestinians", - "planeswaller", "planeswalker", - "planeswlaker", "planeswalker", - "planetwalker", "planeswalker", - "plansewalker", "planeswalker", - "plauthroughs", "playthroughs", - "playhtroughs", "playthroughs", - "playtgroughs", "playthroughs", - "playthorughs", "playthroughs", - "playthourghs", "playthroughs", - "playthrougth", "playthroughs", - "playthrouhgs", "playthroughs", - "playthtoughs", "playthroughs", - "playtrhoughs", "playthroughs", - "populationes", "populations", - "pornograpghy", "pornography", - "porportional", "proportional", - "portabillity", "portability", - "portagonists", "protagonists", - "positionning", "positioning", - "positivitely", "positivity", - "possessivize", "possessive", - "possibillity", "possibility", - "possiblility", "possibility", - "possiblities", "possibilities", - "powerfisting", "powerlifting", - "powerlfiting", "powerlifting", - "powerlifitng", "powerlifting", - "powerlisting", "powerlifting", - "powetlifting", "powerlifting", - "powrrlifting", "powerlifting", - "practicioner", "practitioner", - "practisioner", "practitioner", - "pratictioner", "practitioners", - "precedessors", "predecessors", - "preconveived", "preconceived", - "predacessors", "predecessors", - "predeccesors", "predecessor", - "predecesores", "predecessor", - "predescesors", "predecessors", - "predessecors", "predecessors", - "predetermind", "predetermined", - "predicessors", "predecessors", - "predocessors", "predecessors", - "predomiantly", "predominately", - "predominanty", "predominantly", - "predominatly", "predominantly", - "preferantial", "preferential", - "preferentail", "preferential", - "preformances", "performances", - "preinitalize", "preinitialize", - "preliminarly", "preliminary", - "prematurelly", "prematurely", - "premillenial", "premillennial", - "preocupation", "preoccupation", - "preperations", "preparations", - "prepetrators", "perpetrators", - "prepetuating", "perpetuating", - "prepostorous", "preposterous", - "preposturous", "preposterous", - "prerequisets", "prerequisite", - "prescirption", "prescriptions", - "prescribtion", "prescription", - "prescripcion", "prescription", - "prescriptons", "prescriptions", - "prescritpion", "prescriptions", - "presedential", "presidential", - "presentacion", "presentation", - "presentaiton", "presentations", - "preservacion", "preservation", - "preservating", "preservation", - "preservativo", "preservation", - "presidencial", "presidential", - "presidenital", "presidential", - "presidentail", "presidential", - "presnetation", "presentations", - "presonalized", "personalized", - "prespectives", "perspectives", - "presrciption", "prescriptions", - "presumpteous", "presumptuous", - "presumputous", "presumptuous", - "prevantative", "preventative", - "preventation", "presentation", - "preventetive", "preventative", - "preventitive", "preventative", - "prezidential", "presidential", - "principlaity", "principality", - "probabiliste", "probabilities", - "probabilites", "probabilities", - "probabillity", "probability", - "probablistic", "probabilistic", - "proclomation", "proclamation", - "proconceived", "preconceived", - "profesisonal", "professionals", - "professiinal", "professionalism", - "professioanl", "professionals", - "professiomal", "professionalism", - "professionel", "professional", - "professionsl", "professionalism", - "professoinal", "professionals", - "professonial", "professionals", - "proffesional", "professional", - "proficientcy", "proficiency", - "profissional", "professional", - "profitabiliy", "profitability", - "profitabilty", "profitability", - "profressions", "progressions", - "progatonists", "protagonists", - "programmeurs", "programmer", - "progressieve", "progressive", - "progressioin", "progressions", - "progressiong", "progressing", - "progressisme", "progresses", - "progressiste", "progresses", - "progressivas", "progressives", - "progressivey", "progressively", - "progressivly", "progressively", - "progressivsm", "progressives", - "progresssing", "progressing", - "progresssion", "progressions", - "progresssive", "progressives", - "prohibitting", "prohibiting", - "projecticles", "projectiles", - "proletariaat", "proletariat", - "proletariant", "proletariat", - "proletaricat", "proletariat", - "prominantely", "prominently", - "promiscuious", "promiscuous", - "promisculous", "promiscuous", - "promotionnal", "promotional", - "pronounceing", "pronouncing", - "pronunciaton", "pronunciation", - "propertional", "proportional", - "propesterous", "preposterous", - "proportianal", "proportional", - "proportionel", "proportional", - "proposterous", "preposterous", - "proprotional", "proportional", - "prostetution", "prostitution", - "prostitition", "prostitution", - "prostitucion", "prostitution", - "prostituiton", "prostitution", - "prostitutiei", "prostitute", - "protaganists", "protagonists", - "protaginists", "protagonists", - "protagnoists", "protagonists", - "protestantes", "protestants", - "protoganists", "protagonists", - "prouncements", "pronouncements", - "pruposefully", "purposefully", - "pscyhologist", "psychologist", - "pscyhopathic", "psychopathic", - "pshyciatrist", "psychiatrist", - "pshycologist", "psychologist", - "pshycopathic", "psychopathic", - "psichologist", "psychologist", - "psychaitrist", "psychiatrist", - "psychedellic", "psychedelic", - "psychedilics", "psychedelics", - "psychemedics", "psychedelics", - "psychiatirst", "psychiatrists", - "psychiatrics", "psychiatrist", - "psychiatrict", "psychiatrist", - "psychiatrits", "psychiatrists", - "psychistrist", "psychiatrist", - "psychodelics", "psychedelics", - "psycholigist", "psychologist", - "psychologial", "psychological", - "psychologits", "psychologists", - "psychologyst", "psychologist", - "psychopathes", "psychopaths", - "psychyatrist", "psychiatrist", - "puplications", "publications", - "puritannical", "puritanical", - "purpetrators", "perpetrators", - "purpetuating", "perpetuating", - "purpusefully", "purposefully", - "pyschedelics", "psychedelics", - "pyschiatrist", "psychiatrist", - "pyschologist", "psychologist", - "pyschopathic", "psychopathic", - "qualificaton", "qualification", - "qualifierais", "qualifiers", - "qualtitative", "quantitative", - "quantatitive", "quantitative", - "quantititive", "quantitative", - "quarterblack", "quarterback", - "quesitonable", "questionable", - "questionalbe", "questionable", - "questionning", "questioning", - "questionsign", "questioning", - "radioactieve", "radioactive", - "rationallity", "rationally", - "reactionairy", "reactionary", - "reactionnary", "reactionary", - "realisticaly", "realistically", - "realisticlly", "realistically", - "reasonablely", "reasonably", - "recallection", "recollection", - "reccomending", "recommending", - "reccommended", "recommended", - "recepcionist", "receptionist", - "receptionest", "receptionist", - "recgonizable", "recognizable", - "reciporcated", "reciprocate", - "reciprociate", "reciprocate", - "reciprocrate", "reciprocate", - "recognizible", "recognizable", - "recolleciton", "recollection", - "recommanding", "recommending", - "recommendeds", "recommends", - "recommendors", "recommends", - "recommeneded", "recommended", - "recommenting", "recommending", - "recongizable", "recognizable", - "recontructed", "reconstructed", - "recpetionist", "receptionist", - "recreacional", "recreational", - "recriational", "recreational", - "referenceing", "referencing", - "refirgerator", "refrigerator", - "refriderator", "refrigerator", - "refrigarator", "refrigerator", - "refrigerador", "refrigerator", - "refrigerater", "refrigerator", - "refrigirator", "refrigerator", - "regenaration", "regeneration", - "regeneracion", "regeneration", - "regestration", "registration", - "registartion", "registration", - "registrating", "registration", - "regrigerator", "refrigerator", - "regulatorias", "regulators", - "regulatories", "regulators", - "regulatorios", "regulators", - "reicarnation", "reincarnation", - "reinforcemnt", "reinforcement", - "reinitalised", "reinitialised", - "reinitalises", "reinitialises", - "reinitalized", "reinitialized", - "reinitalizes", "reinitializes", - "reinstallled", "reinstalled", - "reisntalling", "reinstalling", - "relaitonship", "relationships", - "relatinoship", "relationships", - "reliabillity", "reliability", - "reluctanctly", "reluctantly", - "remarkablely", "remarkably", - "rememberance", "remembrance", - "reminiscient", "reminiscent", - "renaissaince", "renaissance", - "renegeration", "regeneration", - "reorganision", "reorganisation", - "repalcements", "replacements", - "repersenting", "representing", - "reporduction", "reproduction", - "reporductive", "reproductive", - "reprecussion", "repercussions", - "representate", "representative", - "represention", "representing", - "representive", "representative", - "reproducable", "reproducible", - "reproduccion", "reproduction", - "reproduciton", "reproduction", - "reproducting", "reproduction", - "reproductivo", "reproduction", - "reproduktion", "reproduction", - "repsectfully", "respectfully", - "repsectively", "respectively", - "republicanas", "republicans", - "republicanos", "republicans", - "republicants", "republicans", - "republicians", "republicans", - "requerimento", "requirement", - "requeriments", "requirements", - "requierments", "requirements", - "requriements", "requirements", - "resembelance", "resemblance", - "reseptionist", "receptionist", - "reserrection", "resurrection", - "resintalling", "reinstalling", - "resistancies", "resistances", - "resistencias", "resistances", - "respecitvely", "respectively", - "respectabile", "respectable", - "respectivily", "respectively", - "respectivley", "respectively", - "respectuflly", "respectfully", - "respiratiory", "respiratory", - "responsabile", "responsible", - "responsaveis", "responsive", - "responsbilty", "responsibly", - "responsibile", "responsible", - "responsibily", "responsibility", - "responsibley", "responsibly", - "responsibliy", "responsibly", - "responsiblty", "responsibly", - "ressemblance", "resemblance", - "ressemblence", "resemblance", - "ressurection", "resurrection", - "restaurantes", "restaurants", - "restauration", "restoration", - "restauraunts", "restaurants", - "restirctions", "restrictions", - "restrainting", "restraining", - "restrcitions", "restriction", - "restricitons", "restrictions", - "resurreccion", "resurrection", - "resurrektion", "resurrection", - "retalitation", "retaliation", - "retributioon", "retribution", - "retroactivly", "retroactively", - "revolutionay", "revolutionary", - "revolutionos", "revolutions", - "rezurrection", "resurrection", - "rictatorship", "dictatorship", - "ridicilously", "ridiculously", - "ridicoulusly", "ridiculously", - "righteouness", "righteousness", - "rockerfeller", "rockefeller", - "rollercoaser", "rollercoaster", - "rollercoater", "rollercoaster", - "romanitcally", "romantically", - "roundabounts", "roundabout", - "rudimentatry", "rudimentary", - "rysurrection", "resurrection", - "sacksonville", "jacksonville", - "sacreligious", "sacrilegious", - "sacrificeing", "sacrificing", - "saksatchewan", "saskatchewan", - "salughtering", "slaughtering", - "sanctionning", "sanctioning", - "sarcasticaly", "sarcastically", - "sarcasticlly", "sarcastically", - "sascatchewan", "saskatchewan", - "saskatcehwan", "saskatchewan", - "saskatchawan", "saskatchewan", - "saskatechwan", "saskatchewan", - "sasketchawan", "saskatchewan", - "sasketchewan", "saskatchewan", - "sasktachewan", "saskatchewan", - "satasfaction", "satisfaction", - "satasfactory", "satisfactory", - "satisfaccion", "satisfaction", - "satisfacting", "satisfaction", - "satisfcation", "satisfaction", - "satisfiction", "satisfaction", - "satistactory", "satisfactory", - "satsifaction", "satisfaction", - "satsifactory", "satisfactory", - "scandanivian", "scandinavian", - "scandenavian", "scandinavian", - "scandianvian", "scandinavian", - "scandinacian", "scandinavian", - "scandinaivan", "scandinavia", - "scandinavica", "scandinavian", - "scandinavien", "scandinavian", - "scandinavion", "scandinavian", - "scandivanian", "scandinavian", - "scandonavian", "scandinavian", - "schizophrena", "schizophrenia", - "scholarhsips", "scholarships", - "scholerships", "scholarships", - "scholorships", "scholarships", - "scnadinavian", "scandinavian", - "screenshoots", "screenshot", - "sensationail", "sensational", - "sensationnal", "sensational", - "sensibilites", "sensibilities", - "sensitivitiy", "sensitivity", - "sentimentals", "sentiments", - "sertificates", "certificates", - "serveillance", "surveillance", - "seskatchewan", "saskatchewan", - "shakesperean", "shakespeare", - "shamelessely", "shamelessly", - "shamelessley", "shamelessly", - "shampionship", "championship", - "shardholders", "shareholders", - "shenanigains", "shenanigans", - "shenanigangs", "shenanigans", - "shenaniganns", "shenanigans", - "shenanighans", "shenanigans", - "shopkeeepers", "shopkeepers", - "showboarding", "snowboarding", - "siginificant", "significant", - "significanly", "significantly", - "significante", "significance", - "significanty", "significantly", - "significatly", "significantly", - "signleplayer", "singleplayer", - "simaltaneous", "simultaneous", - "simeltaneous", "simultaneous", - "similaraties", "similarities", - "similiarites", "similarities", - "similiarties", "similarities", - "similiraties", "similarities", - "similtaneous", "simultaneous", - "simliarities", "similarities", - "simlutaneous", "simultaneous", - "simpathizers", "sympathizers", - "simplistisch", "simplistic", - "simulatenous", "simultaneous", - "simulatneous", "simultaneous", - "simultaenous", "simultaneous", - "simultaneuos", "simultaneous", - "simultanious", "simultaneous", - "simulteneous", "simultaneous", - "singelplayer", "singleplayer", - "singlepalyer", "singleplayer", - "sinlgeplayer", "singleplayer", - "situationals", "situations", - "situationnal", "situational", - "skandinavian", "scandinavian", - "skateboaring", "skateboarding", - "skrawberries", "strawberries", - "slaugthering", "slaughtering", - "sloughtering", "slaughtering", - "sluaghtering", "slaughtering", - "snowballling", "snowballing", - "snowbaording", "snowboarding", - "socialistisk", "socialists", - "socialogical", "sociological", - "socioeconimc", "socioeconomic", - "socioeconmic", "socioeconomic", - "socioligical", "sociological", - "sociopolical", "sociological", - "somethingest", "somethings", - "sophisticaed", "sophisticated", - "sophisticted", "sophisticated", - "southamption", "southampton", - "southernerns", "southerners", - "sovereighnty", "sovereignty", - "sovereignety", "sovereignty", - "sovereignity", "sovereignty", - "specialistes", "specialists", - "specializare", "specialize", - "specializate", "specialize", - "specializeds", "specializes", - "specializied", "specialize", - "speciallized", "specialised", - "specifcation", "specification", - "spectacuarly", "spectacular", - "spectaculair", "spectacular", - "spectaculary", "spectacularly", - "spectacullar", "spectacularly", - "specualtions", "speculation", - "spermatozoan", "spermatozoon", - "spesifically", "specifically", - "spirituallly", "spiritually", - "spirtiuality", "spirituality", - "spirutuality", "spirituality", - "spontaneosly", "spontaneously", - "spontaneouly", "spontaneously", - "spreadhseets", "spreadsheets", - "spreadsheats", "spreadsheets", - "spreadsheeds", "spreadsheets", - "spreadsheeet", "spreadsheets", - "standartized", "standardized", - "standerdized", "standardized", - "stardardized", "standardized", - "starightened", "straightened", - "starwberries", "strawberries", - "statisticaly", "statistically", - "stereotpying", "stereotyping", - "stereotypers", "stereotypes", - "stereotypian", "stereotyping", - "steriotyping", "stereotyping", - "steroetyping", "stereotyping", - "steryotyping", "stereotyping", - "straigntened", "straightened", - "straigthened", "straightened", - "strategicaly", "strategically", - "strategiclly", "strategically", - "strawburries", "strawberries", - "streemlining", "streamlining", - "streightened", "straightened", - "strenghening", "strengthening", - "strenghtened", "strengthened", - "strengtheing", "strengthening", - "stroytelling", "storytelling", - "subconcsious", "subconscious", - "subconsicous", "subconscious", - "subcouncious", "subconscious", - "subcsription", "subscriptions", - "subesquently", "subsequently", - "subjectivety", "subjectively", - "subjectivily", "subjectively", - "subjectivley", "subjectively", - "subjudgation", "subjugation", - "subredditors", "subreddits", - "subscirption", "subscriptions", - "subsconcious", "subconscious", - "subscribbers", "subscribers", - "subscribbing", "subscribing", - "subscribirse", "subscriber", - "subscribtion", "subscription", - "subscriptons", "subscriptions", - "subscritpion", "subscriptions", - "subscrpition", "subscriptions", - "subsiquently", "subsequently", - "subsrciption", "subscriptions", - "subsricption", "subscriptions", - "substantialy", "substantially", - "substantitve", "substantive", - "substitition", "substitution", - "substituters", "substitutes", - "substitutivo", "substitution", - "substitutues", "substitutes", - "substracting", "subtracting", - "substraction", "subtraction", - "subterranian", "subterranean", - "succsessfull", "successful", - "sunconscious", "subconscious", - "supermarkeds", "supermarkets", - "supermarkers", "supermarkets", - "supermarkert", "supermarkets", - "supermarkten", "supermarket", - "supermarktes", "supermarkets", - "supernarkets", "supermarkets", - "supernatrual", "supernatural", - "supersticion", "superstition", - "superstision", "superstition", - "superstitios", "superstitious", - "superstitous", "superstitious", - "supervisiors", "supervisors", - "supervisoras", "supervisors", - "supervisores", "supervisors", - "supllemental", "supplemental", - "supplamental", "supplemental", - "supplamented", "supplemented", - "supplimental", "supplemental", - "suppresssion", "suppression", - "supscription", "subscription", - "supsiciously", "suspiciously", - "surprizingly", "surprisingly", - "surrenderred", "surrendered", - "surrundering", "surrendering", - "survaillance", "surveillance", - "survaillence", "surveillance", - "survallience", "surveillance", - "surveillence", "surveillance", - "survelliance", "surveillance", - "surviellance", "surveillance", - "survivabiity", "survivability", - "survivabiliy", "survivability", - "survivabilty", "survivability", - "susceptiable", "susceptible", - "susceptibile", "susceptible", - "suspeciously", "suspiciously", - "suspicioulsy", "suspiciously", - "suspiciuosly", "suspiciously", - "suspisiously", "suspiciously", - "sustainabily", "sustainability", - "symapthizers", "sympathizers", - "symetrically", "symmetrically", - "symmetricaly", "symmetrically", - "sympathethic", "sympathetic", - "sympathsizer", "sympathizers", - "sympathyzers", "sympathizers", - "sympethizers", "sympathizers", - "symphatizers", "sympathizers", - "sympithizers", "sympathizers", - "syncronously", "synchronously", - "sysmatically", "systematically", - "systematisch", "systematic", - "tablespooons", "tablespoon", - "tacticallity", "tactically", - "tangencially", "tangentially", - "tangenitally", "tangentially", - "tangientally", "tangentially", - "teamfighters", "teamfights", - "teansylvania", "transylvania", - "techanically", "mechanically", - "techincality", "technicality", - "technologial", "technological", - "telelevision", "television", - "teleportaion", "teleportation", - "teleportaton", "teleportation", - "temepratures", "temperatures", - "temparatures", "temperatures", - "temperaturas", "temperatures", - "temporarilly", "temporarily", - "tempreatures", "temperatures", - "tempuratures", "temperatures", - "tengentially", "tangentially", - "termendously", "tremendously", - "territorrial", "territorial", - "territorries", "territories", - "testasterone", "testosterone", - "testestorone", "testosterone", - "thanskgiving", "thanksgiving", - "theologicial", "theological", - "theoreticaly", "theoretically", - "thermomenter", "thermometer", - "thermomether", "thermometer", - "thumbnailers", "thumbnails", - "thunderboldt", "thunderbolt", - "tindergarten", "kindergarten", - "torubleshoot", "troubleshoot", - "totalitarion", "totalitarian", - "totalitatian", "totalitarian", - "touchscreeen", "touchscreen", - "traditionaly", "traditionally", - "traditionnal", "traditional", - "tradtionally", "traditionally", - "tramendously", "tremendously", - "tramsformers", "transformers", - "tramsforming", "transforming", - "tranditional", "transitional", - "tranistional", "transitional", - "tranistioned", "transitioned", - "tranlsations", "translations", - "tranmsission", "transmissions", - "transaltions", "translations", - "transaprency", "transparency", - "transational", "transitional", - "transcations", "transactions", - "transcendant", "transcendent", - "transcripton", "transcription", - "transcriptus", "transcripts", - "transesxuals", "transsexuals", - "transfarmers", "transformers", - "transfarring", "transferring", - "transferrred", "transferred", - "transformare", "transformers", - "transformase", "transforms", - "transformees", "transforms", - "transforners", "transformers", - "transfromers", "transformers", - "transfroming", "transforming", - "transgenderd", "transgendered", - "transgendred", "transgendered", - "transgenered", "transgender", - "transicional", "transitional", - "transilvania", "transylvania", - "transimssion", "transmissions", - "transisioned", "transitioned", - "translastion", "translations", - "translateing", "translating", - "translationg", "translating", - "translucient", "translucent", - "translyvania", "transylvania", - "transmisions", "transmission", - "transmisison", "transmission", - "transmissons", "transmissions", - "transmitirte", "transmitter", - "transmittted", "transmitted", - "transmorfers", "transformer", - "transofrmers", "transformers", - "transofrming", "transforming", - "transparancy", "transparency", - "transparenty", "transparency", - "transparrent", "transparent", - "transperancy", "transparency", - "transperency", "transparency", - "transplantes", "transplants", - "transporteur", "transporter", - "transportion", "transporting", - "transpotting", "transporting", - "transsmision", "transmissions", - "transylmania", "transylvania", - "transylvanai", "transylvania", - "trasnferring", "transferring", - "trasnformers", "transformers", - "trasnforming", "transforming", - "trasnmission", "transmissions", - "trasnparency", "transparency", - "trasnporting", "transporting", - "trememdously", "tremendously", - "tremendoulsy", "tremendously", - "tremondously", "tremendously", - "troubelshoot", "troubleshoot", - "troublehsoot", "troubleshoot", - "trumendously", "tremendously", - "trustworthly", "trustworthy", - "ubsubscribed", "unsubscribed", - "udnerpowered", "underpowered", - "umbelievable", "unbelievable", - "umemployment", "unemployment", - "unaccaptable", "unacceptable", - "unacceptible", "unacceptable", - "unaccpetable", "unacceptable", - "unacompanied", "unaccompanied", - "unappealling", "unappealing", - "unattractice", "unattractive", - "unautherized", "unauthorized", - "unauthroized", "unauthorized", - "unbeleivable", "unbelievable", - "unbeleivably", "unbelievably", - "unbeliavable", "unbelievable", - "unbeliavably", "unbelievably", - "unbeliebable", "unbelievable", - "unbelieveble", "unbelievable", - "unbelievibly", "unbelievably", - "unbeliveable", "unbelievable", - "unbeliveably", "unbelievably", - "unbelizeable", "unbelievable", - "unbolievable", "unbelievable", - "uncertainity", "uncertainty", - "uncertaintly", "uncertainty", - "uncompatible", "incompatible", - "unconditinal", "unconditional", - "unconsciosly", "unconsciously", - "unconsciouly", "unconsciously", - "unconsistent", "inconsistent", - "unconvenient", "inconvenient", - "unconvential", "unconventional", - "undecideable", "undecidable", - "undefinitely", "indefinitely", - "undeniablely", "undeniably", - "undergradate", "undergraduate", - "undergradute", "undergraduate", - "underminding", "undermining", - "undermineing", "undermining", - "undermineras", "undermines", - "undermineres", "undermines", - "underminging", "undermining", - "underminning", "undermining", - "undertakeing", "undertaking", - "underwhelimg", "underwhelming", - "underwheling", "underwhelming", - "undesireable", "undesirable", - "undoubtedbly", "undoubtedly", - "unemployemnt", "unemployment", - "unemplyoment", "unemployment", - "unempolyment", "unemployment", - "unenployment", "unemployment", - "unequalities", "inequalities", - "unexpectadly", "unexpectedly", - "unexpectetly", "unexpectedly", - "unexpectidly", "unexpectedly", - "unexperience", "inexperience", - "unexpextedly", "unexpectedly", - "unexplicably", "inexplicably", - "unforgetable", "unforgettable", - "unforgiveble", "unforgivable", - "unforgivible", "unforgivable", - "unfortunatly", "unfortunately", - "unfortunetly", "unfortunately", - "unilatreally", "unilaterally", - "uniliterally", "unilaterally", - "unimpresssed", "unimpressed", - "uninitalised", "uninitialised", - "uninitalized", "uninitialized", - "uninstallimg", "uninstalling", - "uninstallled", "uninstalled", - "unintentinal", "unintentional", - "uninteresing", "uninteresting", - "uninterneted", "uninterested", - "uninterruped", "uninterrupted", - "uninterupted", "uninterrupted", - "unisntalling", "uninstalling", - "unitesstates", "unitedstates", - "univerisites", "universities", - "univeristies", "universities", - "universitets", "universities", - "unliaterally", "unilaterally", - "unneccessary", "unnecessary", - "unnecesarily", "unnecessarily", - "unnecessairy", "unnecessarily", - "unnecessarly", "unnecessarily", - "unnistalling", "uninstalling", - "unpredictabe", "unpredictable", - "unpreductive", "unproductive", - "unproduktive", "unproductive", - "unrealisitic", "unrealistic", - "unreaponsive", "unresponsive", - "unreasonalby", "unreasonably", - "unrepsonsive", "unresponsive", - "unresponcive", "unresponsive", - "unresponisve", "unresponsive", - "unresponsibe", "unresponsive", - "unrestircted", "unrestricted", - "unrestrcited", "unrestricted", - "unristricted", "unrestricted", - "unseccessful", "unsuccessful", - "unsespecting", "unsuspecting", - "unsibscribed", "unsubscribed", - "unsoliciated", "unsolicited", - "unsolicitied", "unsolicited", - "unsubscirbed", "unsubscribed", - "unsubscrible", "unsubscribed", - "unsubscrided", "unsubscribed", - "unsubscriped", "unsubscribed", - "unsubscrubed", "unsubscribed", - "unsubsrcibed", "unsubscribed", - "unsucessfull", "unsuccessful", - "unsunscribed", "unsubscribed", - "unsurprizing", "unsurprising", - "unsusbcribed", "unsubscribed", - "unsustainble", "unsustainable", - "unvelievable", "unbelievable", - "unvelievably", "unbelievably", - "unviersities", "universities", - "unvulnerable", "invulnerable", - "varification", "verification", - "vegetarianas", "vegetarians", - "vegetarianos", "vegetarians", - "verficiation", "verification", - "verificacion", "verification", - "verificaiton", "verification", - "verifikation", "verification", - "vernaculaire", "vernacular", - "versatillity", "versatility", - "verticallity", "vertically", - "videogamemes", "videogames", - "visualizaton", "visualization", - "vocabularily", "vocabulary", - "vocabularity", "vocabulary", - "volonteering", "volunteering", - "volounteered", "volunteered", - "voluntarilly", "voluntarily", - "volunterring", "volunteering", - "vulnerabilty", "vulnerability", - "weightlifing", "weightlifting", - "withdrawalls", "withdrawals", - "withdrawling", "withdrawing", - "withdrawning", "withdrawing", - "wonderfullly", "wonderfully", - "worshippping", "worshipping", - "xenophobical", "xenophobia", - "abandenment", "abandonment", - "abandomnent", "abandonment", - "abandonding", "abandoning", - "abandonnent", "abandonment", - "abandonning", "abandoning", - "abbreviatin", "abbreviation", - "abbreviaton", "abbreviation", - "abdominable", "abdominal", - "abomanation", "abomination", - "abominacion", "abomination", - "abomonation", "abomination", - "abonimation", "abomination", - "aboriginial", "aboriginal", - "aborigional", "aboriginal", - "abreviation", "abbreviation", - "abritrarily", "arbitrarily", - "abritration", "arbitration", - "absolutelly", "absolutely", - "absolutelys", "absolutes", - "absolutisme", "absolutes", - "absolutiste", "absolutes", - "abstraccion", "abstraction", - "abstraktion", "abstraction", - "abstruction", "abstraction", - "abundancies", "abundances", - "academicaly", "academically", - "academicese", "academics", - "accelarated", "accelerated", - "accelarator", "accelerator", - "accelerater", "accelerator", - "acceleratie", "accelerate", - "acceleratio", "accelerator", - "acceleraton", "acceleration", - "accelorated", "accelerated", - "accelorator", "accelerator", - "acceptabelt", "acceptable", - "accesseries", "accessories", - "accessibile", "accessible", - "accessibily", "accessibility", - "accessoires", "accessories", - "accidantely", "accidently", - "accidentaly", "accidentally", - "accidentely", "accidently", - "accidential", "accidental", - "accidentily", "accidently", - "accidentlay", "accidently", - "accidentley", "accidently", - "accidentlly", "accidently", - "accomadated", "accommodated", - "accomadates", "accommodates", - "accommadate", "accommodate", - "accommidate", "accommodate", - "accomodated", "accommodated", - "accomodates", "accommodates", - "accomondate", "accommodate", - "accompained", "accompanied", - "accompanyed", "accompanied", - "accompianed", "accompanied", - "accompinied", "accompanied", - "accomplises", "accomplishes", - "accomplishs", "accomplishes", - "accomponied", "accompanied", - "accountatns", "accountants", - "accountents", "accountants", - "accquainted", "acquainted", - "accrediated", "accredited", - "accreditied", "accredited", - "accreditted", "accredited", - "acculumated", "accumulated", - "accumalated", "accumulated", - "accumelated", "accumulated", - "accumilated", "accumulated", - "accumulatin", "accumulation", - "accumulaton", "accumulation", - "accuratelly", "accurately", - "accustommed", "accustomed", - "acheivement", "achievement", - "acheivments", "achievements", - "achievemint", "achievement", - "achievemnts", "achievements", - "achievments", "achievements", - "achivements", "achievements", - "acknolwedge", "acknowledge", - "acknoweldge", "acknowledge", - "acknowleded", "acknowledged", - "acknowlegde", "acknowledge", - "acknowleged", "acknowledge", - "acknowleges", "acknowledges", - "acknwoledge", "acknowledges", - "acomplished", "accomplished", - "acopalyptic", "apocalyptic", - "acquaintace", "acquaintance", - "acquisation", "acquisition", - "activateing", "activating", - "activationg", "activating", - "activistion", "activision", - "additinally", "additionally", - "additionaly", "additionally", - "additonally", "additionally", - "adequatedly", "adequately", - "adjectiveus", "adjectives", - "administerd", "administered", - "administrar", "administrator", - "administren", "administer", - "administrer", "administer", - "administres", "administer", - "administrez", "administer", - "adminstered", "administered", - "adminstrate", "administrate", - "admittadely", "admittedly", - "adolencence", "adolescence", - "adolescance", "adolescence", - "adolescense", "adolescence", - "advantadges", "advantages", - "advantageos", "advantageous", - "advantageus", "advantageous", - "advantagous", "advantageous", - "adventerous", "adventures", - "adventourus", "adventurous", - "adversiting", "advertising", - "advertisors", "advertisers", - "advertisted", "advertised", - "aesthethics", "aesthetics", - "afficionado", "aficionado", - "affiliction", "affiliation", - "affirmitave", "affirmative", - "affirmitive", "affirmative", - "affixiation", "affiliation", - "affrimative", "affirmative", - "afgahnistan", "afghanistan", - "afganhistan", "afghanistan", - "afghanastan", "afghanistan", - "afghansitan", "afghanistan", - "afhganistan", "afghanistan", - "afternarket", "aftermarket", - "afterthougt", "afterthought", - "aggaravates", "aggravates", - "aggragating", "aggravating", - "aggregatore", "aggregate", - "aggressivly", "aggressively", - "aggresssion", "aggression", - "aggrovating", "aggravating", - "agnostacism", "agnosticism", - "agnostisicm", "agnosticism", - "agnostisism", "agnosticism", - "agnostocism", "agnosticism", - "agnsoticism", "agnosticism", - "agonsticism", "agnosticism", - "agressively", "aggressively", - "agressivley", "agressive", - "agressivnes", "agressive", - "agricolture", "agriculture", - "agriculteur", "agriculture", - "agricultral", "agricultural", - "agricultual", "agricultural", - "agricutlure", "agriculture", - "ahtleticism", "athleticism", - "alcoholicas", "alcoholics", - "alcoholicos", "alcoholics", - "alcoholisim", "alcoholism", - "algorithems", "algorithm", - "algorithims", "algorithm", - "algorithmes", "algorithms", - "algorithmns", "algorithms", - "algorithmus", "algorithms", - "algorithyms", "algorithm", - "algorythims", "algorithms", - "alientating", "alienating", - "alleigances", "allegiance", - "alltogether", "altogether", - "alterantive", "alternative", - "alternatley", "alternately", - "alternitive", "alternative", - "altheticism", "athleticism", - "altnerately", "alternately", - "altruisitic", "altruistic", - "altruistric", "altruistic", - "amalgomated", "amalgamated", - "ambulancier", "ambulance", - "amerliorate", "ameliorate", - "ammendments", "amendments", - "ampehtamine", "amphetamine", - "ampethamine", "amphetamine", - "amphetamies", "amphetamines", - "amphetamins", "amphetamines", - "amphetemine", "amphetamine", - "amphetimine", "amphetamine", - "amphetmaine", "amphetamines", - "analyticals", "analytics", - "anarchistes", "anarchists", - "ancedotally", "anecdotally", - "androgenous", "androgynous", - "anecdatally", "anecdotally", - "anecdotelly", "anecdotally", - "anecodtally", "anecdotally", - "anectodally", "anecdotally", - "anectotally", "anecdotally", - "anedoctally", "anecdotally", - "angosticism", "agnosticism", - "anihilation", "annihilation", - "anitbiotics", "antibiotics", - "annihalated", "annihilated", - "annihilaton", "annihilation", - "annihilited", "annihilated", - "annihliated", "annihilated", - "annilihated", "annihilated", - "anniversery", "anniversary", - "annonymouse", "anonymous", - "announceing", "announcing", - "announcemet", "announcements", - "announcemnt", "announcement", - "announcents", "announces", - "annoymously", "anonymously", - "anonamously", "anonymously", - "anonimously", "anonymously", - "anonmyously", "anonymously", - "anonomously", "anonymously", - "anonymousny", "anonymously", - "anouncement", "announcement", - "antagonisic", "antagonistic", - "antagonistc", "antagonistic", - "antagonstic", "antagonist", - "anthropolgy", "anthropology", - "anthropoloy", "anthropology", - "antibiodics", "antibiotics", - "antibioitcs", "antibiotic", - "antibioitic", "antibiotic", - "antibitoics", "antibiotics", - "antiboitics", "antibiotics", - "anticapated", "anticipated", - "anticiapted", "anticipated", - "anticipatin", "anticipation", - "antiobitics", "antibiotic", - "antiquaited", "antiquated", - "antisipated", "anticipated", - "apacolyptic", "apocalyptic", - "apocaliptic", "apocalyptic", - "apocalpytic", "apocalyptic", - "apocalytpic", "apocalyptic", - "apolagizing", "apologizing", - "apolegetics", "apologetics", - "apologistas", "apologists", - "apologistes", "apologists", - "apostrophie", "apostrophe", - "apparantely", "apparently", - "appareances", "appearances", - "apparentely", "apparently", - "appartments", "apartments", - "appeareance", "appearance", - "appearences", "appearances", - "apperciated", "appreciated", - "apperciates", "appreciates", - "appereances", "appearances", - "applicabile", "applicable", - "applicaiton", "application", - "applicatins", "applicants", - "applicatons", "applications", - "appoitnment", "appointments", - "apporaching", "approaching", - "apporpriate", "appropriate", - "apporximate", "approximate", - "appraoching", "approaching", - "apprearance", "appearance", - "apprecaited", "appreciated", - "apprecaites", "appreciates", - "appreciaite", "appreciative", - "appreciatie", "appreciative", - "appreciatin", "appreciation", - "appreciaton", "appreciation", - "appreciatve", "appreciative", - "appreicated", "appreciated", - "appreicates", "appreciates", - "apprentince", "apprentice", - "appriciated", "appreciated", - "appriciates", "appreciates", - "apprieciate", "appreciate", - "appropirate", "appropriate", - "appropraite", "appropriate", - "appropriato", "appropriation", - "approxamate", "approximate", - "approxiamte", "approximate", - "approxmiate", "approximate", - "aprehensive", "apprehensive", - "apsirations", "aspirations", - "aqcuisition", "acquisition", - "aquaintance", "acquaintance", - "aquiantance", "acquaintance", - "arbitrairly", "arbitrarily", - "arbitralily", "arbitrarily", - "arbitrarely", "arbitrarily", - "arbitrarion", "arbitration", - "arbitratily", "arbitrarily", - "arbritarily", "arbitrarily", - "arbritation", "arbitration", - "arcaheology", "archaeology", - "archaoelogy", "archeology", - "archeaology", "archaeology", - "archimedian", "archimedean", - "architechts", "architect", - "architectes", "architects", - "architecure", "architecture", - "argiculture", "agriculture", - "argumentate", "argumentative", - "aribtrarily", "arbitrarily", - "aribtration", "arbitration", - "arithmentic", "arithmetic", - "arithmethic", "arithmetic", - "arithmetric", "arithmetic", - "armagedddon", "armageddon", - "armageddeon", "armageddon", - "arrangments", "arrangements", - "arrengement", "arrangement", - "articluated", "articulated", - "articualted", "articulated", - "artifically", "artificially", - "artificialy", "artificially", - "aspergerers", "aspergers", - "asphyxation", "asphyxiation", - "aspriations", "aspirations", - "assasinated", "assassinated", - "assasinates", "assassinates", - "assassiante", "assassinate", - "assassinare", "assassinate", - "assassinatd", "assassinated", - "assassinato", "assassination", - "assassinats", "assassins", - "assassinted", "assassinated", - "assembleing", "assembling", - "assemblying", "assembling", - "assertation", "assertion", - "assignemnts", "assignments", - "assimialted", "assimilate", - "assimilatie", "assimilate", - "assimilerat", "assimilate", - "assimiliate", "assimilate", - "assimliated", "assimilate", - "assingments", "assignments", - "assistantes", "assistants", - "assocaition", "associations", - "associaiton", "associations", - "associaties", "associates", - "associatons", "associations", - "assoication", "association", - "assosiating", "associating", - "assosiation", "association", - "assoziation", "association", - "assumptious", "assumptions", - "astonashing", "astonishing", - "astonoshing", "astonishing", - "astronaught", "astronaut", - "astronaunts", "astronaut", - "astronautas", "astronauts", - "astronautes", "astronauts", - "asychronous", "asynchronous", - "asyncronous", "asynchronous", - "atatchments", "attachments", - "atheistisch", "atheistic", - "athelticism", "athleticism", - "athletecism", "athleticism", - "athleticsim", "athleticism", - "athletisicm", "athleticism", - "athletisism", "athleticism", - "atmopsheric", "atmospheric", - "atmoshperic", "atmospheric", - "atmosoheric", "atmospheric", - "atomspheric", "atmospheric", - "atrocitites", "atrocities", - "attachemnts", "attachments", - "attackerasu", "attackers", - "attackerats", "attackers", - "attactments", "attachments", - "attributred", "attributed", - "attributted", "attribute", - "attrocities", "atrocities", - "audiobookas", "audiobooks", - "audioboooks", "audiobook", - "auotcorrect", "autocorrect", - "austrailans", "australians", - "austrailian", "australian", - "australiaan", "australians", - "australiams", "australians", - "australiens", "australians", - "australlian", "australian", - "authenticiy", "authenticity", - "authenticor", "authenticator", - "authenticty", "authenticity", - "authorative", "authoritative", - "authoritate", "authoritative", - "authoroties", "authorities", - "autoatttack", "autoattack", - "autocoreect", "autocorrect", - "autocorrekt", "autocorrect", - "autocorrent", "autocorrect", - "autocorrext", "autocorrect", - "autoctonous", "autochthonous", - "autokorrect", "autocorrect", - "automaticly", "automatically", - "automatonic", "automation", - "automoblies", "automobile", - "auxillaries", "auxiliaries", - "availabiliy", "availability", - "availabilty", "availability", - "availablity", "availability", - "awesoneness", "awesomeness", - "babysittter", "babysitter", - "backbacking", "backpacking", - "backgorunds", "backgrounds", - "backhacking", "backpacking", - "backjacking", "backpacking", - "backtacking", "backpacking", - "bangaldeshi", "bangladesh", - "bangladesch", "bangladesh", - "barceloneta", "barcelona", - "bargainning", "bargaining", - "battelfield", "battlefield", - "battelfront", "battlefront", - "battelships", "battleship", - "battlefeild", "battlefield", - "battlefiend", "battlefield", - "battlefiled", "battlefield", - "battlefornt", "battlefront", - "battlehsips", "battleship", - "beastiality", "bestiality", - "beaurocracy", "bureaucracy", - "beautyfully", "beautifully", - "behaviorial", "behavioral", - "belittleing", "belittling", - "belittlling", "belittling", - "belligerant", "belligerent", - "belligirent", "belligerent", - "bellweather", "bellwether", - "benefitical", "beneficial", - "bestiallity", "bestiality", - "beuatifully", "beautifully", - "beuraucracy", "bureaucracy", - "beuraucrats", "bureaucrats", - "billegerent", "belligerent", - "billionairs", "billionaires", - "billionarie", "billionaire", - "billioniare", "billionaire", - "biologicaly", "biologically", - "birthdayers", "birthdays", - "birthdaymas", "birthdays", - "bittersweat", "bittersweet", - "bitterwseet", "bittersweet", - "blackberrry", "blackberry", - "blacksmitch", "blacksmith", - "bloodboorne", "bloodborne", - "bluebarries", "blueberries", - "blueburries", "blueberries", - "blueprients", "blueprints", - "bodybuildig", "bodybuilding", - "bodybuildng", "bodybuilding", - "bodybuiling", "bodybuilding", - "bombardeada", "bombarded", - "bombardeado", "bombarded", - "bombarderad", "bombarded", - "bordelrands", "borderlands", - "bordlerands", "borderlands", - "bortherhood", "brotherhood", - "bourgeousie", "bourgeois", - "boycottting", "boycotting", - "bracelettes", "bracelets", - "brainwahsed", "brainwashed", - "brainwasing", "brainwashing", - "braziliians", "brazilians", - "breakthough", "breakthrough", - "breakthrouh", "breakthrough", - "breathtakng", "breathtaking", - "brianwashed", "brainwashed", - "brillaintly", "brilliantly", - "broadcasing", "broadcasting", - "broadcastes", "broadcasts", - "broderlands", "borderlands", - "brotherwood", "brotherhood", - "buddhistisk", "buddhists", - "buearucrats", "bureaucrats", - "bueraucracy", "bureaucracy", - "bueraucrats", "bureaucrats", - "buisnessman", "businessman", - "buisnessmen", "businessmen", - "bullerproof", "bulletproof", - "bulletbroof", "bulletproof", - "bulletproff", "bulletproof", - "bulletprrof", "bulletproof", - "bullitproof", "bulletproof", - "bureacuracy", "bureaucracy", - "bureaocracy", "bureaucracy", - "bureaocrats", "bureaucrats", - "bureaucraps", "bureaucrats", - "bureaucrash", "bureaucrats", - "bureaucrasy", "bureaucrats", - "bureaucrazy", "bureaucracy", - "bureuacracy", "bureaucracy", - "bureuacrats", "bureaucrats", - "burueacrats", "bureaucrats", - "businessnes", "businessmen", - "busniessmen", "businessmen", - "butterfiles", "butterflies", - "butterfleye", "butterfly", - "butterflyes", "butterflies", - "butterfries", "butterflies", - "butterlfies", "butterflies", - "caclulating", "calculating", - "caclulation", "calculation", - "caclulators", "calculators", - "cailbration", "calibration", - "calbiration", "calibration", - "calcualting", "calculating", - "calcualtion", "calculations", - "calcualtors", "calculators", - "calculaters", "calculators", - "calculatios", "calculators", - "calculatons", "calculations", - "calibartion", "calibration", - "calibraiton", "calibration", - "califorinan", "californian", - "californain", "californian", - "californica", "california", - "californien", "californian", - "californiia", "californian", - "californina", "californian", - "californnia", "californian", - "califronian", "californian", - "caluclating", "calculating", - "caluclation", "calculation", - "caluclators", "calculators", - "caluculated", "calculated", - "caluiflower", "cauliflower", - "camouflague", "camouflage", - "camouflauge", "camouflage", - "campagining", "campaigning", - "campainging", "campaigning", - "canadianese", "canadians", - "cannabilism", "cannibalism", - "cannabolism", "cannibalism", - "canniablism", "cannibalism", - "cannibalizm", "cannibalism", - "cannibaljim", "cannibalism", - "cannibalsim", "cannibalism", - "cannibilism", "cannibalism", - "cannobalism", "cannibalism", - "cannotation", "connotation", - "capabilites", "capabilities", - "capabilitiy", "capability", - "capabillity", "capability", - "capacitaron", "capacitor", - "capacitores", "capacitors", - "capatilists", "capitalists", - "capatilized", "capitalized", - "caperbility", "capability", - "capitalisim", "capitalism", - "capitilists", "capitalists", - "capitilized", "capitalized", - "capitolists", "capitalists", - "capitolized", "capitalized", - "captialists", "capitalists", - "captialized", "capitalized", - "cariactures", "caricature", - "carniverous", "carnivorous", - "castatrophe", "catastrophe", - "catagorized", "categorized", - "catapillars", "caterpillars", - "catapillers", "caterpillars", - "catasthrope", "catastrophe", - "catastraphe", "catastrophe", - "catastrohpe", "catastrophe", - "catastropic", "catastrophic", - "categroized", "categorized", - "catepillars", "caterpillars", - "catergorize", "categorize", - "caterogized", "categorized", - "caterpilars", "caterpillars", - "caterpiller", "caterpillar", - "catholacism", "catholicism", - "catholicsim", "catholicism", - "catholisicm", "catholicism", - "catholisism", "catholicism", - "catholizism", "catholicism", - "catholocism", "catholicism", - "catogerized", "categorized", - "catterpilar", "caterpillar", - "cauilflower", "cauliflower", - "caulfilower", "cauliflower", - "celebartion", "celebrations", - "celebirties", "celebrities", - "celebracion", "celebration", - "celebrasion", "celebrations", - "celebratons", "celebrations", - "centipeddle", "centipede", - "cerimonious", "ceremonious", - "certaintity", "certainty", - "certificaat", "certificate", - "certificare", "certificate", - "certificato", "certification", - "certificats", "certificates", - "challanging", "challenging", - "challeneged", "challenged", - "challeneger", "challenger", - "challeneges", "challenges", - "chameleooon", "chameleon", - "championshp", "championship", - "championsip", "championship", - "chancellour", "chancellor", - "charachters", "characters", - "charasmatic", "charismatic", - "charimastic", "charismatic", - "charsimatic", "charismatic", - "cheerleadra", "cheerleader", - "cheerleards", "cheerleaders", - "cheerleeder", "cheerleader", - "cheesebuger", "cheeseburger", - "cheeseburgs", "cheeseburgers", - "chihuahuita", "chihuahua", - "childrenmrs", "childrens", - "chloesterol", "cholesterol", - "cholesteral", "cholesterol", - "cholestoral", "cholesterol", - "cholestorol", "cholesterol", - "cholosterol", "cholesterol", - "chormosomes", "chromosomes", - "christianty", "christianity", - "chromasomes", "chromosomes", - "chromesomes", "chromosomes", - "chromisomes", "chromosomes", - "chromosones", "chromosomes", - "chromossome", "chromosomes", - "chromozomes", "chromosomes", - "chronicales", "chronicles", - "chronichles", "chronicles", - "cicrulating", "circulating", - "cincinnasti", "cincinnati", - "cincinnatti", "cincinnati", - "cincinnnati", "cincinnati", - "circimcised", "circumcised", - "circluating", "circulating", - "circualtion", "circulation", - "circulacion", "circulation", - "circumcison", "circumcision", - "circumsiced", "circumcised", - "circumsised", "circumcised", - "circumstace", "circumstance", - "circumvrent", "circumvent", - "circuncised", "circumcised", - "cirticising", "criticising", - "ciruclating", "circulating", - "ciruclation", "circulation", - "citicenship", "citizenship", - "citisenship", "citizenship", - "citizinship", "citizenship", - "civilizatin", "civilizations", - "civilizaton", "civilization", - "claculators", "calculators", - "classifides", "classified", - "cleanilness", "cleanliness", - "cleanleness", "cleanliness", - "cleanlyness", "cleanliness", - "cleansiness", "cleanliness", - "cliffbanger", "cliffhanger", - "cliffhander", "cliffhanger", - "cliffhangar", "cliffhanger", - "clifthanger", "cliffhanger", - "cockaroches", "cockroaches", - "cockraoches", "cockroaches", - "cockroackes", "cockroaches", - "cocktailers", "cocktails", - "coefficeint", "coefficient", - "coefficiant", "coefficient", - "coincedince", "coincidence", - "coincidance", "coincidence", - "coincidense", "coincidence", - "coincidente", "coincidence", - "coincidince", "coincidence", - "coinsidence", "coincidence", - "collabarate", "collaborate", - "collaberate", "collaborate", - "collaborant", "collaborate", - "collaborare", "collaborate", - "collaborato", "collaboration", - "collapseing", "collapsing", - "collaterial", "collateral", - "collectieve", "collective", - "collectivly", "collectively", - "collectivos", "collections", - "collobarate", "collaborate", - "colloborate", "collaborate", - "colonializm", "colonialism", - "colonialsim", "colonialism", - "colonianism", "colonialism", - "colonizaton", "colonization", - "comaprisons", "comparisons", - "combiantion", "combinations", - "combinacion", "combination", - "combinaison", "combinations", - "combinaiton", "combinations", - "combinatino", "combinations", - "combinatins", "combinations", - "combinatios", "combinations", - "combinining", "combining", - "combonation", "combination", - "comediantes", "comedians", - "comeptition", "competition", - "comeptitive", "competitive", - "comeptitors", "competitors", - "comfertable", "comfortable", - "comfertably", "comfortably", - "comfortabel", "comfortably", - "comfortabil", "comfortably", - "comfrotable", "comfortable", - "comftorable", "comfortable", - "comftorably", "comfortably", - "comisioning", "commissioning", - "comissioned", "commissioned", - "comissioner", "commissioner", - "commandered", "commanded", - "commandmant", "commandment", - "commantator", "commentator", - "commendment", "commandment", - "commentarea", "commenter", - "commentaren", "commenter", - "commentater", "commentator", - "commenteers", "commenter", - "commentries", "commenters", - "commercialy", "commercially", - "commericals", "commercials", - "commericial", "commercial", - "comminicate", "communicate", - "comminucate", "communicate", - "commisioned", "commissioned", - "commisioner", "commissioner", - "commisssion", "commissions", - "committment", "commitment", - "commodoties", "commodities", - "commomplace", "commonplace", - "commonspace", "commonplace", - "commonweath", "commonwealth", - "commonwelth", "commonwealth", - "commuincate", "communicated", - "communciate", "communicate", - "communicted", "communicated", - "communistas", "communists", - "communistes", "communists", - "compability", "compatibility", - "compalation", "compilation", - "compansated", "compensated", - "comparabile", "comparable", - "comparasion", "comparison", - "comparasons", "comparisons", - "comparement", "compartment", - "comparetive", "comparative", - "comparision", "comparison", - "comparisson", "comparisons", - "comparitave", "comparative", - "comparitive", "comparative", - "comparsions", "comparisons", - "compassione", "compassionate", - "compasssion", "compassion", - "compatabile", "compatible", - "compatative", "comparative", - "compatiable", "compatible", - "compatibile", "compatible", - "compatibily", "compatibility", - "compeditive", "competitive", - "compeditors", "competitors", - "compeitions", "competitions", - "compeittion", "competitions", - "compelation", "compilation", - "compensante", "compensate", - "compensatie", "compensate", - "compensatin", "compensation", - "compenstate", "compensate", - "comperative", "comparative", - "compesition", "composition", - "competation", "computation", - "competative", "competitive", - "competators", "competitors", - "competetion", "competition", - "competetors", "competitors", - "competiters", "competitors", - "competiting", "competition", - "competitior", "competitor", - "competitivo", "competition", - "competitoin", "competitions", - "competitons", "competitors", - "competution", "computation", - "compilacion", "compilation", - "compilcated", "complicate", - "compination", "compilation", - "compinsated", "compensated", - "compitation", "computation", - "compitetion", "competitions", - "complacient", "complacent", - "complciated", "complicate", - "compleation", "compilation", - "complecated", "complicated", - "completaste", "completes", - "completeing", "completing", - "completeion", "completion", - "completelly", "completely", - "completelyl", "completely", - "completelys", "completes", - "completenes", "completes", - "complexitiy", "complexity", - "compliacted", "complicate", - "compliation", "compilation", - "complicarte", "complicate", - "complicatie", "complicit", - "complicatii", "complicit", - "complicatin", "complicit", - "complictaed", "complicate", - "complimente", "complement", - "complimenty", "complimentary", - "complusions", "compulsion", - "compolation", "compilation", - "componenets", "components", - "componentes", "components", - "composicion", "composition", - "composiiton", "compositions", - "composision", "compositions", - "compositied", "composite", - "composities", "composite", - "compositoin", "compositions", - "compositons", "compositions", - "compositore", "composite", - "compostiion", "compositions", - "compotition", "composition", - "compramised", "compromised", - "compramises", "compromises", - "compremised", "compromised", - "compremises", "compromises", - "comprension", "compression", - "compresores", "compressor", - "compresssed", "compressed", - "compresssor", "compressor", - "comprimised", "compromised", - "comprimises", "compromises", - "compromessi", "compromises", - "compromisng", "compromising", - "compromisse", "compromises", - "compromisso", "compromises", - "compromized", "compromised", - "compulstion", "compulsion", - "compunation", "computation", - "computacion", "computation", - "computating", "computation", - "computition", "computation", - "conceivibly", "conceivably", - "concencrate", "concentrate", - "concentrace", "concentrate", - "concentrade", "concentrated", - "concentrait", "concentrate", - "concentrant", "concentrate", - "concentrare", "concentrate", - "concentrato", "concentration", - "concertmate", "concentrate", - "conceviable", "conceivable", - "conceviably", "conceivably", - "concidering", "considering", - "conciveable", "conceivable", - "conciveably", "conceivably", - "conclsuions", "concussions", - "concludendo", "concluded", - "conclussion", "conclusions", - "conclussive", "conclusive", - "conclutions", "conclusions", - "concsiously", "consciously", - "conculsions", "conclusions", - "concusssion", "concussions", - "condeferacy", "confederacy", - "condicional", "conditional", - "condidtions", "conditions", - "conditionar", "conditioner", - "conditionel", "conditional", - "condolances", "condolences", - "condolenses", "condolences", - "condolonces", "condolences", - "conductiong", "conducting", - "condulences", "condolences", - "conenctions", "connections", - "conescutive", "consecutive", - "confedaracy", "confederacy", - "confedarate", "confederate", - "confederecy", "confederacy", - "conferances", "conferences", - "conferedate", "confederate", - "confererate", "confederate", - "confescated", "confiscated", - "confesssion", "confessions", - "confidantly", "confidently", - "configurare", "configure", - "configurate", "configure", - "configurato", "configuration", - "confilcting", "conflicting", - "confisgated", "confiscated", - "conflciting", "conflicting", - "confortable", "comfortable", - "confrontato", "confrontation", - "confussions", "confessions", - "congrassman", "congressman", - "congratuate", "congratulate", - "conicidence", "coincidence", - "conjonction", "conjunction", - "conjucntion", "conjunction", - "conjuncting", "conjunction", - "conlcusions", "conclusions", - "connatation", "connotation", - "connecitcut", "connecticut", - "connecticon", "connection", - "connectiong", "connecting", - "connectivty", "connectivity", - "connetation", "connotation", - "connonation", "connotation", - "connotacion", "connotation", - "conontation", "connotation", - "conotations", "connotations", - "conquerring", "conquering", - "consdidered", "considered", - "consectuive", "consecutive", - "consecuence", "consequence", - "conseguence", "consequence", - "conselation", "consolation", - "consentrate", "concentrate", - "consequenes", "consequence", - "consequense", "consequences", - "consequente", "consequence", - "consequenty", "consequently", - "consequtive", "consecutive", - "conservanti", "conservation", - "conservatie", "conservatives", - "conservaton", "conservation", - "consficated", "confiscated", - "considerabe", "considerate", - "considerais", "considers", - "considerant", "considerate", - "considerato", "consideration", - "considerble", "considerable", - "considerbly", "considerably", - "considereis", "considers", - "consilation", "consolation", - "consilidate", "consolidate", - "consistance", "consistency", - "consistenly", "consistently", - "consistensy", "consistency", - "consistenty", "consistently", - "consitution", "constitution", - "conslutants", "consultant", - "consolacion", "consolation", - "consoldiate", "consolidate", - "consolidare", "consolidate", - "consolodate", "consolidate", - "consomation", "consolation", - "conspiraces", "conspiracies", - "conspiracys", "conspiracies", - "conspirancy", "conspiracy", - "constantins", "constants", - "constantivs", "constants", - "constarints", "constraint", - "constituant", "constituent", - "constituion", "constitution", - "constituite", "constitute", - "constitutie", "constitutes", - "constrating", "constraint", - "constriants", "constraints", - "construcing", "constructing", - "construcion", "construction", - "construcive", "constructive", - "constructie", "constructive", - "constructos", "constructs", - "constructur", "constructor", - "constructus", "constructs", - "constuction", "construction", - "consturcted", "constructed", - "consuelling", "counselling", - "consulation", "consolation", - "consultaion", "consultation", - "consultanti", "consultation", - "consumation", "consumption", - "consumbales", "consumables", - "consumersim", "consumerism", - "consumibles", "consumables", - "contagiosum", "contagious", - "containered", "contained", - "containmemt", "containment", - "containters", "containers", - "containting", "containing", - "contaminato", "contamination", - "contaminent", "containment", - "contaminted", "contaminated", - "contancting", "contracting", - "contanimate", "contaminated", - "contemplare", "contemplate", - "contempoary", "contemporary", - "contemporay", "contemporary", - "contencious", "contentious", - "contenental", "continental", - "contengency", "contingency", - "contenintal", "continental", - "contenplate", "contemplate", - "contensious", "contentious", - "contentants", "contestants", - "contentuous", "contentious", - "contestaste", "contestants", - "contestents", "contestants", - "contianment", "containment", - "contientous", "contentious", - "contimplate", "contemplate", - "continenets", "continents", - "continentes", "continents", - "continentul", "continental", - "contingancy", "contingency", - "contingient", "contingent", - "contingincy", "contingency", - "continously", "continuously", - "continuarla", "continual", - "continuarlo", "continual", - "continuasse", "continues", - "continueing", "continuing", - "continuemos", "continues", - "continueous", "continuous", - "continuious", "continuous", - "continuning", "continuing", - "continunity", "continuity", - "continuosly", "continuously", - "continuting", "continuing", - "continutity", "continuity", - "continuuing", "continuing", - "continuuity", "continuity", - "contirbuted", "contributed", - "contiunally", "continually", - "contraccion", "contraction", - "contraddice", "contradicted", - "contradices", "contradicts", - "contradtion", "contraction", - "contraversy", "controversy", - "contreversy", "controversy", - "contribuent", "contribute", - "contribuito", "contribution", - "contributer", "contributor", - "contributie", "contribute", - "contributin", "contribution", - "contributos", "contributors", - "contribuyes", "contributes", - "contricting", "contracting", - "contriction", "contraction", - "contridicts", "contradicts", - "contriversy", "controversy", - "controleurs", "controllers", - "controllore", "controllers", - "controvercy", "controversy", - "controversa", "controversial", - "contrubutes", "contributes", - "contructing", "contracting", - "contruction", "construction", - "contructors", "contractors", - "conveinence", "convenience", - "conveneince", "convenience", - "conveniance", "convenience", - "conveniente", "convenience", - "convenietly", "conveniently", - "conventinal", "conventional", - "converitble", "convertible", - "conversaion", "conversion", - "conversatin", "conversations", - "converseley", "conversely", - "converstion", "conversion", - "convertirea", "converter", - "convertirle", "convertible", - "convertirme", "converter", - "convertirte", "converter", - "convicitons", "convictions", - "convienence", "convenience", - "convienient", "convenient", - "convinceing", "convincing", - "convincente", "convenient", - "convincersi", "convinces", - "convirtible", "convertible", - "cooperacion", "cooperation", - "cooperativo", "cooperation", - "cooporation", "cooperation", - "cooporative", "cooperative", - "coordenated", "coordinated", - "coordenates", "coordinates", - "coordianted", "coordinated", - "coordiantes", "coordinates", - "coordiantor", "coordinator", - "coordinador", "coordinator", - "coordinants", "coordinates", - "coordinater", "coordinator", - "coordinaton", "coordination", - "coordonated", "coordinated", - "coordonates", "coordinates", - "coordonator", "coordinator", - "cooridnated", "coordinated", - "cooridnates", "coordinates", - "cooridnator", "coordinator", - "copenhaagen", "copenhagen", - "copenhaegen", "copenhagen", - "copenhaguen", "copenhagen", - "copenhangen", "copenhagen", - "copmetitors", "competitors", - "coproration", "corporation", - "copyrigthed", "copyrighted", - "corinthains", "corinthians", - "corintheans", "corinthians", - "corinthiens", "corinthians", - "corinthinas", "corinthians", - "cornithians", "corinthians", - "corparation", "corporation", - "corperation", "corporation", - "corporacion", "corporation", - "corporativo", "corporation", - "corralation", "correlation", - "correctings", "corrections", - "correctivos", "corrections", - "correktions", "corrections", - "correktness", "correctness", - "correlacion", "correlation", - "correlaties", "correlates", - "corrilation", "correlation", - "corrisponds", "corresponds", - "corrolation", "correlation", - "corrosponds", "corresponds", - "costitution", "constitution", - "councellors", "councillors", - "counrtyside", "countryside", - "counsilling", "counselling", - "countercoat", "counteract", - "counteredit", "counterfeit", - "counterfact", "counteract", - "counterfait", "counterfeit", - "counterfest", "counterfeit", - "counterfiet", "counterfeit", - "counterpaly", "counterplay", - "counterpary", "counterplay", - "counterpath", "counterpart", - "counterpats", "counterparts", - "counterpont", "counterpoint", - "counterract", "counterpart", - "counterside", "countryside", - "countertrap", "counterpart", - "countriside", "countryside", - "countrycide", "countryside", - "countrywise", "countryside", - "courthourse", "courthouse", - "coutnerfeit", "counterfeit", - "coutnerpart", "counterpart", - "coutnerplay", "counterplay", - "creacionism", "creationism", - "creationkit", "creationist", - "creationsim", "creationism", - "creationsit", "creationist", - "creationsts", "creationists", - "creativelly", "creatively", - "credencials", "credentials", - "credentails", "credentials", - "credentaisl", "credentials", - "credientals", "credentials", - "credintials", "credentials", - "cricitising", "criticising", - "criculating", "circulating", - "cringeworhy", "cringeworthy", - "cringeworty", "cringeworthy", - "cringewothy", "cringeworthy", - "criticicing", "criticising", - "criticisied", "criticise", - "criticisims", "criticisms", - "criticisize", "criticise", - "criticiszed", "criticise", - "critisicing", "criticizing", - "critisising", "criticising", - "critizicing", "criticizing", - "critizising", "criticizing", - "critizizing", "criticizing", - "crockodiles", "crocodiles", - "crocodiller", "crocodile", - "crocodilule", "crocodile", - "croporation", "corporation", - "crossfiters", "crossfire", - "cultivative", "cultivate", - "curricullum", "curriculum", - "customizabe", "customizable", - "customizble", "customizable", - "dangeroulsy", "dangerously", - "dardenelles", "dardanelles", - "deadlifters", "deadlifts", - "dealershits", "dealerships", - "deceptivley", "deceptive", - "declaracion", "declaration", - "decleration", "declaration", - "declinining", "declining", - "decloration", "declaration", - "decoartions", "decoration", - "decomposits", "decomposes", - "decoratieve", "decorative", - "decorativos", "decorations", - "decotations", "decorations", - "decsendants", "descendants", - "deductiable", "deductible", - "defenderlas", "defenders", - "defenderlos", "defenders", - "defendernos", "defenders", - "defenesless", "defenseless", - "defenisvely", "defensively", - "defensivley", "defensively", - "deficiencey", "deficiency", - "deficienies", "deficiencies", - "deficientcy", "deficiency", - "definantley", "definately", - "definatedly", "definately", - "definateley", "definately", - "definatelly", "definately", - "definatelty", "definately", - "definatetly", "definately", - "definations", "definitions", - "definatlely", "definately", - "definetally", "definately", - "definetlely", "definetly", - "definitaley", "definately", - "definitelly", "definitely", - "definitevly", "definitively", - "definitiely", "definitively", - "definitieve", "definitive", - "definitiley", "definitively", - "definitivly", "definitively", - "definitivno", "definition", - "definitivos", "definitions", - "definitlely", "definitly", - "definitlety", "definitly", - "deflecticon", "deflection", - "degenererat", "degenerate", - "degradacion", "degradation", - "degradating", "degradation", - "degragation", "degradation", - "degridation", "degradation", - "dehyrdation", "dehydration", - "deinitalize", "deinitialize", - "delaerships", "dealerships", - "delapidated", "dilapidated", - "delcaration", "declaration", - "delearships", "dealerships", - "delevopment", "development", - "deliberante", "deliberate", - "deliberatly", "deliberately", - "deliberetly", "deliberately", - "delightlful", "delightful", - "deliverying", "delivering", - "delusionnal", "delusional", - "deminsional", "dimensional", - "democarcies", "democracies", - "democracize", "democracies", - "democractic", "democratic", - "democraphic", "demographic", - "democrasies", "democracies", - "democrazies", "democracies", - "democrocies", "democracies", - "demograhpic", "demographic", - "demographis", "demographics", - "demograpics", "demographics", - "demogrpahic", "demographic", - "demoninator", "denominator", - "demonstarte", "demonstrate", - "demonstates", "demonstrates", - "demonstraby", "demonstrably", - "demonstrant", "demonstrate", - "demonstrats", "demonstrates", - "demosntrate", "demonstrate", - "denegrating", "denigrating", - "denomenator", "denominator", - "denominador", "denominator", - "denominaron", "denominator", - "denominater", "denominator", - "denominaton", "denomination", - "denomitator", "denominator", - "denomonator", "denominator", - "denonimator", "denominator", - "deocrations", "decorations", - "deomcracies", "democracies", - "deparmental", "departmental", - "depedencies", "dependencies", - "dependancey", "dependency", - "dependencey", "dependency", - "dependencie", "dependence", - "dependenies", "dependencies", - "deplorabile", "deplorable", - "depressieve", "depressive", - "depresssion", "depression", - "deprevation", "deprivation", - "deprication", "deprivation", - "deprivating", "deprivation", - "deprivition", "deprivation", - "deprovation", "deprivation", - "depserately", "desperately", - "depseration", "desperation", - "deregulatin", "deregulation", - "derivativos", "derivatives", - "derivitaves", "derivatives", - "derivitives", "derivatives", - "derpivation", "deprivation", - "derviatives", "derivatives", - "descandants", "descendants", - "descendands", "descendants", - "descendends", "descended", - "descendenta", "descendants", - "descentants", "descendants", - "descirption", "descriptions", - "descprition", "descriptions", - "describiste", "describes", - "describtion", "description", - "descripcion", "description", - "descripiton", "descriptions", - "descripters", "descriptors", - "descriptoin", "descriptions", - "descriptons", "descriptions", - "descritpion", "descriptions", - "descrpition", "descriptions", - "desensitied", "desensitized", - "desensitzed", "desensitized", - "desentisize", "desensitized", - "desgination", "designation", - "designacion", "designation", - "designstion", "designation", - "desinations", "destinations", - "desingation", "designation", - "desitnation", "destination", - "desoriented", "disoriented", - "desparately", "desperately", - "desparation", "desperation", - "desperating", "desperation", - "desperatley", "desperately", - "despirately", "desperately", - "despiration", "desperation", - "destablized", "destabilized", - "destiantion", "destinations", - "destinaiton", "destinations", - "destinatons", "destinations", - "destinction", "destination", - "destraction", "destruction", - "destruccion", "destruction", - "destruciton", "destruction", - "destructivo", "destruction", - "destruktion", "destruction", - "destruktive", "destructive", - "deteoriated", "deteriorated", - "determanism", "determinism", - "determening", "determining", - "determenism", "determinism", - "determinare", "determine", - "determinato", "determination", - "determinded", "determine", - "determinsim", "determinism", - "detramental", "detrimental", - "detremental", "detrimental", - "detrimentul", "detrimental", - "detuschland", "deutschland", - "deustchland", "deutschland", - "deutchsland", "deutschland", - "deutcshland", "deutschland", - "deutschalnd", "deutschland", - "deutshcland", "deutschland", - "develepmont", "developments", - "develompent", "developments", - "developemnt", "developments", - "developmant", "developmental", - "developmetn", "developments", - "developmnet", "developments", - "developpers", "developers", - "develpoment", "developments", - "deveolpment", "developments", - "deveploment", "developments", - "devestating", "devastating", - "devistating", "devastating", - "deyhdration", "dehydration", - "diagnositcs", "diagnostic", - "diagnositic", "diagnostic", - "diagonstics", "diagnostic", - "dictatorhip", "dictatorship", - "dictionaire", "dictionaries", - "dictionairy", "dictionary", - "dictionarys", "dictionaries", - "dictionnary", "dictionary", - "differances", "differences", - "differantly", "differently", - "differental", "differential", - "differentes", "differences", - "differneces", "differences", - "differnetly", "differently", - "difficulity", "difficulty", - "difficultes", "difficulties", - "dificulties", "difficulties", - "dimensiones", "dimensions", - "dimentional", "dimensional", - "dimesnional", "dimensional", - "diminisheds", "diminishes", - "diminsihing", "diminishing", - "diminuitive", "diminutive", - "diminushing", "diminishing", - "dinosaurios", "dinosaurs", - "direccional", "directional", - "direcitonal", "directional", - "directorguy", "directory", - "directorios", "directors", - "direktional", "directional", - "disadvantge", "disadvantage", - "disagreemet", "disagreements", - "disagreemtn", "disagreements", - "disapperead", "disappeared", - "disapporval", "disapproval", - "disapprovel", "disapproval", - "disasterous", "disastrous", - "disastreous", "disastrous", - "disastrious", "disastrous", - "disastruous", "disastrous", - "disatisfied", "dissatisfied", - "disciplened", "disciplined", - "disciplinas", "disciplines", - "disciplince", "disciplines", - "disclipined", "disciplined", - "disclipines", "disciplines", - "discogrophy", "discography", - "discogrpahy", "discography", - "disconencts", "disconnects", - "disconneted", "disconnected", - "disconnnect", "disconnect", - "discontined", "discontinued", - "discontiued", "discontinued", - "discrapency", "discrepancy", - "discretited", "discredited", - "discrimante", "discriminate", - "discrimiate", "discriminate", - "discussiong", "discussing", - "discusssion", "discussions", - "disgraseful", "disgraceful", - "disgrateful", "disgraceful", - "disgrunteld", "disgruntled", - "disgustigly", "disgustingly", - "disgustingy", "disgustingly", - "disgustinly", "disgustingly", - "disicplined", "disciplined", - "disicplines", "disciplines", - "disingenuos", "disingenuous", - "dismanlting", "dismantling", - "dismantaled", "dismantled", - "dismanteled", "dismantled", - "disobediant", "disobedient", - "disocgraphy", "discography", - "disparingly", "disparagingly", - "dispensaire", "dispensaries", - "dispensarie", "dispenser", - "dispensiary", "dispensary", - "displacemnt", "displacement", - "disposicion", "disposition", - "disputandem", "disputandum", - "disqualifed", "disqualified", - "disregaring", "disregarding", - "dissapeared", "disappeared", - "dissapoined", "dissapointed", - "dissapointd", "dissapointed", - "dissapoited", "dissapointed", - "dissappears", "disappears", - "dissatisfed", "dissatisfied", - "disscusions", "discussions", - "dissertaion", "dissertation", - "dissipatore", "dissipate", - "distatesful", "distasteful", - "distatseful", "distasteful", - "disterbance", "disturbance", - "disticntion", "distinctions", - "distinciton", "distinction", - "distincitve", "distinctive", - "distinctily", "distinctly", - "distingiush", "distinguish", - "distinguise", "distinguished", - "distinktion", "distinction", - "distinquish", "distinguish", - "distirbance", "disturbance", - "distirbuted", "distribute", - "distirbutor", "distributor", - "distraccion", "distraction", - "distractons", "distracts", - "distraktion", "distraction", - "distribitor", "distributor", - "distribuent", "distribute", - "distribuite", "distribute", - "distribuito", "distribution", - "distributie", "distributed", - "distributin", "distribution", - "distributio", "distributor", - "distrobuted", "distributed", - "distrubance", "disturbance", - "distrubited", "distributed", - "distrubitor", "distributor", - "distrubuted", "distributed", - "distrubutor", "distributor", - "distructive", "destructive", - "distuingish", "distinguish", - "distunguish", "distinguish", - "disturbante", "disturbance", - "disturbence", "disturbance", - "disucssions", "discussions", - "divisionals", "divisions", - "doccumented", "documented", - "documantary", "documentary", - "documenatry", "documentary", - "documentare", "documentaries", - "documentato", "documentation", - "documentery", "documentary", - "documentory", "documentary", - "domesticted", "domesticated", - "dominateurs", "dominates", - "dominationg", "dominating", - "donwloading", "downloading", - "doublellift", "doublelift", - "downlaoding", "downloading", - "downloadbel", "downloadable", - "downloadbig", "downloading", - "downloadble", "downloadable", - "downvoteers", "downvoters", - "downvoteing", "downvoting", - "downvoteres", "downvoters", - "downvoteros", "downvoters", - "downvoteurs", "downvoters", - "downvotters", "downvoters", - "downvotting", "downvoting", - "dramaticaly", "dramatically", - "dramaticlly", "dramatically", - "drasitcally", "drastically", - "dsyfunction", "dysfunction", - "duetschland", "deutschland", - "durabillity", "durability", - "dyanmically", "dynamically", - "dymanically", "dynamically", - "dysfonction", "dysfunction", - "dysfucntion", "dysfunction", - "dysfunciton", "dysfunction", - "dysfunktion", "dysfunction", - "earhtquakes", "earthquakes", - "earthqaukes", "earthquakes", - "earthquacks", "earthquakes", - "economicaly", "economically", - "economiclly", "economically", - "economisiti", "economist", - "economistes", "economists", - "educacional", "educational", - "effeciently", "efficiently", - "effecitvely", "effectively", - "effectivley", "effectively", - "efficeintly", "efficiently", - "efficiantly", "efficiently", - "efficientcy", "efficiently", - "effortlesly", "effortlessly", - "effortlessy", "effortlessly", - "egaletarian", "egalitarian", - "egalitatian", "egalitarian", - "egaliterian", "egalitarian", - "egostitical", "egotistical", - "egotastical", "egotistical", - "egotestical", "egotistical", - "egotisitcal", "egotistical", - "egotisticle", "egotistical", - "egotystical", "egotistical", - "ehtnicities", "ethnicities", - "ejacluation", "ejaculation", - "ejacualtion", "ejaculation", - "electoratul", "electoral", - "electornics", "electronics", - "electricain", "electrician", - "electricial", "electrical", - "electricien", "electrician", - "electricion", "electrician", - "electricman", "electrician", - "electrisity", "electricity", - "electritian", "electrician", - "electrocity", "electricity", - "electrolyes", "electrolytes", - "electrolyts", "electrolytes", - "electroncis", "electrons", - "electroylte", "electrolytes", - "elementrary", "elementary", - "eleminating", "eliminating", - "elimanation", "elimination", - "eliminacion", "elimination", - "elimintates", "eliminates", - "ellipitcals", "elliptical", - "eloquentely", "eloquently", - "emabrassing", "embarassing", - "embaraasing", "embarassing", - "embarasaing", "embarassing", - "embarassign", "embarassing", - "embarassimg", "embarassing", - "embarassing", "embarrassing", - "embarissing", "embarassing", - "embarrasing", "embarrassing", - "embarressed", "embarrassed", - "embarrssing", "embarassing", - "emergancies", "emergencies", - "emergencias", "emergencies", - "emergenices", "emergencies", - "emmediately", "immediately", - "emmisarries", "emissaries", - "emotionella", "emotionally", - "empahsizing", "emphasizing", - "empathethic", "empathetic", - "emphacizing", "emphasizing", - "emphatising", "emphasizing", - "emphatizing", "emphasizing", - "emphazising", "emphasizing", - "emphesizing", "emphasizing", - "empiracally", "empirically", - "empirialism", "imperialism", - "empirialist", "imperialist", - "enchamtment", "enchantment", - "enchancment", "enchantment", - "enchanement", "enchantment", - "enchanthing", "enchanting", - "enchantmant", "enchantment", - "enchantmens", "enchantments", - "enchantmets", "enchantments", - "encomapsses", "encompasses", - "encompasess", "encompasses", - "encompesses", "encompasses", - "encounteres", "encounters", - "encoutnered", "encountered", - "encryptiion", "encryption", - "encyclopdia", "encyclopedia", - "encylopedia", "encyclopedia", - "endagnering", "endangering", - "endandering", "endangering", - "endorcement", "endorsement", - "endoresment", "endorsement", - "engagaments", "engagements", - "engeneering", "engineering", - "enginerring", "engineering", - "enginnering", "engineering", - "enlargments", "enlargements", - "enligthened", "enlightened", - "enourmously", "enormously", - "enterpirses", "enterprises", - "enterprices", "enterprises", - "enterprishe", "enterprises", - "entertainig", "entertaining", - "entertwined", "entertained", - "enthicities", "ethnicities", - "enthisiasts", "enthusiasts", - "enthuasists", "enthusiasts", - "enthuisasts", "enthusiasts", - "enthusaists", "enthusiasts", - "enthusiants", "enthusiast", - "enthusiasic", "enthusiastic", - "enthusiasim", "enthusiasm", - "enthusiasum", "enthusiasm", - "enthusiatic", "enthusiastic", - "enthusiests", "enthusiasts", - "enthusigasm", "enthusiasm", - "enthusisast", "enthusiasts", - "entrepeneur", "entrepreneur", - "entreperure", "entrepreneur", - "entrepeuner", "entrepreneur", - "entreprener", "entrepreneurs", - "entreprenur", "entrepreneur", - "entretained", "entertained", - "envinroment", "environments", - "enviorments", "environments", - "enviornment", "environment", - "envirnoment", "environment", - "enviroments", "environments", - "enviromnent", "environments", - "environemnt", "environment", - "environmnet", "environments", - "envrionment", "environment", - "equilavents", "equivalents", - "equilbirium", "equilibrium", - "equilevants", "equivalents", - "equilibirum", "equilibrium", - "equilibriam", "equilibrium", - "equilibruim", "equilibrium", - "equivalance", "equivalence", - "equivalants", "equivalents", - "equivalenet", "equivalents", - "equivallent", "equivalent", - "equivelance", "equivalence", - "equivelants", "equivalents", - "equivelents", "equivalents", - "equivilants", "equivalents", - "equivilence", "equivalence", - "equivilents", "equivalents", - "equivlalent", "equivalent", - "equivlanets", "equivalents", - "equivolence", "equivalence", - "equivolents", "equivalents", - "essencially", "essentially", - "essentailly", "essentially", - "essentialls", "essentials", - "essentually", "essentially", - "establising", "establishing", - "ethicallity", "ethically", - "ethincities", "ethnicities", - "ethniticies", "ethnicities", - "europeaners", "europeans", - "europeaness", "europeans", - "evaluatiing", "evaluating", - "evaluationg", "evaluating", - "evangalical", "evangelical", - "evangelikal", "evangelical", - "evengalical", "evangelical", - "evenhtually", "eventually", - "everyonehas", "everyones", - "everyonelse", "everyones", - "evidentally", "evidently", - "exacarbated", "exacerbated", - "exacberated", "exacerbated", - "exagerating", "exaggerating", - "exagerrated", "exaggerated", - "exagerrates", "exaggerates", - "exaggarated", "exaggerated", - "exaggareted", "exaggerate", - "exaggeratin", "exaggeration", - "exaggerrate", "exaggerate", - "exaggurated", "exaggerated", - "exarcebated", "exacerbated", - "excalmation", "exclamation", - "excepcional", "exceptional", - "exceptionel", "exceptional", - "excessivley", "excessively", - "exceutioner", "executioner", - "exchanching", "exchanging", - "exclamacion", "exclamation", - "exclamating", "exclamation", - "exclamativo", "exclamation", - "exclemation", "exclamation", - "exclimation", "exclamation", - "exclucivity", "exclusivity", - "exclusivety", "exclusivity", - "exclusivily", "exclusivity", - "exclusivley", "exclusively", - "excpetional", "exceptional", - "exculsively", "exclusively", - "exculsivity", "exclusivity", - "execitioner", "executioner", - "execptional", "exceptional", - "exectuables", "executable", - "exectuioner", "executioner", - "executionar", "executioner", - "executionor", "executioner", - "exerciseing", "exercising", - "exeuctioner", "executioner", - "existantial", "existential", - "existencial", "existential", - "existensial", "existential", - "existentiel", "existential", - "exlcamation", "exclamation", - "exlcusively", "exclusively", - "exlcusivity", "exclusivity", - "exoskelaton", "exoskeleton", - "expansiones", "expansions", - "expectantcy", "expectancy", - "expectating", "expectation", - "expectional", "exceptional", - "expendature", "expenditure", - "expendeture", "expenditure", - "expentiture", "expenditure", - "expereinced", "experienced", - "expereinces", "experiences", - "experements", "experiments", - "experianced", "experienced", - "experiances", "experiences", - "experiemnts", "experiments", - "experiening", "experiencing", - "experimetal", "experimental", - "experimeted", "experimented", - "experssions", "expressions", - "expiditions", "expeditions", - "expierenced", "experienced", - "expierences", "experiences", - "expirements", "experiments", - "explainging", "explaining", - "explaintory", "explanatory", - "explanaiton", "explanations", - "explanetary", "explanatory", - "explanetory", "explanatory", - "explanitary", "explanatory", - "explanotory", "explanatory", - "explenation", "explanation", - "explenatory", "explanatory", - "explicitely", "explicitly", - "explicitily", "explicitly", - "explination", "explanation", - "explinatory", "explanatory", - "exploitaion", "exploitation", - "exploitatie", "exploitative", - "explonation", "exploration", - "exploracion", "exploration", - "explorating", "exploration", - "explorerers", "explorers", - "explosiones", "explosions", - "explotacion", "exploration", - "expodential", "exponential", - "exponantial", "exponential", - "exponencial", "exponential", - "exponentiel", "exponential", - "expresscoin", "expression", - "expressivos", "expressions", - "expresssive", "expressive", - "expressview", "expressive", - "exprimental", "experimental", - "expropiated", "expropriated", - "extensiones", "extensions", - "extensivley", "extensively", - "extragavant", "extravagant", - "extrapalate", "extrapolate", - "extraploate", "extrapolate", - "extrapolant", "extrapolate", - "extrapolare", "extrapolate", - "extrapolite", "extrapolate", - "extrapulate", "extrapolate", - "extravagent", "extravagant", - "extravagina", "extravagant", - "extravegant", "extravagant", - "extravigant", "extravagant", - "extravogant", "extravagant", - "extremistas", "extremists", - "extremistes", "extremists", - "extropolate", "extrapolate", - "fabircation", "fabrication", - "fabricacion", "fabrication", - "fabrikation", "fabrication", - "facilitarte", "facilitate", - "facilitiate", "facilitate", - "facillitate", "facilitate", - "facisnation", "fascination", - "facsination", "fascination", - "factuallity", "factually", - "familairity", "familiarity", - "familairize", "familiarize", - "familiaries", "familiarize", - "familierize", "familiarize", - "fanatsizing", "fantasizing", - "fanficitons", "fanfiction", - "fantacising", "fantasizing", - "fantacizing", "fantasizing", - "fantasazing", "fantasizing", - "fantasiaing", "fantasizing", - "fantasyzing", "fantasizing", - "fantazising", "fantasizing", - "fascinacion", "fascination", - "fascinatinf", "fascination", - "fascisation", "fascination", - "fascization", "fascination", - "fashionalbe", "fashionable", - "fashoinable", "fashionable", - "fatalitites", "fatalities", - "favoritisme", "favorites", - "favoutrable", "favourable", - "felxibility", "flexibility", - "feministers", "feminists", - "feministisk", "feminists", - "fermentaion", "fermentation", - "fermenterad", "fermented", - "fertilizier", "fertilizer", - "fertizilers", "fertilizer", - "festivalens", "festivals", - "fignernails", "fingernails", - "fignerprint", "fingerprint", - "figurativly", "figuratively", - "finanically", "financially", - "finantially", "financially", - "fingerpints", "fingertips", - "fingerpoint", "fingerprint", - "fingertrips", "fingertips", - "firefighers", "firefighters", - "firefigther", "firefighters", - "firendzoned", "friendzoned", - "firghtening", "frightening", - "flatterende", "flattered", - "flawlessely", "flawlessly", - "flawlessley", "flawlessly", - "flexibiltiy", "flexibility", - "flourescent", "fluorescent", - "fluctuaties", "fluctuate", - "fluctuative", "fluctuate", - "flutteryshy", "fluttershy", - "forcefullly", "forcefully", - "foreseaable", "foreseeable", - "foresseable", "foreseeable", - "forgettting", "forgetting", - "forgiviness", "forgiveness", - "formallized", "formalized", - "formattting", "formatting", - "formidabble", "formidable", - "formidabelt", "formidable", - "formidabile", "formidable", - "fortitudine", "fortitude", - "fortuantely", "fortunately", - "fortunantly", "fortunately", - "fortunatley", "fortunately", - "fortunetely", "fortunately", - "franchieses", "franchises", - "frankensite", "frankenstein", - "frankensten", "frankenstein", - "fransiscans", "franciscans", - "freindships", "friendships", - "freindzoned", "friendzoned", - "frequenices", "frequencies", - "frequensies", "frequencies", - "frequenties", "frequencies", - "frequentily", "frequently", - "frequenzies", "frequencies", - "friendboned", "friendzoned", - "friendlines", "friendlies", - "friendzonie", "friendzoned", - "frientships", "friendships", - "frientzoned", "friendzoned", - "frightenend", "frightened", - "frightining", "frightening", - "frigthening", "frightening", - "frinedzoned", "friendzoned", - "frontlinies", "frontline", - "frontlinjen", "frontline", - "frustartion", "frustrations", - "frustracion", "frustration", - "frustraited", "frustrated", - "frustrantes", "frustrates", - "frustrasion", "frustrations", - "frustrasted", "frustrates", - "frustraties", "frustrates", - "fucntioning", "functioning", - "fulfillling", "fulfilling", - "fulfullment", "fulfillment", - "fullfilment", "fulfillment", - "fullscreeen", "fullscreen", - "funcitoning", "functioning", - "functionaly", "functionally", - "functionnal", "functional", - "fundamentas", "fundamentals", - "fundamently", "fundamental", - "fundametals", "fundamentals", - "fundamnetal", "fundamentals", - "fundemantal", "fundamental", - "fundemental", "fundamental", - "fundimental", "fundamental", - "furhtermore", "furthermore", - "furstration", "frustration", - "furthremore", "furthermore", - "furthurmore", "furthermore", - "futurisitic", "futuristic", - "gangsterest", "gangsters", - "gangsterous", "gangsters", - "gauntlettes", "gauntlets", - "geneologies", "genealogies", - "generalizng", "generalizing", - "generatting", "generating", - "genitaliban", "genitalia", - "gentlemanne", "gentlemen", - "girlfirends", "girlfriends", - "girlfreinds", "girlfriends", - "girlfrients", "girlfriends", - "glorifierad", "glorified", - "glorifindel", "glorified", - "goosebumbps", "goosebumps", - "govenrments", "governments", - "govermental", "governmental", - "governemnts", "governments", - "governmanet", "governmental", - "governmeant", "governmental", - "govormental", "governmental", - "gracefullly", "gracefully", - "grahpically", "graphically", - "grammarical", "grammatical", - "grammaticly", "grammatical", - "grammitical", "grammatical", - "graphcially", "graphically", - "grassrooots", "grassroots", - "gratuitious", "gratuitous", - "gratuituous", "gratuitous", - "gravitatiei", "gravitate", - "grilfriends", "girlfriends", - "grpahically", "graphically", - "guaranteeds", "guarantees", - "guerrillera", "guerrilla", - "gunslingner", "gunslinger", - "hamburgaren", "hamburger", - "hamburgeres", "hamburgers", - "hamburglers", "hamburgers", - "hamburguers", "hamburgers", - "handlebards", "handlebars", - "handrwiting", "handwriting", - "handycapped", "handicapped", - "hanidcapped", "handicapped", - "harassement", "harassment", - "harrasments", "harassments", - "harrassment", "harassment", - "harvestgain", "harvesting", - "headquartes", "headquarters", - "headquaters", "headquarters", - "hearhtstone", "hearthstone", - "heartborken", "heartbroken", - "heartbraker", "heartbreak", - "heartbrakes", "heartbreak", - "heartsthone", "hearthstone", - "heaviweight", "heavyweight", - "heavyweigth", "heavyweight", - "heavywieght", "heavyweight", - "helicoptors", "helicopters", - "helicotpers", "helicopters", - "helicpoters", "helicopters", - "helictopers", "helicopters", - "helikopters", "helicopters", - "hemipsheres", "hemisphere", - "hemishperes", "hemisphere", - "herathstone", "hearthstone", - "heterosexal", "heterosexual", - "hexidecimal", "hexadecimal", - "hierachical", "hierarchical", - "hierarcical", "hierarchical", - "highlighing", "highlighting", - "highschoool", "highschool", - "hipopotamus", "hippopotamus", - "historicaly", "historically", - "historicans", "historians", - "historietas", "histories", - "historinhas", "historians", - "homecomeing", "homecoming", - "homecomming", "homecoming", - "homelesness", "homelessness", - "homelessess", "homelessness", - "homeowneris", "homeowners", - "homoegenous", "homogeneous", - "homogeneize", "homogenize", - "homogenious", "homogeneous", - "homogenuous", "homogeneous", - "homophoboes", "homophobe", - "homosexuais", "homosexuals", - "homosexuels", "homosexuals", - "hopelessely", "hopelessly", - "hopelessley", "hopelessly", - "hopsitality", "hospitality", - "horizonatal", "horizontal", - "horizontaal", "horizontal", - "horizontaly", "horizontally", - "horrendeous", "horrendous", - "horrendious", "horrendous", - "horrenduous", "horrendous", - "hospitalzed", "hospitalized", - "hospotality", "hospitality", - "househoulds", "households", - "humanitarna", "humanitarian", - "humanitites", "humanities", - "humilitaing", "humiliating", - "humilitaion", "humiliation", - "humillating", "humiliating", - "humillation", "humiliation", - "hurricaines", "hurricanes", - "hurricances", "hurricanes", - "hurricanger", "hurricane", - "hyperbollic", "hyperbolic", - "hyperbrophy", "hypertrophy", - "hyperthropy", "hypertrophy", - "hypertorphy", "hypertrophy", - "hypertrohpy", "hypertrophy", - "hypocritcal", "hypocritical", - "hypocritial", "hypocritical", - "hypocrities", "hypocrite", - "hypothesees", "hypotheses", - "hypothesies", "hypothesis", - "hystericaly", "hysterically", - "hystericlly", "hysterically", - "iconclastic", "iconoclastic", - "idealisitic", "idealistic", - "identifible", "identifiable", - "identitites", "identities", - "identitties", "identities", - "ideologiers", "ideologies", - "ideologisen", "ideologies", - "ideologiset", "ideologies", - "ideologiske", "ideologies", - "illegallity", "illegally", - "illegitamte", "illegitimate", - "illegitmate", "illegitimate", - "illsutrator", "illustrator", - "illuminanti", "illuminati", - "illuminarti", "illuminati", - "illuminatti", "illuminati", - "illuminauti", "illuminati", - "illuminiati", "illuminati", - "illuminista", "illuminati", - "illumintati", "illuminati", - "illustarted", "illustrated", - "illustartor", "illustrator", - "illustraded", "illustrated", - "illustraion", "illustration", - "illustrater", "illustrator", - "illustratie", "illustrate", - "illustratin", "illustrations", - "illustraton", "illustration", - "imaganative", "imaginative", - "imaganitive", "imaginative", - "imaginacion", "imagination", - "imaginatiei", "imaginative", - "imaginating", "imagination", - "imaginativo", "imagination", - "imaginitave", "imaginative", - "imbalanaced", "imbalanced", - "imbalanaces", "imbalances", - "imbalancers", "imbalances", - "immatureity", "immaturity", - "immedeately", "immediately", - "immediantly", "immediately", - "immediatley", "immediately", - "immedietely", "immediately", - "immideately", "immediately", - "immidiately", "immediately", - "immigraiton", "immigration", - "immigrantes", "immigrants", - "immoratlity", "immortality", - "immortailty", "immortality", - "immortalisy", "immortals", - "impeccabile", "impeccable", - "imperailist", "imperialist", - "imperealist", "imperialist", - "imperialims", "imperialism", - "imperialsim", "imperialism", - "imperiarist", "imperialist", - "imperically", "empirically", - "imperislist", "imperialist", - "implausable", "implausible", - "implausbile", "implausible", - "implementas", "implements", - "implementes", "implements", - "implementig", "implementing", - "implementos", "implements", - "implicacion", "implication", - "implicatons", "implications", - "implicitely", "implicitly", - "implicitily", "implicitly", - "implikation", "implication", - "implimented", "implemented", - "importantce", "importance", - "importently", "importantly", - "imporvement", "improvement", - "impossibile", "impossible", - "impossibily", "impossibly", - "impossibley", "impossibly", - "impossiblly", "impossibly", - "impoverised", "impoverished", - "impracticle", "impractical", - "impressario", "impresario", - "impresssion", "impressions", - "imprisonent", "imprisonment", - "imprisonned", "imprisoned", - "improbabile", "improbable", - "improtantly", "importantly", - "improvemnts", "improvements", - "improvished", "improvised", - "improvision", "improvisation", - "improvments", "improvements", - "impulsivley", "impulsive", - "imrpovement", "improvement", - "inaccessble", "inaccessible", - "inaccuraces", "inaccuracies", - "inaccurrate", "inaccurate", - "inadvertant", "inadvertent", - "inaguration", "inauguration", - "inahbitants", "inhabitants", - "incarantion", "incarnation", - "incarcerato", "incarceration", - "incarnacion", "incarnation", - "incentivare", "incentive", - "incentivate", "incentive", - "incentivice", "incentive", - "incentivies", "incentives", - "incidencies", "incidence", - "incidentaly", "incidentally", - "incidential", "incidental", - "inclanation", "inclination", - "inclenation", "inclination", - "inclinacion", "inclination", - "inclinaison", "inclination", - "incognition", "incognito", - "incoherrent", "incoherent", - "incompatble", "incompatible", - "incompatent", "incompetent", - "incompetant", "incompetent", - "incompitent", "incompetent", - "incompotent", "incompetent", - "incomptable", "incompatible", - "inconsisent", "inconsistent", - "inconveniet", "inconvenient", - "incoroprate", "incorporate", - "incorparate", "incorporate", - "incorperate", "incorporate", - "incorporare", "incorporate", - "incorported", "incorporated", - "incorprates", "incorporates", - "incorproate", "incorporated", - "incramental", "incremental", - "increadible", "incredible", - "incrediable", "incredible", - "incrediably", "incredibly", - "incredibile", "incredible", - "incredibily", "incredibly", - "incredibley", "incredibly", - "incrememnts", "increments", - "incremenets", "increments", - "incrementas", "increments", - "incremently", "incremental", - "incrementos", "increments", - "incrimental", "incremental", - "inctroduced", "introduced", - "indefinetly", "indefinitely", - "indefininte", "indefinite", - "indefinitly", "indefinitely", - "indepdenent", "independents", - "indepedence", "independence", - "indepednent", "independents", - "independant", "independent", - "independece", "independence", - "independens", "independents", - "independetn", "independents", - "independets", "independents", - "independnet", "independents", - "indepentend", "independents", - "indepentent", "independent", - "indianapols", "indianapolis", - "indicateurs", "indicates", - "indicatiors", "indicators", - "indictement", "indictment", - "indifferant", "indifferent", - "indiffernce", "indifference", - "indigeneous", "indigenous", - "indigenious", "indigenous", - "indigenuous", "indigenous", - "indigineous", "indigenous", - "indipendent", "independent", - "indirectely", "indirectly", - "individiual", "individual", - "individuais", "individuals", - "individualy", "individually", - "individuati", "individuality", - "individuels", "individuals", - "indivuduals", "individuals", - "industriels", "industries", - "ineffecitve", "ineffective", - "ineffektive", "ineffective", - "inefficeint", "inefficient", - "inefficiant", "inefficient", - "ineffictive", "ineffective", - "ineffizient", "inefficient", - "inequallity", "inequality", - "inevitabile", "inevitable", - "inevitabily", "inevitably", - "inevitabley", "inevitably", - "inevitablly", "inevitably", - "inexpencive", "inexpensive", - "inexpenisve", "inexpensive", - "inexperiece", "inexperience", - "inexperince", "inexperience", - "inexplicaby", "inexplicably", - "infallibale", "infallible", - "infallibile", "infallible", - "infectation", "infestation", - "inferioirty", "inferiority", - "infestating", "infestation", - "infilitrate", "infiltrate", - "infiltartor", "infiltrator", - "infiltraron", "infiltrator", - "infiltrarte", "infiltrate", - "infiltrater", "infiltrator", - "infiltratie", "infiltrate", - "infiltrerat", "infiltrate", - "infinitelly", "infinitely", - "infintrator", "infiltrator", - "inflamation", "inflammation", - "inflatabale", "inflatable", - "inflitrator", "infiltrator", - "influancing", "influencing", - "influencial", "influential", - "influencian", "influencing", - "influenting", "influencing", - "influentual", "influential", - "influincing", "influencing", - "infograhpic", "infographic", - "infograpgic", "infographic", - "infogrpahic", "infographic", - "informacion", "information", - "informatice", "informative", - "informatief", "informative", - "informatiei", "informative", - "informatike", "informative", - "informativo", "information", - "informitive", "informative", - "infrigement", "infringement", - "infringeing", "infringing", - "infromation", "information", - "infromative", "informative", - "infulential", "influential", - "ingerdients", "ingredients", - "ingrediants", "ingredients", - "ingreidents", "ingredient", - "ingriedents", "ingredient", - "inhabitents", "inhabitants", - "inheirtance", "inheritance", - "inheratance", "inheritance", - "inheretance", "inheritance", - "inheritence", "inheritance", - "inhertiance", "inheritance", - "initaitives", "initiatives", - "initalisers", "initialisers", - "initalising", "initialising", - "initalizers", "initializers", - "initalizing", "initializing", - "initiaitive", "initiative", - "inititiaves", "initiatives", - "innocenters", "innocents", - "innocentius", "innocents", - "innoculated", "inoculated", - "inpsiration", "inspiration", - "inquisicion", "inquisition", - "inquisistor", "inquisitor", - "inquisiting", "inquisition", - "inquisitior", "inquisitor", - "inquisitivo", "inquisition", - "inquizition", "inquisition", - "insecurites", "insecurities", - "insensative", "insensitive", - "insensetive", "insensitive", - "insentitive", "insensitive", - "insepctions", "inspections", - "inseperable", "inseparable", - "insipration", "inspiration", - "insitutions", "institutions", - "insparation", "inspiration", - "inspecticon", "inspection", - "inspectoras", "inspectors", - "insperation", "inspiration", - "inspiracion", "inspiration", - "inspirating", "inspiration", - "inspriation", "inspiration", - "instalation", "installation", - "instalement", "installment", - "installatin", "installations", - "installeert", "installer", - "installemnt", "installment", - "installling", "installing", - "installmant", "installment", - "instanciate", "instantiate", - "instantaneu", "instantaneous", - "institucion", "institution", - "institutiei", "institute", - "instituttet", "institute", - "instraments", "instruments", - "instruccion", "instruction", - "instruciton", "instruction", - "instructers", "instructors", - "instructior", "instructor", - "instructios", "instructors", - "instructivo", "instruction", - "instructons", "instructors", - "instruktion", "instruction", - "instrumenal", "instrumental", - "instrumetal", "instrumental", - "insturction", "instruction", - "insturctors", "instructors", - "insturments", "instruments", - "instutition", "institution", - "instutution", "institution", - "insufficent", "insufficient", - "insuinating", "insinuating", - "insuniating", "insinuating", - "insurgencey", "insurgency", - "intangiable", "intangible", - "intangibile", "intangible", - "inteferring", "interfering", - "integracion", "integration", - "integratron", "integration", - "integrering", "interfering", - "intelectual", "intellectual", - "inteligence", "intelligence", - "intellectul", "intellectuals", - "intellectus", "intellectuals", - "intellecual", "intellectual", - "intellegent", "intelligent", - "intelligant", "intelligent", - "intencional", "intentional", - "intentionly", "intentional", - "interaccion", "interaction", - "interactice", "interactive", - "interacties", "interacts", - "interactifs", "interacts", - "interactins", "interacts", - "interactios", "interacts", - "interactivo", "interaction", - "interactons", "interacts", - "interaktion", "interaction", - "interaktive", "interactive", - "interasting", "interacting", - "intercation", "integration", - "interceptin", "interception", - "intercoarse", "intercourse", - "intercource", "intercourse", - "interecting", "interacting", - "interection", "interaction", - "interelated", "interrelated", - "interersted", "interpreted", - "interesring", "interfering", - "interessted", "interested", - "interferece", "interference", - "interferens", "interferes", - "interferire", "interfere", - "interfernce", "interference", - "interferred", "interfere", - "interferres", "interferes", - "intergation", "integration", - "intergrated", "integrated", - "intermedate", "intermediate", - "intermedite", "intermediate", - "intermitent", "intermittent", - "internation", "international", - "interneters", "internets", - "internetese", "internets", - "internetest", "internets", - "interneting", "interesting", - "internetors", "internets", - "internettes", "internets", - "interperted", "interpreted", - "interperter", "interpreter", - "interprered", "interpreter", - "interpretor", "interpreter", - "interratial", "interracial", - "interresing", "interfering", - "interrogato", "interrogation", - "interrputed", "interrupted", - "interruping", "interrupting", - "interruptes", "interrupts", - "interruptis", "interrupts", - "intersecton", "intersection", - "interstelar", "interstellar", - "intertained", "intertwined", - "intertvined", "intertwined", - "intertwyned", "intertwined", - "intervalles", "intervals", - "intervation", "integration", - "interveiwed", "interviewed", - "interveiwer", "interviewer", - "intervenion", "intervening", - "intervenire", "intervene", - "interventie", "intervene", - "intervewing", "intervening", - "interviened", "interviewed", - "interviewes", "interviews", - "interviewie", "interviewer", - "intervining", "intervening", - "interwebers", "interwebs", - "interwiever", "interviewer", - "intestinces", "intestines", - "inticracies", "intricacies", - "intimadated", "intimidated", - "intimidades", "intimidated", - "intimidante", "intimidate", - "intimidatie", "intimidated", - "intimidatin", "intimidation", - "intimidaton", "intimidation", - "intimidiate", "intimidate", - "intiminated", "intimidated", - "intimitaded", "intimidated", - "intimitated", "intimidated", - "intiutively", "intuitively", - "intoleranse", "intolerance", - "intolerante", "intolerance", - "intolerence", "intolerance", - "intolernace", "intolerance", - "intolorance", "intolerance", - "intolorence", "intolerance", - "intorducing", "introducing", - "intorverted", "introverted", - "intoxicatin", "intoxication", - "intoxicaton", "intoxication", - "intoxinated", "intoxicated", - "intoxocated", "intoxicated", - "intracacies", "intricacies", - "intracicies", "intricacies", - "intraverted", "introverted", - "intrecacies", "intricacies", - "intrepreted", "interpreted", - "intrepreter", "interpreter", - "intrerupted", "interrupted", - "intricasies", "intricacies", - "intricicies", "intricacies", - "intrigueing", "intriguing", - "intrinsisch", "intrinsic", - "introducion", "introduction", - "introducted", "introduced", - "introductie", "introduce", - "introvertie", "introverted", - "introvertis", "introverts", - "intruducing", "introducing", - "intrumental", "instrumental", - "intuatively", "intuitively", - "intuitevely", "intuitively", - "intuitivley", "intuitively", - "intuituvely", "intuitively", - "inutitively", "intuitively", - "invaldiates", "invalidates", - "invalidades", "invalidates", - "invalidante", "invalidate", - "invariabley", "invariably", - "invariablly", "invariably", - "inventiones", "inventions", - "invesitgate", "investigate", - "investagate", "investigate", - "investiagte", "investigate", - "investigare", "investigate", - "invincibile", "invincible", - "invincinble", "invincible", - "invisibiity", "invisibility", - "invisibiliy", "invisibility", - "involantary", "involuntary", - "involentary", "involuntary", - "involintary", "involuntary", - "involontary", "involuntary", - "involunatry", "involuntary", - "invulnerabe", "invulnerable", - "invulnerble", "invulnerable", - "iresistable", "irresistible", - "iresistably", "irresistibly", - "iresistible", "irresistible", - "iresistibly", "irresistibly", - "irrationaly", "irrationally", - "irrationnal", "irrational", - "islamisists", "islamists", - "islamisters", "islamists", - "islamistisk", "islamists", - "isntruments", "instruments", - "jacksonvile", "jacksonville", - "jailbroaken", "jailbroken", - "jailbrocken", "jailbroken", - "jounralists", "journalists", - "jouranlists", "journalists", - "journalisim", "journalism", - "journalistc", "journalistic", - "journolists", "journalists", - "judegmental", "judgemental", - "judgamental", "judgemental", - "judgementle", "judgemental", - "judgementsl", "judgemental", - "judgenental", "judgemental", - "jugdemental", "judgemental", - "juggernaugt", "juggernaut", - "juggernault", "juggernaut", - "juggernaunt", "juggernaut", - "justifyable", "justifiable", - "kidnappning", "kidnapping", - "kidnappping", "kidnapping", - "kilometeres", "kilometers", - "kindergaten", "kindergarten", - "knowledgabe", "knowledgable", - "knowledgble", "knowledgable", - "kryptoninte", "kryptonite", - "lacklusture", "lackluster", - "laughablely", "laughably", - "legalizaing", "legalizing", - "legalizaton", "legalization", - "legalizeing", "legalizing", - "legenadries", "legendaries", - "legendaires", "legendaries", - "legendarios", "legendaries", - "legendarisk", "legendaries", - "legendaryes", "legendaries", - "legenderies", "legendaries", - "legilsation", "legislation", - "legislacion", "legislation", - "legislativo", "legislation", - "legistation", "legislation", - "legistative", "legislative", - "legistators", "legislators", - "legitematly", "legitimately", - "legitimancy", "legitimacy", - "legitimatcy", "legitimacy", - "legitimatly", "legitimately", - "legitimetly", "legitimately", - "legnedaries", "legendaries", - "lengedaries", "legendaries", - "liberalisim", "liberalism", - "liberatrian", "libertarians", - "libertairan", "libertarians", - "libertarain", "libertarian", - "libertarias", "libertarians", - "libertarien", "libertarian", - "libertaryan", "libertarian", - "libertatian", "libertarian", - "liberterian", "libertarian", - "libguistics", "linguistics", - "libretarian", "libertarian", - "lieutennant", "lieutenant", - "lieutentant", "lieutenant", - "lightenning", "lightening", - "lightenting", "lightening", - "lightheared", "lighthearted", - "lightheated", "lighthearted", - "lightweigth", "lightweight", - "lightwieght", "lightweight", - "lightwright", "lightweight", - "ligthweight", "lightweight", - "limitaitons", "limitation", - "linguisitcs", "linguistics", - "linguisitic", "linguistic", - "lingusitics", "linguistics", - "lithuaninan", "lithuania", - "littlefiger", "littlefinger", - "littlefiner", "littlefinger", - "lockscreeen", "lockscreen", - "longevitity", "longevity", - "lotharingen", "lothringen", - "louisvillle", "louisville", - "maginficent", "magnificent", - "magneficent", "magnificent", - "magnicifent", "magnificent", - "magnifacent", "magnificent", - "magnifecent", "magnificent", - "magnificant", "magnificent", - "magnitudine", "magnitude", - "maintainted", "maintained", - "maintanance", "maintenance", - "maintanence", "maintenance", - "maintenence", "maintenance", - "maintianing", "maintaining", - "maintinaing", "maintaining", - "maintinance", "maintenance", - "maintinence", "maintenance", - "malfonction", "malfunction", - "malfucntion", "malfunction", - "malfunciton", "malfunction", - "malfuncting", "malfunction", - "malfunktion", "malfunction", - "malpractise", "malpractice", - "malpractive", "malpractice", - "maneouvring", "manoeuvring", - "manifestado", "manifesto", - "manifestano", "manifesto", - "manifestato", "manifesto", - "manifestion", "manifesto", - "manifestior", "manifesto", - "manifestons", "manifests", - "manifestors", "manifests", - "manipluated", "manipulated", - "manipualted", "manipulated", - "manipulatie", "manipulative", - "manipulatin", "manipulation", - "manipulaton", "manipulation", - "maniuplated", "manipulated", - "mannerisims", "mannerisms", - "manslaugher", "manslaughter", - "manslaugter", "manslaughter", - "manufacters", "manufactures", - "manufacteur", "manufactures", - "manufactued", "manufactured", - "manufactuer", "manufacture", - "manufacturs", "manufactures", - "manufacuter", "manufacture", - "manufacutre", "manufactures", - "manufatured", "manufactured", - "manupilated", "manipulated", - "marganilize", "marginalized", - "marhsmallow", "marshmallow", - "marijuannas", "marijuana", - "markerplace", "marketplace", - "marketpalce", "marketplace", - "marshamllow", "marshmallow", - "marshmalows", "marshmallows", - "masculanity", "masculinity", - "masculenity", "masculinity", - "masrhmallow", "marshmallow", - "mastermined", "mastermind", - "masterpeace", "masterpiece", - "masterpeice", "masterpiece", - "mastrubated", "masturbated", - "mastrubates", "masturbate", - "masturabted", "masturbated", - "masturbaing", "masturbating", - "masturbarte", "masturbate", - "masturbathe", "masturbated", - "masturbatie", "masturbated", - "masturbatin", "masturbation", - "masturbaton", "masturbation", - "masturbsted", "masturbated", - "masturpiece", "masterpiece", - "masuclinity", "masculinity", - "matchamking", "matchmaking", - "materalists", "materialist", - "materialsim", "materialism", - "mathamatics", "mathematics", - "mathcmaking", "matchmaking", - "mathemagics", "mathematics", - "mathemetics", "mathematics", - "mathimatics", "mathematics", - "matieralism", "materialism", - "maybelleine", "maybelline", - "maybelliene", "maybelline", - "maybellinne", "maybelline", - "maybellline", "maybelline", - "mdifielders", "midfielders", - "meatballers", "meatballs", - "mecernaries", "mercenaries", - "mechanicaly", "mechanically", - "mechanichal", "mechanical", - "mechaniclly", "mechanically", - "mechanicsms", "mechanisms", - "mechanisims", "mechanism", - "mechanismus", "mechanisms", - "medicaitons", "medications", - "medicineras", "medicines", - "meditatiing", "meditating", - "meditationg", "meditating", - "mentionning", "mentioning", - "mercanaries", "mercenaries", - "mercaneries", "mercenaries", - "mercenaires", "mercenaries", - "mercenarias", "mercenaries", - "mercenarios", "mercenaries", - "merceneries", "mercenaries", - "merchandice", "merchandise", - "merchandies", "merchandise", - "merchanidse", "merchandise", - "merchanters", "merchants", - "merchendise", "merchandise", - "merchindise", "merchandise", - "mercinaries", "mercenaries", - "mercineries", "mercenaries", - "metabolisim", "metabolism", - "metabolitic", "metabolic", - "metaphisics", "metaphysics", - "metaphorial", "metaphorical", - "metaphorics", "metaphors", - "metaphsyics", "metaphysics", - "metaphyiscs", "metaphysics", - "methodoligy", "methodology", - "metholodogy", "methodology", - "metropolian", "metropolitan", - "metropolies", "metropolis", - "metropollis", "metropolis", - "metropolois", "metropolis", - "micorcenter", "microcenter", - "micorphones", "microphones", - "microcender", "microcenter", - "microcentre", "microcenter", - "microcentro", "microcenter", - "microhpones", "microphones", - "microscrope", "microscope", - "microwavees", "microwaves", - "microwavers", "microwaves", - "midfeilders", "midfielders", - "midfiedlers", "midfielders", - "midfileders", "midfielders", - "midifelders", "midfielders", - "millienaire", "millionaire", - "millionairs", "millionaires", - "millionarie", "millionaire", - "millioniare", "millionaire", - "mindlessely", "mindlessly", - "mindlessley", "mindlessly", - "minimalstic", "minimalist", - "ministerens", "ministers", - "ministerios", "ministers", - "minneaoplis", "minneapolis", - "minneaplois", "minneapolis", - "minniapolis", "minneapolis", - "miraculaous", "miraculous", - "miraculosly", "miraculously", - "miraculousy", "miraculously", - "mircocenter", "microcenter", - "mircophones", "microphones", - "mircoscopic", "microscopic", - "miscairrage", "miscarriage", - "miscarraige", "miscarriage", - "miscarridge", "miscarriage", - "miscarriege", "miscarriage", - "mischeivous", "mischievous", - "mischevious", "mischievous", - "misdameanor", "misdemeanor", - "misdeamenor", "misdemeanor", - "misdemeaner", "misdemeanor", - "misdemenaor", "misdemeanor", - "misdemenors", "misdemeanors", - "misdimeanor", "misdemeanor", - "misdomeanor", "misdemeanor", - "miserablely", "miserably", - "misfortunte", "misfortune", - "misimformed", "misinformed", - "misinterept", "misinterpret", - "misinterpet", "misinterpret", - "misoginysts", "misogynist", - "misognyists", "misogynist", - "misogyinsts", "misogynist", - "misogynisic", "misogynistic", - "misogynistc", "misogynistic", - "misogynstic", "misogynist", - "missionaire", "missionaries", - "missionairy", "missionary", - "missionares", "missionaries", - "missionaris", "missionaries", - "missionarry", "missionary", - "missionnary", "missionary", - "mississipis", "mississippi", - "misspeeling", "misspelling", - "misspellled", "misspelled", - "mistakengly", "mistakenly", - "mistakently", "mistakenly", - "moderatedly", "moderately", - "moderateurs", "moderates", - "moderatorin", "moderation", - "modificaton", "modification", - "moisterizer", "moisturizer", - "moistruizer", "moisturizer", - "moisturizng", "moisturizing", - "moisturizor", "moisturizer", - "moistutizer", "moisturizer", - "moisutrizer", "moisturizer", - "moleculaire", "molecular", - "molestating", "molestation", - "moleststion", "molestation", - "momemtarily", "momentarily", - "momentairly", "momentarily", - "momentaraly", "momentarily", - "momentarely", "momentarily", - "momenterily", "momentarily", - "monestaries", "monasteries", - "monitoreada", "monitored", - "monitoreado", "monitored", - "monogameous", "monogamous", - "monolitihic", "monolithic", - "monopollies", "monopolies", - "monstorsity", "monstrosity", - "monstrasity", "monstrosity", - "monstrisity", "monstrosity", - "monstrocity", "monstrosity", - "monstrosoty", "monstrosity", - "monstrostiy", "monstrosity", - "monumentaal", "monumental", - "monumentais", "monuments", - "monumentals", "monuments", - "monumentous", "monuments", - "mositurizer", "moisturizer", - "mosntrosity", "monstrosity", - "motehrboard", "motherboard", - "mothebroard", "motherboards", - "motherbaord", "motherboard", - "motherboads", "motherboards", - "motherboars", "motherboards", - "motherborad", "motherboard", - "motherbords", "motherboards", - "motherobard", "motherboards", - "mothreboard", "motherboards", - "motivatinal", "motivational", - "motorcicles", "motorcycles", - "motorcylces", "motorcycles", - "mouthpeices", "mouthpiece", - "mulitplayer", "multiplayer", - "mulitplying", "multiplying", - "multipalyer", "multiplayer", - "multiplater", "multiplayer", - "multiplebgs", "multiples", - "multipleies", "multiples", - "multitaskng", "multitasking", - "multitudine", "multitude", - "multiverese", "multiverse", - "multyplayer", "multiplayer", - "multyplying", "multiplying", - "muncipality", "municipality", - "murdererous", "murderers", - "musicallity", "musically", - "mutliplayer", "multiplayer", - "mutliplying", "multiplying", - "mysterieuse", "mysteries", - "mysteriosly", "mysteriously", - "mysteriouly", "mysteriously", - "mysteriousy", "mysteriously", - "napoleonian", "napoleonic", - "narcisissim", "narcissism", - "narcisissts", "narcissist", - "narcisscism", "narcissism", - "narcisscist", "narcissist", - "narcissisim", "narcissism", - "narcississm", "narcissism", - "narcississt", "narcissist", - "narcissistc", "narcissistic", - "narcissitic", "narcissistic", - "narcisssism", "narcissism", - "narcisssist", "narcissist", - "narcissstic", "narcissist", - "natioanlist", "nationalist", - "nationailty", "nationality", - "nationalesl", "nationals", - "nationalisn", "nationals", - "nationalite", "nationalist", - "nationalits", "nationalist", - "nationalizm", "nationalism", - "nationalsim", "nationalism", - "neccesarily", "necessarily", - "necessairly", "necessarily", - "necessaties", "necessities", - "necesseraly", "necessarily", - "necesserily", "necessarily", - "necessiates", "necessities", - "necessitive", "necessities", - "neckbeardos", "neckbeards", - "neckbeardus", "neckbeards", - "necormancer", "necromancer", - "necromamcer", "necromancer", - "necromanser", "necromancer", - "necromencer", "necromancer", - "needlessley", "needlessly", - "negativeity", "negativity", - "negativelly", "negatively", - "negativitiy", "negativity", - "negiotating", "negotiating", - "negligiable", "negligible", - "negociating", "negotiating", - "negociation", "negotiation", - "negoitating", "negotiating", - "negoitation", "negotiation", - "negotiatied", "negotiate", - "negotiative", "negotiate", - "negotiatons", "negotiations", - "neigborhood", "neighborhood", - "neigbouring", "neighbouring", - "neighborhod", "neighborhood", - "neighbourgs", "neighbours", - "neighouring", "neighboring", - "nercomancer", "necromancer", - "nessasarily", "necessarily", - "neurologial", "neurological", - "neurosciene", "neuroscience", - "neutrallity", "neutrality", - "neverthelss", "nevertheless", - "neverthless", "nevertheless", - "newspapaers", "newspapers", - "newspappers", "newspapers", - "nieghboring", "neighboring", - "nightmarket", "nightmare", - "nonsencical", "nonsensical", - "nonsenscial", "nonsensical", - "nonsensicle", "nonsensical", - "normallized", "normalized", - "northwesten", "northwestern", - "nostalgisch", "nostalgic", - "noteworthly", "noteworthy", - "noticeabley", "noticeably", - "notificaton", "notification", - "notoriuosly", "notoriously", - "numericable", "numerical", - "nurtitional", "nutritional", - "nutricional", "nutritional", - "nutrutional", "nutritional", - "obamination", "abomination", - "obersvation", "observation", - "obilterated", "obliterated", - "objectivety", "objectivity", - "objectivify", "objectivity", - "objectivily", "objectivity", - "objectivley", "objectively", - "obliberated", "obliterated", - "obliderated", "obliterated", - "obligerated", "obliterated", - "oblitarated", "obliterated", - "obliteraded", "obliterated", - "obliterared", "obliterated", - "oblitirated", "obliterated", - "oblitorated", "obliterated", - "obliverated", "obliterated", - "observacion", "observation", - "observaiton", "observant", - "observasion", "observations", - "observating", "observation", - "observerats", "observers", - "obsessivley", "obsessive", - "obstruccion", "obstruction", - "obstruktion", "obstruction", - "obsturction", "obstruction", - "obversation", "observation", - "ocasionally", "occasionally", - "ocassionaly", "occasionally", - "occasionals", "occasions", - "occasionaly", "occasionally", - "occasionnal", "occasional", - "occassional", "occasional", - "occassioned", "occasioned", - "occurrances", "occurrences", - "offensivley", "offensively", - "offesnively", "offensively", - "officiallly", "officially", - "olbiterated", "obliterated", - "omniscienct", "omniscient", - "operacional", "operational", - "operasional", "operational", - "operationel", "operational", - "oppresssing", "oppressing", - "oppresssion", "oppression", - "opprotunity", "opportunity", - "optimisitic", "optimistic", - "optimizaton", "optimization", - "orchestraed", "orchestrated", - "orchestrial", "orchestra", - "oreintation", "orientation", - "organisaton", "organisation", - "organiserad", "organised", - "organistion", "organisation", - "organizarea", "organizer", - "organizarem", "organizer", - "organizarme", "organizer", - "organizarte", "organizer", - "organiztion", "organization", - "oridinarily", "ordinarily", - "orientacion", "orientation", - "originially", "originally", - "originnally", "originally", - "origniality", "originality", - "ostensiably", "ostensibly", - "ostensibily", "ostensibly", - "outclasssed", "outclassed", - "outnunbered", "outnumbered", - "outperfroms", "outperform", - "outpreforms", "outperform", - "outrageosly", "outrageously", - "outrageouly", "outrageously", - "outragerous", "outrageous", - "outskirters", "outskirts", - "outsorucing", "outsourcing", - "outsourcade", "outsourced", - "outsoursing", "outsourcing", - "overbraking", "overbearing", - "overcapping", "overlapping", - "overcharing", "overarching", - "overclcoked", "overclocked", - "overclicked", "overclocked", - "overcloaked", "overclocked", - "overclocing", "overclocking", - "overclockig", "overclocking", - "overclocled", "overclocked", - "overcomeing", "overcoming", - "overcomming", "overcoming", - "overeaching", "overarching", - "overfapping", "overlapping", - "overheading", "overheating", - "overhooking", "overlooking", - "overhwelmed", "overwhelmed", - "overkapping", "overlapping", - "overklocked", "overclocked", - "overlapsing", "overlapping", - "overlcocked", "overclocked", - "overlcoking", "overlooking", - "overlooming", "overlooking", - "overloooked", "overlooked", - "overlordess", "overlords", - "overmapping", "overlapping", - "overpooling", "overlooking", - "overpovered", "overpowered", - "overpoweing", "overpowering", - "overreacing", "overreacting", - "overreactin", "overreaction", - "overreacton", "overreaction", - "overshaddow", "overshadowed", - "overshadowd", "overshadowed", - "overtapping", "overlapping", - "overthining", "overthinking", - "overthinkig", "overthinking", - "overvlocked", "overclocked", - "overwealmed", "overwhelmed", - "overwelming", "overwhelming", - "overwhelemd", "overwhelmed", - "overwhelimg", "overwhelm", - "overwheling", "overwhelming", - "overwhemled", "overwhelmed", - "overwhlemed", "overwhelmed", - "overwritted", "overwrite", - "pakistanais", "pakistani", - "pakistanezi", "pakistani", - "palceholder", "placeholder", - "palesitnian", "palestinians", - "palestenian", "palestinian", - "palestinain", "palestinians", - "palestinans", "palestinians", - "palestinier", "palestine", - "palistinian", "palestinian", - "palythrough", "playthrough", - "papanicalou", "papanicolaou", - "parachutage", "parachute", - "paragraphes", "paragraphs", - "paramedicks", "paramedics", - "paramedicos", "paramedics", - "parameteres", "parameters", - "paranthesis", "parenthesis", - "parapharsed", "paraphrase", - "paraprhased", "paraphrase", - "parasitisme", "parasites", - "parenthasis", "parenthesis", - "parenthesys", "parentheses", - "parenthises", "parenthesis", - "parenthisis", "parenthesis", - "parliamenty", "parliamentary", - "parntership", "partnership", - "parrallelly", "parallelly", - "partecipant", "participant", - "partecipate", "participate", - "parternship", "partnership", - "partiarchal", "patriarchal", - "particapate", "participate", - "particiapte", "participate", - "participait", "participant", - "participans", "participants", - "participare", "participate", - "participatd", "participant", - "participati", "participant", - "participats", "participant", - "participent", "participant", - "particpiate", "participated", - "particually", "particularly", - "particulaly", "particularly", - "particulary", "particularly", - "partnetship", "partnership", - "partonizing", "patronizing", - "passionatly", "passionately", - "passionetly", "passionately", - "passionnate", "passionate", - "passporters", "passports", - "pathologial", "pathological", - "patriarchia", "patriarchal", - "patriarcial", "patriarchal", - "patriarical", "patriarchal", - "patriotisch", "patriotic", - "patriotisim", "patriotism", - "patriottism", "patriotism", - "patronozing", "patronizing", - "peacefullly", "peacefully", - "pedestirans", "pedestrians", - "pedestrains", "pedestrians", - "pedophilies", "pedophile", - "pedophilles", "pedophile", - "penetracion", "penetration", - "penetrading", "penetrating", - "penetrarion", "penetration", - "penninsular", "peninsular", - "pennsylvnia", "pennsylvania", - "pepperocini", "pepperoni", - "percantages", "percentages", - "percautions", "precautions", - "percentille", "percentile", - "percpetions", "perceptions", - "percusssion", "percussion", - "perdicament", "predicament", - "perdictable", "predictable", - "perdictions", "predictions", - "perephirals", "peripherals", - "pereptually", "perpetually", - "perferences", "preferences", - "perfomrance", "performances", - "perforamnce", "performances", - "performaces", "performances", - "performacne", "performances", - "performanes", "performances", - "performanse", "performances", - "performence", "performance", - "performnace", "performances", - "perfromance", "performance", - "perhiperals", "peripherals", - "perihperals", "peripherals", - "periodicaly", "periodically", - "periperhals", "peripherals", - "periphereal", "peripheral", - "peripherial", "peripheral", - "periphirals", "peripherals", - "periphreals", "peripherals", - "periphrials", "peripherals", - "perjorative", "pejorative", - "perliminary", "preliminary", - "permamently", "permanently", - "permanantly", "permanently", - "permaturely", "prematurely", - "permenantly", "permanently", - "permenently", "permanently", - "perminantly", "permanently", - "perminently", "permanently", - "permisisons", "permissions", - "permissable", "permissible", - "permisssion", "permissions", - "pernamently", "permanently", - "perosnality", "personality", - "perparation", "preparation", - "perpatrated", "perpetrated", - "perpatrator", "perpetrator", - "perpatuated", "perpetuated", - "perpatuates", "perpetuates", - "perpertated", "perpetuated", - "perpertator", "perpetrators", - "perpetraded", "perpetrated", - "perpetrador", "perpetrator", - "perpetraron", "perpetrator", - "perpetrater", "perpetrator", - "perpetuaded", "perpetuated", - "perpetutate", "perpetuate", - "perpetuties", "perpetuates", - "perpitrated", "perpetrated", - "perpitrator", "perpetrator", - "perpretated", "perpetrated", - "perpretator", "perpetrators", - "perpsective", "perspective", - "perputrator", "perpetrator", - "perputually", "perpetually", - "perputuated", "perpetuated", - "perputuates", "perpetuates", - "perrogative", "prerogative", - "persceptive", "perspectives", - "persectuion", "persecution", - "persecucion", "persecution", - "persecusion", "persecution", - "persecutted", "persecuted", - "persepctive", "perspective", - "persicution", "persecution", - "persistance", "persistence", - "persistante", "persistent", - "persistense", "persistence", - "persistente", "persistence", - "personhoood", "personhood", - "perspecitve", "perspective", - "perspectief", "perspective", - "perspektive", "perspective", - "persuassion", "persuasion", - "persuassive", "persuasive", - "persucution", "persecution", - "persumption", "presumption", - "pertubation", "perturbation", - "pessimestic", "pessimistic", - "pharamcists", "pharmacist", - "phenomenona", "phenomena", - "philadelpha", "philadelphia", - "philadelpia", "philadelphia", - "philiphines", "philippines", - "philippenes", "philippines", - "philippenis", "philippines", - "philippides", "philippines", - "philippinas", "philippines", - "philippinos", "philippines", - "philisopher", "philosopher", - "phillipines", "philippines", - "philosipher", "philosopher", - "philosopers", "philosophers", - "philosophae", "philosopher", - "philosophia", "philosophical", - "philosopies", "philosophies", - "philosphies", "philosophies", - "philospoher", "philosopher", - "photograhed", "photographed", - "photograher", "photographer", - "photograhic", "photographic", - "photograhpy", "photography", - "photograped", "photographed", - "photograper", "photographer", - "photograpgh", "photographs", - "photograpic", "photographic", - "photogrpahs", "photographs", - "photogrpahy", "photography", - "physcedelic", "psychedelic", - "physciatric", "psychiatric", - "physcopaths", "psychopaths", - "piankillers", "painkillers", - "pilgrimmage", "pilgrimage", - "pitchforcks", "pitchforks", - "pitchforkes", "pitchforks", - "plaestinian", "palestinian", - "plagiariasm", "plagiarism", - "planeswaker", "planeswalker", - "planeswaler", "planeswalker", - "planeswalkr", "planeswalker", - "platfromers", "platformer", - "playhtrough", "playthrough", - "playthorugh", "playthrough", - "playthourgh", "playthrough", - "playthroguh", "playthroughs", - "playthrougs", "playthroughs", - "playthrouhg", "playthroughs", - "playthtough", "playthrough", - "playtrhough", "playthrough", - "ploretariat", "proletariat", - "policitally", "politically", - "policitians", "politicians", - "politicains", "politicians", - "politicanti", "politician", - "politiciens", "politicians", - "politiicans", "politician", - "polititians", "politicians", - "polyphonyic", "polyphonic", - "pomegranite", "pomegranate", - "popluations", "populations", - "poportional", "proportional", - "popoulation", "population", - "porjectiles", "projectiles", - "porletariat", "proletariat", - "pornagraphy", "pornography", - "pornograghy", "pornography", - "pornograhpy", "pornography", - "pornograpgy", "pornography", - "pornogrophy", "pornography", - "pornogrpahy", "pornography", - "porportions", "proportions", - "portestants", "protestants", - "portuguease", "portuguese", - "portuguesse", "portuguese", - "positionial", "positional", - "positionnal", "positional", - "positionned", "positioned", - "positiveity", "positivity", - "positiviely", "positively", - "positivisme", "positives", - "positivisty", "positivity", - "positivitey", "positivity", - "positivitiy", "positivity", - "possesseurs", "possesses", - "possesssion", "possessions", - "possestions", "possessions", - "possiblilty", "possibility", - "potencially", "potentially", - "potentailly", "potentially", - "powerhourse", "powerhouse", - "powerlifing", "powerlifting", - "powerliftng", "powerlifting", - "pracitcally", "practically", - "practicarlo", "practical", - "practioners", "practitioners", - "practitions", "practitioners", - "pragmatisch", "pragmatic", - "precausions", "precautions", - "precedessor", "predecessor", - "precendence", "precedence", - "precentages", "percentages", - "preconceved", "preconceived", - "preconcieve", "preconceived", - "precuations", "precautions", - "predacessor", "predecessor", - "predecesser", "predecessor", - "predections", "predictions", - "predescesor", "predecessors", - "predesessor", "predecessors", - "predesposed", "predisposed", - "predessecor", "predecessor", - "predicatble", "predictable", - "predicement", "predicament", - "predicessor", "predecessor", - "prediciment", "predicament", - "predicitons", "predictions", - "predictible", "predictable", - "predictious", "predictions", - "predictment", "predicament", - "predisposte", "predisposed", - "predocessor", "predecessor", - "preferabbly", "preferably", - "preferabely", "preferable", - "preferabley", "preferably", - "preferablly", "preferably", - "preferances", "preferences", - "preferenser", "preferences", - "preferental", "preferential", - "preferentes", "preferences", - "preferrably", "preferably", - "preferrring", "preferring", - "preformance", "performance", - "pregnanices", "pregnancies", - "pregnencies", "pregnancies", - "pregorative", "prerogative", - "preipherals", "peripherals", - "prejudicies", "prejudice", - "preleminary", "preliminary", - "prelimanary", "preliminary", - "prelimenary", "preliminary", - "premanently", "permanently", - "prematuraly", "prematurely", - "prematurily", "prematurely", - "prematurley", "prematurely", - "premilinary", "preliminary", - "premissible", "permissible", - "premissions", "permissions", - "preorderded", "preordered", - "preorderers", "preorders", - "preparacion", "preparation", - "preperation", "preparation", - "prepetrated", "perpetrated", - "prepetrator", "perpetrator", - "prepetually", "perpetually", - "prepetuated", "perpetuated", - "prepetuates", "perpetuates", - "preporation", "preparation", - "preposterus", "preposterous", - "prerequesit", "prerequisite", - "prerequiste", "prerequisite", - "prerequites", "prerequisite", - "prerogitive", "prerogative", - "prerogotive", "prerogative", - "prescripton", "prescription", - "presecution", "persecution", - "presedintia", "presidential", - "presentaion", "presentation", - "presentatin", "presentations", - "preservaton", "preservation", - "preservered", "preserved", - "presidencey", "presidency", - "presidental", "presidential", - "presidentcy", "presidency", - "presistence", "persistence", - "presitgious", "prestigious", - "presitigous", "prestigious", - "presomption", "presumption", - "prespective", "perspective", - "pressureing", "pressuring", - "prestegious", "prestigious", - "prestigeous", "prestigious", - "prestigieus", "prestigious", - "prestigiosa", "prestigious", - "prestigiose", "prestigious", - "prestigiosi", "prestigious", - "prestigioso", "prestigious", - "prestiguous", "prestigious", - "presumabely", "presumably", - "presumabley", "presumably", - "presumptous", "presumptuous", - "presumptuos", "presumptuous", - "pretencious", "pretentious", - "pretendendo", "pretended", - "pretensious", "pretentious", - "pretentieus", "pretentious", - "prevailaing", "prevailing", - "prevailling", "prevailing", - "preventitve", "preventative", - "preventivno", "prevention", - "primatively", "primitively", - "princessses", "princesses", - "principales", "principles", - "principalis", "principals", - "principielt", "principle", - "privatizied", "privatized", - "priveledges", "privileges", - "privelleges", "privileges", - "privilegeds", "privileges", - "privilegied", "privileged", - "privilegien", "privilege", - "privilegier", "privilege", - "privilegies", "privilege", - "proactivley", "proactive", - "probabilaty", "probability", - "probabilite", "probabilities", - "probalibity", "probability", - "probelmatic", "problematic", - "problamatic", "problematic", - "problimatic", "problematic", - "problomatic", "problematic", - "proccedings", "proceedings", - "proccessing", "processing", - "proceddings", "proceedings", - "procedureal", "procedural", - "procedurial", "procedural", - "procedurile", "procedure", - "processesor", "processors", - "processeurs", "processes", - "processsors", "processors", - "procrastion", "procreation", - "procriation", "procreation", - "prodcutions", "productions", - "prodictions", "productions", - "producerats", "producers", - "producitons", "productions", - "productioin", "productions", - "productivos", "productions", - "productivty", "productivity", - "produktions", "productions", - "professinal", "professional", - "professionl", "professionals", - "professoras", "professors", - "professores", "professors", - "professorin", "profession", - "professsion", "professions", - "proficiancy", "proficiency", - "proficienct", "proficient", - "proficienty", "proficiency", - "proficinecy", "proficiency", - "profitabile", "profitable", - "progerssion", "progressions", - "progerssive", "progressives", - "programable", "programmable", - "programmare", "programmer", - "programmars", "programmers", - "programmate", "programme", - "programmets", "programmers", - "programmeur", "programmer", - "programmier", "programmer", - "programmmed", "programme", - "programmmer", "programme", - "progresison", "progressions", - "progressers", "progresses", - "progressief", "progressive", - "progressino", "progressions", - "progressivo", "progression", - "progressoin", "progressions", - "progressvie", "progressives", - "prohabition", "prohibition", - "prohibation", "prohibition", - "prohibicion", "prohibition", - "prohibiteds", "prohibits", - "prohibitied", "prohibited", - "prohibitifs", "prohibits", - "prohibitivo", "prohibition", - "prohibitons", "prohibits", - "prohibitted", "prohibited", - "projecticle", "projectile", - "projectives", "projectiles", - "projectlies", "projectiles", - "prolateriat", "proletariat", - "proletariet", "proletariat", - "proletariot", "proletariat", - "proletaryat", "proletariat", - "proleteriat", "proletariat", - "prolitariat", "proletariat", - "prologomena", "prolegomena", - "promenantly", "prominently", - "promenently", "prominently", - "prometheius", "prometheus", - "prometheous", "prometheus", - "promethesus", "prometheus", - "prometheyus", "prometheus", - "promimently", "prominently", - "prominantly", "prominently", - "prominately", "prominently", - "promiscious", "promiscuous", - "promocional", "promotional", - "promsicuous", "promiscuous", - "pronography", "pornography", - "pronoucning", "pronouncing", - "pronounched", "pronounced", - "pronunciato", "pronunciation", - "propaganada", "propaganda", - "properitary", "proprietary", - "propertiary", "proprietary", - "propertions", "proportions", - "prophechies", "prophecies", - "propiertary", "proprietary", - "propogation", "propagation", - "proponenets", "proponents", - "proponentes", "proponents", - "proporition", "proposition", - "proportians", "proportions", - "proportinal", "proportional", - "proposicion", "proposition", - "propositivo", "proposition", - "propostions", "proportions", - "propreitary", "proprietary", - "propriatary", "proprietary", - "propriatery", "proprietary", - "propriatory", "proprietary", - "proprietery", "proprietary", - "proprietory", "proprietary", - "propriotary", "proprietary", - "proprotions", "proportions", - "propsective", "prospective", - "propulstion", "propulsion", - "prosectuion", "prosecution", - "prosectuors", "prosecutors", - "prosecuters", "prosecutors", - "prosicution", "prosecution", - "prosocution", "prosecution", - "prosperious", "prosperous", - "prospertity", "prosperity", - "prospettive", "prospective", - "prostethics", "prosthetic", - "prosthethic", "prosthetic", - "prostitites", "prostitutes", - "prostitiute", "prostitute", - "prostituate", "prostitute", - "prostitudes", "prostitutes", - "prostituees", "prostitutes", - "prostituion", "prostitution", - "prostitures", "prostitutes", - "prostitutas", "prostitutes", - "prostitutie", "prostitute", - "prostitutin", "prostitution", - "prostitutke", "prostitutes", - "prostituton", "prostitution", - "prostitutos", "prostitutes", - "protability", "portability", - "protaganist", "protagonist", - "protaginist", "protagonist", - "protagnoist", "protagonist", - "protagoinst", "protagonists", - "protagonits", "protagonists", - "protagonsit", "protagonists", - "protectings", "protections", - "protectoras", "protectors", - "protectores", "protectors", - "protectrons", "protections", - "protelariat", "proletariat", - "protestents", "protestants", - "protistants", "protestants", - "protoganist", "protagonist", - "protogonist", "protagonist", - "protostants", "protestants", - "protototype", "prototype", - "provacative", "provocative", - "provacotive", "provocative", - "provicative", "provocative", - "providencie", "providence", - "provinciaal", "provincial", - "provinicial", "provincial", - "provisiones", "provisions", - "provoactive", "provocative", - "provocatief", "provocative", - "provocitive", "provocative", - "provocotive", "provocative", - "provokative", "provocative", - "pscyhedelic", "psychedelic", - "pscyhiatric", "psychiatric", - "pscyhopaths", "psychopaths", - "pshyciatric", "psychiatric", - "pshycopaths", "psychopaths", - "psychaitric", "psychiatric", - "psychedilic", "psychedelic", - "psychedleic", "psychedelics", - "psychiatist", "psychiatrist", - "psychidelic", "psychedelic", - "psychodelic", "psychedelic", - "psychopants", "psychopaths", - "psychopatch", "psychopath", - "psychopatic", "psychopathic", - "psychotisch", "psychotic", - "psychriatic", "psychiatric", - "publikation", "publication", - "punctiation", "punctuation", - "puncutation", "punctuation", - "punshiments", "punishments", - "punsihments", "punishments", - "purchaseing", "purchasing", - "purchashing", "purchasing", - "purposefuly", "purposefully", - "pyschedelic", "psychedelic", - "pyschiatric", "psychiatric", - "pyschopaths", "psychopaths", - "qaurterback", "quarterback", - "qualificato", "qualification", - "qualifieres", "qualifiers", - "quantitaive", "quantitative", - "quantitatve", "quantitative", - "quantitites", "quantities", - "quantitties", "quantities", - "quarantaine", "quarantine", - "quarantenni", "quarantine", - "quartercask", "quarterbacks", - "quesitoning", "questioning", - "questionned", "questioned", - "questonable", "questionable", - "radiaoctive", "radioactive", - "radioactice", "radioactive", - "radioactief", "radioactive", - "radioaktive", "radioactive", - "radiocative", "radioactive", - "raidoactive", "radioactive", - "reaccurring", "recurring", - "reactionair", "reactionary", - "realibility", "reliability", - "realistisch", "realistic", - "reaserchers", "researchers", - "reaserching", "researching", - "reasonabley", "reasonably", - "reasonablly", "reasonably", - "reassureing", "reassuring", - "reassurring", "reassuring", - "rebuildling", "rebuilding", - "rebuplicans", "republicans", - "reccomended", "recommended", - "receptionst", "receptionist", - "recgonition", "recognition", - "recgonizing", "recognizing", - "rechargable", "rechargeable", - "recipientes", "recipients", - "reciporcate", "reciprocate", - "recipricate", "reciprocate", - "reciprocant", "reciprocate", - "reciprocite", "reciprocate", - "recivership", "receivership", - "reclutantly", "reluctantly", - "recognicing", "recognizing", - "recognision", "recognition", - "recomending", "recommending", - "recommandes", "recommends", - "recommendes", "recommends", - "recommented", "recommended", - "reconcilled", "reconcile", - "recongition", "recognition", - "recongizing", "recognizing", - "reconsidder", "reconsider", - "recrational", "recreational", - "recrutiment", "recruitment", - "rectangluar", "rectangular", - "rectangualr", "rectangular", - "rectengular", "rectangular", - "recuritment", "recruitment", - "redundantcy", "redundancy", - "reevalulate", "reevaluate", - "reevalutate", "reevaluate", - "reevaulated", "reevaluate", - "refelctions", "reflections", - "referancing", "referencing", - "refereneced", "referenced", - "refereneces", "references", - "referincing", "referencing", - "referrences", "references", - "reflectivos", "reflections", - "refreshener", "refresher", - "refrubished", "refurbished", - "refubrished", "refurbished", - "refurbushed", "refurbished", - "regeneratin", "regeneration", - "regeneraton", "regeneration", - "registerdns", "registers", - "registeries", "registers", - "registerred", "registered", - "registraion", "registration", - "regocnition", "recognition", - "regresssion", "regression", - "regresssive", "regressive", - "regualtions", "regulations", - "regulationg", "regulating", - "regulatiors", "regulators", - "reinassance", "renaissance", - "reinforcemt", "reinforcement", - "reinfornced", "reinforced", - "reinitalise", "reinitialise", - "reinitalize", "reinitialize", - "reinstaling", "reinstalling", - "reinstallng", "reinstalling", - "reisntalled", "reinstalled", - "relaibility", "reliability", - "relatiation", "retaliation", - "relationshp", "relationships", - "relativiser", "relatives", - "relativisme", "relatives", - "relativitiy", "relativity", - "relativitly", "relativity", - "relcutantly", "reluctantly", - "relentlesly", "relentlessly", - "relentlessy", "relentlessly", - "relevations", "revelations", - "relfections", "reflections", - "religeously", "religiously", - "religionens", "religions", - "religioners", "religions", - "relpacement", "replacement", - "reluctently", "reluctantly", - "remarkabley", "remarkably", - "remarkablly", "remarkably", - "remasterred", "remastered", - "remembrence", "remembrance", - "reminescent", "reminiscent", - "reminicient", "reminiscent", - "reminiscant", "reminiscent", - "reminiscint", "reminiscent", - "reminscient", "reminiscent", - "reminsicent", "reminiscent", - "renaiisance", "renaissance", - "renaiscance", "renaissance", - "renaissanse", "renaissance", - "renaissence", "renaissance", - "renassaince", "renaissance", - "renassiance", "renaissance", - "reniassance", "renaissance", - "rennovating", "renovating", - "rennovation", "renovation", - "repalcement", "replacement", - "repbulicans", "republicans", - "repeateadly", "repeatedly", - "repectively", "respectively", - "repersented", "represented", - "replacemnet", "replacements", - "replacemnts", "replacements", - "repleacable", "replaceable", - "repositiory", "repository", - "representas", "represents", - "representes", "represents", - "represssion", "repression", - "reproducion", "reproduction", - "reproducive", "reproductive", - "repsectable", "respectable", - "repsonsible", "responsible", - "repsonsibly", "responsibly", - "republcians", "republicans", - "republician", "republican", - "republicons", "republicans", - "repuglicans", "republicans", - "requeriment", "requirement", - "requierment", "requirements", - "resemblence", "resemblance", - "resemblense", "resembles", - "reserachers", "researchers", - "reseraching", "researching", - "resgination", "resignation", - "residencial", "residential", - "residentail", "residential", - "residentual", "residential", - "resignacion", "resignation", - "resignating", "resignation", - "resignement", "resignment", - "resignition", "resignation", - "resintalled", "reinstalled", - "resistansen", "resistances", - "resistanses", "resistances", - "resistences", "resistances", - "resistnaces", "resistances", - "resoltuions", "resolutions", - "resotration", "restoration", - "resoultions", "resolutions", - "respecatble", "respectable", - "respectabil", "respectable", - "respectfuly", "respectfully", - "respectible", "respectable", - "respectivly", "respectively", - "respectuful", "respectful", - "respektable", "respectable", - "resperatory", "respiratory", - "resperitory", "respiratory", - "respiritory", "respiratory", - "respitatory", "respiratory", - "responcible", "responsible", - "responcibly", "responsibly", - "respondendo", "responded", - "responisble", "responsible", - "responisbly", "responsibly", - "responsable", "responsible", - "responsably", "responsibly", - "responsbile", "responsible", - "responsbily", "responsibly", - "responsibel", "responsibly", - "responsibil", "responsibly", - "responsivle", "responsive", - "resporatory", "respiratory", - "respository", "repository", - "respriatory", "respiratory", - "ressembling", "resembling", - "ressurected", "resurrected", - "restaraunts", "restaurants", - "restaruants", "restaurants", - "restauraunt", "restaurant", - "restaurents", "restaurants", - "resteraunts", "restaurants", - "restirction", "restriction", - "restorarion", "restoration", - "restorating", "restoration", - "restrainted", "restrained", - "restrective", "restrictive", - "restriccion", "restriction", - "restricitng", "restricting", - "restriciton", "restrictions", - "restricitve", "restrictive", - "restricteds", "restricts", - "restricters", "restricts", - "restrictied", "restrictive", - "restrictifs", "restricts", - "restrictins", "restricts", - "restrictios", "restricts", - "restrictivo", "restriction", - "restrictons", "restricts", - "restriktion", "restriction", - "restriktive", "restrictive", - "restrittive", "restrictive", - "restructing", "restricting", - "restruction", "restriction", - "restuarants", "restaurants", - "resturaunts", "restaurants", - "resurecting", "resurrecting", - "resurrecion", "resurrection", - "retailation", "retaliation", - "retalitated", "retaliated", - "retardathon", "retardation", - "retardating", "retardation", - "retardatron", "retardation", - "retartation", "retardation", - "retirbution", "retribution", - "retrebution", "retribution", - "retribucion", "retribution", - "retribuiton", "retribution", - "retributivo", "retribution", - "retribvtion", "retribution", - "retrobution", "retribution", - "retrubution", "retribution", - "revealtions", "revelations", - "revelaitons", "revelations", - "revolations", "revolutions", - "revoultions", "revolutions", - "ridiculious", "ridiculous", - "ridiculosly", "ridiculously", - "ridiculouly", "ridiculously", - "ridiculousy", "ridiculously", - "rightfullly", "rightfully", - "rolepalying", "roleplaying", - "romanticaly", "romantically", - "roundabaout", "roundabout", - "roundabount", "roundabout", - "rudimentery", "rudimentary", - "rudimentory", "rudimentary", - "ruidmentary", "rudimentary", - "sacrifacing", "sacrificing", - "sacrificare", "sacrifice", - "sacrificied", "sacrifice", - "sacrificies", "sacrifice", - "sacrifieced", "sacrificed", - "sacrifising", "sacrificing", - "sacrifizing", "sacrificing", - "salughtered", "slaughtered", - "sanctionned", "sanctioned", - "sarcastisch", "sarcastic", - "saskatchewn", "saskatchewan", - "saskatchwan", "saskatchewan", - "satisfacion", "satisfaction", - "satisfacory", "satisfactory", - "scandanavia", "scandinavia", - "scandanivia", "scandinavian", - "scandenavia", "scandinavia", - "scandianvia", "scandinavian", - "scandimania", "scandinavia", - "scandinaiva", "scandinavian", - "scandinavan", "scandinavian", - "scandivania", "scandinavian", - "scandonavia", "scandinavia", - "scarificing", "sacrificing", - "scheduleing", "scheduling", - "schedulling", "scheduling", - "schoalrship", "scholarships", - "scholarhips", "scholarship", - "scholarstic", "scholastic", - "scholership", "scholarship", - "scholorship", "scholarship", - "scientiests", "scientists", - "scnadinavia", "scandinavia", - "scrambleing", "scrambling", - "screenshoot", "screenshot", - "seamlessley", "seamlessly", - "sedentarity", "sedentary", - "seflishness", "selfishness", - "segergation", "segregation", - "segragation", "segregation", - "segregacion", "segregation", - "segretation", "segregation", - "segrigation", "segregation", - "selectivley", "selectively", - "selfeshness", "selfishness", - "senitmental", "sentimental", - "sensacional", "sensational", - "sensasional", "sensational", - "sensationel", "sensational", - "sensetional", "sensational", - "sensitivety", "sensitivity", - "sentamental", "sentimental", - "sentemental", "sentimental", - "sentenceing", "sentencing", - "sentimentos", "sentiments", - "sentimentul", "sentimental", - "separatedly", "separately", - "separatelly", "separately", - "separatisme", "separates", - "separatiste", "separates", - "sepculating", "speculating", - "serivceable", "serviceable", - "serviciable", "serviceable", - "settelement", "settlement", - "settelments", "settlements", - "settlemetns", "settlements", - "sexualizied", "sexualized", - "shakeapeare", "shakespeare", - "shakepseare", "shakespeare", - "shakesphere", "shakespeare", - "shanenigans", "shenanigans", - "shareholdes", "shareholders", - "sharpeneing", "sharpening", - "sharpenning", "sharpening", - "shatterling", "shattering", - "shatterring", "shattering", - "sheakspeare", "shakespeare", - "shenadigans", "shenanigans", - "shenanagans", "shenanigans", - "shenanagins", "shenanigans", - "shenanegans", "shenanigans", - "shenanegins", "shenanigans", - "shenangians", "shenanigans", - "shenanigens", "shenanigans", - "shenanigins", "shenanigans", - "shenenigans", "shenanigans", - "sheninigans", "shenanigans", - "shennaigans", "shenanigans", - "shortenning", "shortening", - "shortenting", "shortening", - "signficiant", "significant", - "signifantly", "significantly", - "significane", "significance", - "significato", "significant", - "signifigant", "significant", - "signifikant", "significant", - "signitories", "signatories", - "signularity", "singularity", - "similarites", "similarities", - "similarlity", "similarity", - "similiarity", "similarity", - "simluations", "simulations", - "simplefying", "simplifying", - "simplicitly", "simplicity", - "simplifiing", "simplifying", - "simplisitic", "simplistic", - "simplyifing", "simplifying", - "simualtions", "simulations", - "simulatious", "simulations", - "simultaneos", "simultaneous", - "simultaneus", "simultaneous", - "simultanous", "simultaneous", - "singluarity", "singularity", - "singualrity", "singularity", - "singulairty", "singularity", - "singularily", "singularity", - "sitautional", "situational", - "situacional", "situational", - "situationly", "situational", - "siutational", "situational", - "skatebaords", "skateboard", - "skateboader", "skateboard", - "skepticisim", "skepticism", - "skillshoots", "skillshots", - "skillshosts", "skillshots", - "slaugthered", "slaughtered", - "slefishness", "selfishness", - "sluaghtered", "slaughtered", - "smarthpones", "smartphones", - "snowboaring", "snowboarding", - "snowbolling", "snowballing", - "snowfalling", "snowballing", - "socailizing", "socializing", - "socialicing", "socializing", - "socialistes", "socialists", - "socialistos", "socialists", - "socializare", "socialize", - "sociapathic", "sociopathic", - "sociologial", "sociological", - "sociopathes", "sociopaths", - "sociopathis", "sociopaths", - "sociophatic", "sociopathic", - "solidariety", "solidarity", - "somethingis", "somethings", - "sorrounding", "surrounding", - "soundtrakcs", "soundtracks", - "southamtpon", "southampton", - "southanpton", "southampton", - "southapmton", "southampton", - "southernese", "southerners", - "southerness", "southerners", - "southernest", "southerners", - "southernors", "southerners", - "southmapton", "southampton", - "southtampon", "southampton", - "soveregnity", "sovereignty", - "sovereighty", "sovereignty", - "sovereingty", "sovereignty", - "sovereinity", "sovereignty", - "soveriegnty", "sovereignty", - "soveriengty", "sovereignty", - "soverignity", "sovereignty", - "specailists", "specialists", - "specailized", "specialized", - "specailizes", "specializes", - "specatcular", "spectacular", - "specialiced", "specialized", - "specialices", "specializes", - "specialites", "specializes", - "speciallist", "specialist", - "speciallity", "specially", - "speciallize", "specialize", - "specialzied", "specialized", - "specifcally", "specifically", - "specificaly", "specifically", - "specificato", "specification", - "specificies", "specifics", - "specifiying", "specifying", - "specilaized", "specialize", - "speciliazed", "specialize", - "spectatores", "spectators", - "spectatular", "spectacular", - "spectauclar", "spectacular", - "spectaulars", "spectaculars", - "spectecular", "spectacular", - "specualting", "speculating", - "specualtion", "speculation", - "specualtive", "speculative", - "specularite", "speculative", - "speculaties", "speculative", - "spiritualiy", "spiritually", - "spiritualty", "spirituality", - "spirituella", "spiritually", - "spirtiually", "spiritually", - "spirutually", "spiritually", - "spitirually", "spiritually", - "sponatenous", "spontaneous", - "sponatneous", "spontaneous", - "sponsership", "sponsorship", - "sponsorhips", "sponsorship", - "sponsorhsip", "sponsorship", - "sponsorshop", "sponsorship", - "spontaenous", "spontaneous", - "spontainous", "spontaneous", - "spontaneuos", "spontaneous", - "spontanious", "spontaneous", - "sponteanous", "spontaneous", - "sponteneous", "spontaneous", - "spreadhseet", "spreadsheet", - "spreadsheat", "spreadsheet", - "spreadshets", "spreadsheets", - "spreedsheet", "spreadsheet", - "springfeild", "springfield", - "springfiled", "springfield", - "sprinklered", "sprinkled", - "squirrelies", "squirrels", - "squirrelius", "squirrels", - "stabilizare", "stabilize", - "stabilizied", "stabilize", - "stabilizier", "stabilize", - "stabilizies", "stabilize", - "staggerring", "staggering", - "staggerwing", "staggering", - "stationairy", "stationary", - "stationerad", "stationed", - "stationnary", "stationary", - "statisitcal", "statistical", - "statisticly", "statistical", - "statistisch", "statistics", - "statsitical", "statistical", - "stereotpyes", "stereotypes", - "stereotying", "stereotyping", - "steriotypes", "stereotypes", - "steroetypes", "stereotypes", - "steryotypes", "stereotypes", - "stimluating", "stimulating", - "stimualting", "stimulating", - "stimualtion", "stimulation", - "stimulantes", "stimulants", - "stockpilled", "stockpile", - "stormfrount", "stormfront", - "storyteling", "storytelling", - "straightden", "straightened", - "straightend", "straightened", - "straightmen", "straighten", - "straightned", "straightened", - "straightner", "straighten", - "strangeshit", "strangest", - "strategisch", "strategic", - "strategiske", "strategies", - "strawberies", "strawberries", - "strawberrry", "strawberry", - "strawbrerry", "strawberry", - "strenghened", "strengthened", - "strenghtend", "strengthen", - "strenghtens", "strengthen", - "strengtened", "strengthened", - "structurels", "structures", - "strugglebus", "struggles", - "struggleing", "struggling", - "stubborness", "stubbornness", - "stutterring", "stuttering", - "subcatagory", "subcategory", - "subconscius", "subconscious", - "subconscous", "subconscious", - "subisdizing", "subsidizing", - "subjectivly", "subjectively", - "submergered", "submerged", - "submisisons", "submissions", - "subredddits", "subreddits", - "subscirbers", "subscribers", - "subscribbed", "subscribe", - "subscribber", "subscriber", - "subscriping", "subscribing", - "subscriptin", "subscriptions", - "subscripton", "subscription", - "subsequenty", "subsequently", - "subsidiezed", "subsidized", - "subsidizied", "subsidized", - "subsidizies", "subsidize", - "subsiziding", "subsidizing", - "subsquently", "subsequently", - "subsrcibers", "subscribers", - "substancial", "substantial", - "substansial", "substantial", - "substansive", "substantive", - "substantied", "substantive", - "substanties", "substantive", - "substential", "substantial", - "substitiute", "substitute", - "substituded", "substituted", - "substitudes", "substitutes", - "substituion", "substitution", - "substitures", "substitutes", - "substitutie", "substitutes", - "substitutos", "substitutes", - "substitutue", "substitutes", - "substracted", "subtracted", - "suburburban", "suburban", - "succesfully", "successfully", - "successeurs", "successes", - "successfull", "successful", - "successfuly", "successfully", - "successsion", "succession", - "successully", "successfully", - "succsesfull", "successfully", - "sucessfully", "successfully", - "sucseptible", "susceptible", - "sufficently", "sufficiently", - "suggestieve", "suggestive", - "sumbissions", "submissions", - "sunglassses", "sunglasses", - "superceeded", "superseded", - "superficiel", "superficial", - "superfulous", "superfluous", - "superhereos", "superhero", - "superifical", "superficial", - "superiorest", "superiors", - "supermacist", "supremacist", - "supermakert", "supermarkets", - "supermakret", "supermarkets", - "supermakter", "supermarkets", - "supermarkts", "supermarkets", - "supermaster", "supermarkets", - "supernatual", "supernatural", - "supersition", "supervision", - "superstiton", "superstition", - "supervisers", "supervisors", - "supervisior", "supervisor", - "suplimented", "supplemented", - "supplaments", "supplements", - "supplemetal", "supplemental", - "supporteurs", "supporters", - "supposedely", "supposedly", - "supposidely", "supposedly", - "supposingly", "supposedly", - "suppresions", "suppression", - "suppresssor", "suppressor", - "supramacist", "supremacist", - "supremacits", "supremacist", - "supremasist", "supremacist", - "supremicist", "supremacist", - "suprimacist", "supremacist", - "suprisingly", "surprisingly", - "suprizingly", "surprisingly", - "suroundings", "surroundings", - "surpemacist", "supremacist", - "surprisinly", "surprisingly", - "surreptious", "surreptitious", - "surroundign", "surroundings", - "surroundigs", "surrounds", - "surroundins", "surrounds", - "surroundngs", "surrounds", - "surveilence", "surveillance", - "survivabily", "survivability", - "susbtantial", "substantial", - "susbtantive", "substantive", - "suscepitble", "susceptible", - "susceptable", "susceptible", - "suscpetible", "susceptible", - "susecptible", "susceptible", - "suspectible", "susceptible", - "suspiciosly", "suspiciously", - "suspiciouly", "suspiciously", - "suspiciouns", "suspicion", - "suspicision", "suspicions", - "suspicisons", "suspicions", - "sustainible", "sustainable", - "switerzland", "switzerland", - "switserland", "switzerland", - "switzlerand", "switzerland", - "swizterland", "switzerland", - "swtizerland", "switzerland", - "symapthetic", "sympathetic", - "symmertical", "symmetrical", - "sympathatic", "sympathetic", - "sympathiers", "sympathizers", - "sympathsize", "sympathize", - "sympethetic", "sympathetic", - "symphatetic", "sympathetic", - "symphatized", "sympathize", - "symphatizer", "sympathizers", - "symphatizes", "sympathize", - "sympothetic", "sympathetic", - "synthesasia", "synthesis", - "synthesesia", "synthesis", - "sypmathetic", "sympathetic", - "tabelspoons", "tablespoons", - "tablepsoons", "tablespoons", - "tablespooon", "tablespoon", - "tablesppons", "tablespoons", - "tailgateing", "tailgating", - "tailgatting", "tailgating", - "tangentialy", "tangentially", - "techincally", "technically", - "techincians", "technicians", - "techiniques", "techniques", - "techncially", "technically", - "technicalty", "technicality", - "technichian", "technician", - "technicials", "technicians", - "techniciens", "technicians", - "technitians", "technicians", - "technnology", "technology", - "technologia", "technological", - "techticians", "technicians", - "teleportato", "teleportation", - "teleportion", "teleporting", - "teleproting", "teleporting", - "temeprature", "temperature", - "temparament", "temperament", - "temparature", "temperature", - "temparement", "temperament", - "tempearture", "temperatures", - "temperamant", "temperament", - "temperarily", "temporarily", - "temperatues", "temperatures", - "temperaturs", "temperatures", - "temperatuur", "temperature", - "temperement", "temperament", - "tempermeant", "temperament", - "tempertaure", "temperature", - "temporairly", "temporarily", - "temporaraly", "temporarily", - "temporarity", "temporarily", - "tempreature", "temperature", - "temproarily", "temporarily", - "tempurature", "temperature", - "tepmorarily", "temporarily", - "termanology", "terminology", - "terminacion", "termination", - "terminaison", "termination", - "terminalogy", "terminology", - "terminatior", "terminator", - "terminatorn", "termination", - "terminilogy", "terminology", - "terminoligy", "terminology", - "terratorial", "territorial", - "terratories", "territories", - "terretorial", "territorial", - "terretories", "territories", - "terrirorial", "territorial", - "terrirories", "territories", - "terriroties", "territories", - "terristrial", "territorial", - "territoires", "territories", - "territorist", "terrorist", - "territority", "territory", - "terroristas", "terrorists", - "terroristes", "terrorists", - "terrorities", "territories", - "terrotorial", "territorial", - "terrotories", "territories", - "testiclular", "testicular", - "thankfullly", "thankfully", - "thanksgivng", "thanksgiving", - "theoligical", "theological", - "theoratical", "theoretical", - "theoreticly", "theoretical", - "theoritical", "theoretical", - "therapautic", "therapeutic", - "therapeudic", "therapeutic", - "therapeutuc", "therapeutic", - "therapuetic", "therapeutic", - "theraupetic", "therapeutic", - "thereaputic", "therapeutic", - "thereotical", "theoretical", - "therepeutic", "therapeutic", - "thermometor", "thermometer", - "thermometre", "thermometer", - "thermomiter", "thermometer", - "thermomoter", "thermometer", - "thermoneter", "thermometer", - "thermostaat", "thermostat", - "theroetical", "theoretical", - "thoeretical", "theoretical", - "threataning", "threatening", - "threatended", "threatened", - "threatining", "threatening", - "throttleing", "throttling", - "throughoput", "throughput", - "throughtout", "throughout", - "throughtput", "throughput", - "thudnerbolt", "thunderbolt", - "thunberbolt", "thunderbolt", - "thunderblot", "thunderbolt", - "thunderboat", "thunderbolt", - "thunderbots", "thunderbolt", - "thunderbowl", "thunderbolt", - "thunderjolt", "thunderbolt", - "thundervolt", "thunderbolt", - "tightenting", "tightening", - "tocuhscreen", "touchscreen", - "torrentking", "torrenting", - "torrentting", "torrenting", - "torublesome", "troublesome", - "torunaments", "tournaments", - "totalitaran", "totalitarian", - "totalitarni", "totalitarian", - "touranments", "tournaments", - "tournamnets", "tournaments", - "tournemants", "tournaments", - "tournements", "tournaments", - "tournmanets", "tournaments", - "tradicional", "traditional", - "tradionally", "traditionally", - "tradisional", "traditional", - "traditionel", "traditional", - "traditition", "tradition", - "tragicallly", "tragically", - "tramautized", "traumatized", - "tramuatized", "traumatized", - "trancendent", "transcendent", - "trancending", "transcending", - "tranclucent", "translucent", - "trandgender", "transgender", - "tranditions", "transitions", - "tranistions", "transitions", - "tranlastion", "translations", - "tranlsating", "translating", - "tranlsation", "translation", - "tranluscent", "translucent", - "trannsexual", "transsexual", - "tranpshobic", "transphobic", - "transaccion", "transaction", - "transaciton", "transactions", - "transalting", "translating", - "transaltion", "translation", - "transations", "transitions", - "transcluent", "translucent", - "transcripto", "transcription", - "transctions", "transitions", - "transculent", "translucent", - "transending", "transcending", - "transfender", "transgender", - "transferers", "transfers", - "transfering", "transferring", - "transfersom", "transforms", - "transfomers", "transforms", - "transformas", "transforms", - "transformes", "transformers", - "transformis", "transforms", - "transformus", "transforms", - "transforums", "transforms", - "transfromed", "transformed", - "transfromer", "transformers", - "transgemder", "transgender", - "transgended", "transgendered", - "transgenger", "transgender", - "transgenres", "transgender", - "transhpobic", "transphobic", - "transisions", "transitions", - "transisitor", "transistor", - "transistion", "transition", - "transistior", "transistor", - "transitiond", "transitioned", - "transitiong", "transitioning", - "translatron", "translation", - "translusent", "translucent", - "transmatter", "transmitter", - "transmision", "transmission", - "transmissin", "transmissions", - "transmisson", "transmission", - "transmittor", "transmitter", - "transmorged", "transformed", - "transmutter", "transmitter", - "transofrmed", "transformed", - "transohobic", "transphobic", - "transparant", "transparent", - "transparecy", "transparency", - "transpareny", "transparency", - "transperant", "transparent", - "transperent", "transparent", - "transphonic", "transphobic", - "transphopic", "transphobic", - "transplanet", "transplant", - "transporder", "transporter", - "transporing", "transporting", - "transportar", "transporter", - "transportng", "transporting", - "transportor", "transporter", - "transseuxal", "transsexual", - "transsexaul", "transsexual", - "transsexuel", "transsexual", - "transulcent", "translucent", - "transylvnia", "transylvania", - "tranzformer", "transformer", - "tranzitions", "transitions", - "tranzporter", "transporter", - "trasncripts", "transcripts", - "trasnferred", "transferred", - "trasnformed", "transformed", - "trasnformer", "transformer", - "trasngender", "transgender", - "trasnmitted", "transmitted", - "trasnmitter", "transmitter", - "trasnparent", "transparent", - "trasnphobic", "transphobic", - "trasnported", "transported", - "trasnporter", "transporter", - "traumatisch", "traumatic", - "traumetized", "traumatized", - "traumitized", "traumatized", - "travellerhd", "travelled", - "travellodge", "travelled", - "tremendeous", "tremendous", - "tremendious", "tremendous", - "tremenduous", "tremendous", - "trespessing", "trespassing", - "tresspasing", "trespassing", - "triggereing", "triggering", - "triggerring", "triggering", - "troubelsome", "troublesome", - "truamatized", "traumatized", - "trushworthy", "trustworthy", - "trustowrthy", "trustworthy", - "trustwhorty", "trustworthy", - "trustworhty", "trustworthy", - "truthfullly", "truthfully", - "tupperwears", "tupperware", - "turstworthy", "trustworthy", - "ubiquitious", "ubiquitous", - "ubiquituous", "ubiquitous", - "ukraininans", "ukrainians", - "ultimatelly", "ultimately", - "unanimoulsy", "unanimous", - "unappeasing", "unappealing", - "unappeeling", "unappealing", - "unathorised", "unauthorised", - "unattendend", "unattended", - "unatteneded", "unattended", - "unattracive", "unattractive", - "unauthoried", "unauthorized", - "unavailible", "unavailable", - "unavaliable", "unavailable", - "unaviodable", "unavoidable", - "unbalanaced", "unbalanced", - "unbraikable", "unbreakable", - "unbrakeable", "unbreakable", - "unbreakabie", "unbreakable", - "unbreakabke", "unbreakable", - "unbreakbale", "unbreakable", - "unbreakeble", "unbreakable", - "unbrearable", "unbreakable", - "uncensorred", "uncensored", - "uncertaincy", "uncertainty", - "uncertanity", "uncertainty", - "uncertianty", "uncertainty", - "unchangable", "unchangeable", - "uncompetive", "uncompetitive", - "unconcsious", "unconscious", - "unconsicous", "unconscious", - "uncouncious", "unconscious", - "undeniabely", "undeniably", - "undeniabley", "undeniably", - "undeniablly", "undeniably", - "undenialbly", "undeniably", - "underestime", "underestimate", - "undergating", "undertaking", - "undergorund", "underground", - "underheight", "underweight", - "undermiming", "undermining", - "undermindes", "undermines", - "undernearth", "underneath", - "underneight", "underweight", - "underpining", "undermining", - "underpowerd", "underpowered", - "underpowred", "underpowered", - "underratted", "underrated", - "understannd", "understands", - "understsand", "understands", - "undertacker", "undertaker", - "underwarter", "underwater", - "underwieght", "underweight", - "underwright", "underweight", - "undesireble", "undesirable", - "undesriable", "undesirable", - "undetecable", "undetectable", - "undiserable", "undesirable", - "undoubedtly", "undoubtedly", - "undoubetdly", "undoubtedly", - "undoubtadly", "undoubtedly", - "undoubtebly", "undoubtedly", - "undoubtetly", "undoubtedly", - "undreground", "underground", - "unemployeed", "unemployed", - "unemployent", "unemployment", - "unemploymed", "unemployed", - "unexpectdly", "unexpectedly", - "unexpectely", "unexpectedly", - "unfamilliar", "unfamiliar", - "unfortuante", "unfortunate", - "ungreatfull", "ungrateful", - "unilateraly", "unilaterally", - "unilaterlly", "unilaterally", - "unimportent", "unimportant", - "uninspiried", "uninspired", - "uninstaling", "uninstalling", - "uninstallng", "uninstalling", - "uninteresed", "uninterested", - "uniquesness", "uniqueness", - "unisntalled", "uninstalled", - "universella", "universally", - "universites", "universities", - "univesities", "universities", - "unjustifyed", "unjustified", - "unknowinlgy", "unknowingly", - "unkowningly", "unknowingly", - "unnecassary", "unnecessary", - "unneccesary", "unnecessary", - "unnecessery", "unnecessary", - "unnecissary", "unnecessary", - "unnessecary", "unnecessary", - "unnistalled", "uninstalled", - "unoriginial", "unoriginal", - "unorigional", "unoriginal", - "unoticeable", "unnoticeable", - "unpleaseant", "unpleasant", - "unportected", "unprotected", - "unprepaired", "unprepared", - "unpreparred", "unprepared", - "unproducive", "unproductive", - "unprotexted", "unprotected", - "unqaulified", "unqualified", - "unrealisitc", "unrealistic", - "unrealsitic", "unrealistic", - "unreasonbly", "unreasonably", - "unregluated", "unregulated", - "unregualted", "unregulated", - "unregulared", "unregulated", - "unrepentent", "unrepentant", - "unresponive", "unresponsive", - "unrestriced", "unrestricted", - "unsettleing", "unsettling", - "unsintalled", "uninstalled", - "unsolicated", "unsolicited", - "unsoliticed", "unsolicited", - "unsolocited", "unsolicited", - "unsubscirbe", "unsubscribe", - "unsubscrbed", "unsubscribed", - "unsubscried", "unsubscribed", - "unsubscripe", "unsubscribe", - "unsubscrive", "unsubscribe", - "unsubscrube", "unsubscribe", - "unsubsrcibe", "unsubscribe", - "unsuccesful", "unsuccessful", - "unsuccessul", "unsuccessful", - "unsucesfuly", "unsuccessfully", - "unsucessful", "unsuccessful", - "unsunscribe", "unsubscribe", - "unsuprising", "unsurprising", - "unsuprizing", "unsurprising", - "unsurprized", "unsurprised", - "unsusbcribe", "unsubscribe", - "unviersally", "universally", - "unwarrented", "unwarranted", - "utiliatrian", "utilitarian", - "utilitatian", "utilitarian", - "utiliterian", "utilitarian", - "utilizacion", "utilization", - "utilizaiton", "utilization", - "utilizating", "utilization", - "utiltiarian", "utilitarian", - "vacciantion", "vaccination", - "vaccinaties", "vaccinate", - "vegaterians", "vegetarians", - "vegetariens", "vegetarians", - "vegetatians", "vegetarians", - "vegeterians", "vegetarians", - "vehementely", "vehemently", - "venezuelean", "venezuela", - "venezuelian", "venezuela", - "ventalation", "ventilation", - "ventelation", "ventilation", - "ventialtion", "ventilation", - "ventilacion", "ventilation", - "verastility", "versatility", - "verfication", "verification", - "versatality", "versatility", - "versitality", "versatility", - "versitilaty", "versatility", - "victorieuse", "victories", - "victoriuous", "victorious", - "vietnameese", "vietnamese", - "vietnamesse", "vietnamese", - "vietnamiese", "vietnamese", - "vietnamnese", "vietnamese", - "vigilanties", "vigilante", - "visibillity", "visibility", - "vocabularly", "vocabulary", - "volatillity", "volatility", - "volonteered", "volunteered", - "volounteers", "volunteers", - "volunatrily", "voluntarily", - "voluntairly", "voluntarily", - "volunteeers", "volunteers", - "volunteraly", "voluntarily", - "voluntereed", "volunteered", - "volunterily", "voluntarily", - "vulnerabile", "vulnerable", - "wallpapaers", "wallpapers", - "wallpappers", "wallpapers", - "washingtion", "washington", - "watermeleon", "watermelon", - "waterprooof", "waterproof", - "wavelegnths", "wavelength", - "wavelenghth", "wavelength", - "wavelenghts", "wavelength", - "weaknessses", "weaknesses", - "wellingston", "wellington", - "wellingtion", "wellington", - "westernerns", "westerners", - "westmisnter", "westminster", - "westmnister", "westminster", - "westmonster", "westminster", - "whisperered", "whispered", - "whitholding", "withholding", - "wikileakers", "wikileaks", - "willingless", "willingness", - "wincheseter", "winchester", - "windsheilds", "windshield", - "withdrawels", "withdrawals", - "withdrawles", "withdrawals", - "withhelding", "withholding", - "withrdawing", "withdrawing", - "witnesssing", "witnessing", - "woodowrking", "woodworking", - "woodworkign", "woodworking", - "worhsipping", "worshipping", - "workstaiton", "workstation", - "workststion", "workstation", - "worshopping", "worshipping", - "xenophoblic", "xenophobic", - "abandining", "abandoning", - "abandonned", "abandoned", - "abbreviato", "abbreviation", - "abnoramlly", "abnormally", - "abnormalty", "abnormally", - "abnornally", "abnormally", - "abominaton", "abomination", - "abondoning", "abandoning", - "aborginial", "aboriginal", - "aboriganal", "aboriginal", - "aborigenal", "aboriginal", - "aborignial", "aboriginal", - "aborigonal", "aboriginal", - "aboroginal", "aboriginal", - "aboslutely", "absolutely", - "abosrption", "absorption", - "abreviated", "abbreviated", - "absintence", "abstinence", - "absitnence", "abstinence", - "absolument", "absolute", - "absolutley", "absolutely", - "absoprtion", "absorption", - "absorbsion", "absorption", - "absorbtion", "absorption", - "absorpsion", "absorption", - "absoultely", "absolutely", - "abstanence", "abstinence", - "abstenance", "abstinence", - "abstenince", "abstinence", - "abstinense", "abstinence", - "abstinince", "abstinence", - "absurditiy", "absurdity", - "abundacies", "abundances", - "academicas", "academics", - "academicos", "academics", - "academicus", "academics", - "accdiently", "accidently", - "accelarate", "accelerate", - "accelerade", "accelerated", - "accelerare", "accelerate", - "accelerato", "acceleration", - "acceleread", "accelerated", - "accelertor", "accelerator", - "accelorate", "accelerate", - "acceptabel", "acceptable", - "acceptabil", "acceptable", - "acceptence", "acceptance", - "accepterad", "accepted", - "acceptible", "acceptable", - "accerelate", "accelerated", - "accesories", "accessories", - "accessable", "accessible", - "accessbile", "accessible", - "accessoire", "accessories", - "accessoirs", "accessories", - "accicently", "accidently", - "accidantly", "accidently", - "accidebtly", "accidently", - "accidenlty", "accidently", - "accidentes", "accidents", - "accidentky", "accidently", - "accidently", "accidentally", - "accidnetly", "accidently", - "accomadate", "accommodate", - "accomodate", "accommodate", - "accompined", "accompanied", - "accomplise", "accomplishes", - "accompliss", "accomplishes", - "accostumed", "accustomed", - "accountent", "accountant", - "accpetable", "acceptable", - "accpetance", "acceptance", - "accuastion", "accusation", - "acculumate", "accumulate", - "accumalate", "accumulate", - "accumelate", "accumulate", - "accumilate", "accumulate", - "accumulare", "accumulate", - "accumulato", "accumulation", - "accumulted", "accumulated", - "accuratley", "accurately", - "accusating", "accusation", - "accusition", "accusation", - "accustumed", "accustomed", - "acheivable", "achievable", - "acheivment", "achievement", - "acheviable", "achievable", - "achiavable", "achievable", - "achieveble", "achievable", - "achievemnt", "achievement", - "achievemts", "achieves", - "achievents", "achieves", - "achievment", "achievement", - "achilleous", "achilles", - "achiveable", "achievable", - "achivement", "achievement", - "acitvating", "activating", - "acitvision", "activision", - "acknowldge", "acknowledge", - "acknowlede", "acknowledge", - "acknowlege", "acknowledge", - "acommodate", "accommodate", - "acopalypse", "apocalypse", - "acordingly", "accordingly", - "acqauinted", "acquainted", - "acquanited", "acquainted", - "acquianted", "acquainted", - "acquinated", "acquainted", - "acquisiton", "acquisition", - "acticating", "activating", - "actication", "activation", - "activacion", "activation", - "activaters", "activates", - "activiates", "activist", - "activiites", "activist", - "activisiom", "activism", - "activisits", "activist", - "activistas", "activists", - "activistes", "activists", - "activiting", "activating", - "activizion", "activision", - "acustommed", "accustomed", - "adaptacion", "adaptation", - "adaptating", "adaptation", - "adaquetely", "adequately", - "addicitons", "addictions", - "addionally", "additionally", - "additivies", "additive", - "additivley", "additive", - "addittions", "addictions", - "addmission", "admission", - "addresable", "addressable", - "addressess", "addresses", - "adequatley", "adequately", - "adequetely", "adequately", - "adequitely", "adequately", - "adernaline", "adrenaline", - "adjectivos", "adjectives", - "adjustible", "adjustable", - "admendment", "amendment", - "administed", "administered", - "administor", "administer", - "administre", "administer", - "administro", "administer", - "adminsiter", "administer", - "admissable", "admissible", - "admittadly", "admittedly", - "admittetly", "admittedly", - "admittidly", "admittedly", - "adolencent", "adolescent", - "adolescant", "adolescent", - "adolescene", "adolescence", - "adoloscent", "adolescent", - "adolsecent", "adolescent", - "adpatation", "adaptation", - "adreanline", "adrenaline", - "adrelanine", "adrenaline", - "adreneline", "adrenaline", - "adreniline", "adrenaline", - "adressable", "addressable", - "advanteges", "advantages", - "advatanges", "advantages", - "adventrous", "adventurous", - "adventrues", "adventures", - "adventuers", "adventures", - "adventuous", "adventurous", - "adventuros", "adventurous", - "adventurus", "adventurous", - "adverticed", "advertised", - "aestethics", "aesthetics", - "aesthatics", "aesthetics", - "aesthestic", "aesthetics", - "affiliaton", "affiliation", - "affilliate", "affiliate", - "affirmitve", "affirmative", - "afflcition", "affliction", - "afflection", "affliction", - "affliation", "affliction", - "affliciton", "affliction", - "afforadble", "affordable", - "affordible", "affordable", - "affortable", "affordable", - "africaners", "africans", - "africaness", "africans", - "aftermaket", "aftermarket", - "afternooon", "afternoon", - "aggravanti", "aggravating", - "aggraveted", "aggravated", - "aggreement", "agreement", - "aggregious", "egregious", - "aggresions", "aggression", - "aggressivo", "aggression", - "aggrovated", "aggravated", - "agnosticim", "agnosticism", - "agnosticsm", "agnosticism", - "agnostisch", "agnostic", - "agnostiscm", "agnosticism", - "agnostisim", "agnosticism", - "agreeement", "agreement", - "agricultre", "agriculture", - "agricultue", "agriculture", - "agriculure", "agriculture", - "agricuture", "agriculture", - "ailenating", "alienating", - "ajdectives", "adjectives", - "alchoholic", "alcoholic", - "alchoolism", "alcoholism", - "alcohalics", "alcoholics", - "alcohalism", "alcoholism", - "alcoholsim", "alcoholism", - "aleinating", "alienating", - "algorhitms", "algorithms", - "algorithem", "algorithm", - "algorithim", "algorithm", - "algorithsm", "algorithms", - "algorithum", "algorithm", - "algorithym", "algorithm", - "algoritmes", "algorithms", - "algoritmos", "algorithms", - "algorthims", "algorithms", - "algortihms", "algorithms", - "algorythms", "algorithms", - "alievating", "alienating", - "alledgedly", "allegedly", - "allegeance", "allegiance", - "allegedely", "allegedly", - "allegedley", "allegedly", - "allegience", "allegiance", - "alleigance", "allegiance", - "allergisch", "allergic", - "alliegance", "allegiance", - "alligeance", "allegiance", - "alocholics", "alcoholics", - "alocholism", "alcoholism", - "alogrithms", "algorithms", - "alphabeast", "alphabet", - "alteracion", "alteration", - "alterarion", "alteration", - "alterating", "alteration", - "alternador", "alternator", - "alternater", "alternator", - "alternatie", "alternatives", - "alternatly", "alternately", - "alternatve", "alternate", - "alternetly", "alternately", - "altogehter", "altogether", - "altogheter", "altogether", - "altriustic", "altruistic", - "altruisitc", "altruistic", - "altrusitic", "altruistic", - "alturistic", "altruistic", - "aluminimum", "aluminum", - "amargeddon", "armageddon", - "amateurest", "amateurs", - "ambassabor", "ambassador", - "ambassader", "ambassador", - "ambassator", "ambassador", - "ambassedor", "ambassador", - "ambassidor", "ambassador", - "ambassodor", "ambassador", - "ambiguitiy", "ambiguity", - "amendmants", "amendments", - "amendmends", "amendments", - "americains", "americas", - "americanas", "americans", - "americanis", "americas", - "americanss", "americas", - "americants", "americas", - "americanus", "americans", - "americares", "americas", - "ammendment", "amendment", - "amrageddon", "armageddon", - "analitical", "analytical", - "analitycal", "analytical", - "analogeous", "analogous", - "analyitcal", "analytical", - "analyseles", "analyses", - "analyseras", "analyses", - "analyseres", "analyses", - "analysised", "analyses", - "analysises", "analyses", - "analysisto", "analysts", - "analystics", "analysts", - "anarchisim", "anarchism", - "anarchistm", "anarchism", - "anarchiszm", "anarchism", - "anarchsits", "anarchists", - "anayltical", "analytical", - "ancilliary", "ancillary", - "androiders", "androids", - "androidtvs", "androids", - "anecdotale", "anecdote", - "anecdotice", "anecdote", - "anestheisa", "anesthesia", - "anesthetia", "anesthesia", - "anesthisia", "anesthesia", - "anitbiotic", "antibiotic", - "anitquated", "antiquated", - "anitsocial", "antisocial", - "aniversary", "anniversary", - "annilihate", "annihilated", - "anniverary", "anniversary", - "anniversay", "anniversary", - "anniversry", "anniversary", - "annointing", "anointing", - "annonceurs", "announcers", - "annoucners", "announcers", - "annoucning", "announcing", - "announched", "announce", - "annyoingly", "annoyingly", - "anonymosly", "anonymously", - "anonymousy", "anonymously", - "antaganist", "antagonist", - "antagnoist", "antagonist", - "antarcitca", "antarctica", - "antarctida", "antarctica", - "anthropoly", "anthropology", - "antibiodic", "antibiotic", - "antibiotcs", "antibiotics", - "antibitoic", "antibiotic", - "antiboitic", "antibiotics", - "anticapate", "anticipate", - "anticiapte", "anticipate", - "anticipare", "anticipate", - "anticipato", "anticipation", - "anticuated", "antiquated", - "antiquited", "antiquated", - "antiqvated", "antiquated", - "antisipate", "anticipate", - "antisocail", "antisocial", - "antisosial", "antisocial", - "antoganist", "antagonist", - "antractica", "antarctica", - "apacolypse", "apocalypse", - "apartheied", "apartheid", - "aplication", "application", - "apocalipse", "apocalypse", - "apocalpyse", "apocalypse", - "apocalypes", "apocalypse", - "apocalypic", "apocalyptic", - "apocalyspe", "apocalypse", - "apocalytic", "apocalyptic", - "apocaplyse", "apocalypse", - "apocolapse", "apocalypse", - "apolagetic", "apologetic", - "apolagized", "apologized", - "apolegetic", "apologetic", - "apoligetic", "apologetic", - "apoligists", "apologists", - "apoligized", "apologized", - "apologisms", "apologists", - "apologiste", "apologise", - "apologitic", "apologetic", - "apostraphe", "apostrophe", - "apostrephe", "apostrophe", - "apostrohpe", "apostrophe", - "apostropes", "apostrophe", - "apparantly", "apparently", - "appareance", "appearance", - "apparenlty", "apparently", - "appartment", "apartment", - "appealling", "appealing", - "appearence", "appearance", - "appearnace", "appearances", - "apperances", "appearances", - "apperantly", "apparently", - "apperciate", "appreciate", - "appereance", "appearance", - "appetities", "appetite", - "appetitite", "appetite", - "appication", "application", - "applainces", "appliances", - "applicaple", "applicable", - "applicates", "applicants", - "applicaton", "application", - "applicible", "applicable", - "appliences", "appliances", - "appointmet", "appointments", - "appologies", "apologies", - "apporached", "approached", - "apporaches", "approaches", - "appraoched", "approached", - "appraoches", "approaches", - "apprecaite", "appreciate", - "appreciato", "appreciation", - "appreciste", "appreciates", - "apprecitae", "appreciates", - "apprecited", "appreciated", - "apprectice", "apprentice", - "appreicate", "appreciate", - "apprendice", "apprentice", - "apprentace", "apprentice", - "apprentise", "apprentice", - "appretiate", "appreciate", - "appretince", "apprentice", - "appriceate", "appreciates", - "appriciate", "appreciate", - "appriecate", "appreciates", - "approacing", "approaching", - "appropiate", "appropriate", - "approprate", "appropriate", - "apropriate", "appropriate", - "aproximate", "approximate", - "apsotrophe", "apostrophe", - "aptitudine", "aptitude", - "aqcuainted", "acquainted", - "aquisition", "acquisition", - "aramgeddon", "armageddon", - "arangement", "arrangement", - "arbitarily", "arbitrarily", - "arbitraily", "arbitrarily", - "arbitraion", "arbitration", - "arbitrairy", "arbitrarily", - "arbitrarly", "arbitrary", - "arbitraton", "arbitration", - "arcehtypes", "archetypes", - "archaelogy", "archaeology", - "archaeolgy", "archaeology", - "archaology", "archeology", - "archatypes", "archetypes", - "archetects", "architects", - "archetipes", "archetypes", - "archetpyes", "archetypes", - "archetypus", "archetypes", - "archeytpes", "archetypes", - "archictect", "architect", - "architechs", "architects", - "architecht", "architect", - "architecte", "architecture", - "architexts", "architects", - "architypes", "archetypes", - "archtiects", "architects", - "archytypes", "archetypes", - "argentinia", "argentina", - "arguements", "arguments", - "argumentas", "arguments", - "argumentos", "arguments", - "arithemtic", "arithmetic", - "arithmitic", "arithmetic", - "aritmethic", "arithmetic", - "armagaddon", "armageddon", - "armageddan", "armageddon", - "armagedden", "armageddon", - "armageddin", "armageddon", - "armagedeon", "armageddon", - "armageedon", "armageddon", - "armagideon", "armageddon", - "armegaddon", "armageddon", - "arrangerad", "arranged", - "arrangment", "arrangement", - "arthimetic", "arithmetic", - "articifial", "artificial", - "articluate", "articulate", - "articualte", "articulate", - "articulted", "articulated", - "artifactos", "artifacts", - "artificiel", "artificial", - "artihmetic", "arithmetic", - "artillerly", "artillery", - "asbestoast", "asbestos", - "asethetics", "aesthetics", - "asisstants", "assistants", - "aspiratons", "aspirations", - "assasinate", "assassinate", - "assassians", "assassin", - "assassinas", "assassins", - "assassines", "assassins", - "assassinos", "assassins", - "assemblare", "assemble", - "assempling", "assembling", - "assersions", "assertions", - "assesement", "assessment", - "assestment", "assessment", - "assignemnt", "assignment", - "assimalate", "assimilate", - "assimilant", "assimilate", - "assimilare", "assimilate", - "assimliate", "assimilate", - "assimulate", "assimilate", - "assingment", "assignment", - "assistanat", "assistants", - "assistanse", "assistants", - "assistante", "assistance", - "assistence", "assistance", - "assistendo", "assisted", - "assistents", "assistants", - "assmebling", "assembling", - "assocaited", "associated", - "assocaites", "associates", - "assocation", "association", - "associatie", "associated", - "associatin", "associations", - "associaton", "association", - "associsted", "associates", - "assoicated", "associated", - "assoicates", "associates", - "assosiated", "associated", - "assosiates", "associates", - "asssassans", "assassins", - "assupmtion", "assumptions", - "assymetric", "asymmetric", - "asteroides", "asteroids", - "asthetical", "aesthetical", - "astonising", "astonishing", - "astornauts", "astronauts", - "astranauts", "astronauts", - "astronatus", "astronauts", - "astronaunt", "astronaut", - "astronomia", "astronomical", - "astronouts", "astronauts", - "astronuats", "astronauts", - "asutralian", "australian", - "atatchment", "attachment", - "athleticos", "athletics", - "athleticsm", "athleticism", - "athletiscm", "athleticism", - "athletisim", "athleticism", - "atmopshere", "atmosphere", - "atmoshpere", "atmosphere", - "atomsphere", "atmosphere", - "atriculate", "articulate", - "atrocoties", "atrocities", - "atrosities", "atrocities", - "attachemnt", "attachment", - "attackeras", "attackers", - "attactment", "attachment", - "attemtping", "attempting", - "attendence", "attendance", - "attendents", "attendants", - "attirbutes", "attributes", - "attmepting", "attempting", - "attracters", "attracts", - "attractice", "attractive", - "attracties", "attracts", - "attractifs", "attracts", - "attraktion", "attraction", - "attraktive", "attractive", - "attribuito", "attribution", - "attritubes", "attributes", - "auctioners", "auctions", - "audioboook", "audiobook", - "audioboost", "audiobooks", - "auidobooks", "audiobooks", - "auotattack", "autoattack", - "austrailan", "australian", - "austrailia", "australia", - "australain", "australians", - "australien", "australian", - "australina", "australians", - "austrlaian", "australians", - "authenticy", "authenticity", - "autherized", "authorized", - "authoritay", "authority", - "authorites", "authorities", - "authorithy", "authority", - "authroized", "authorized", - "autistisch", "autistic", - "autoattaks", "autoattack", - "autocorect", "autocorrect", - "autocorrct", "autocorrect", - "autocorret", "autocorrect", - "autograpgh", "autograph", - "automatice", "automate", - "automatico", "automation", - "automatied", "automate", - "automatiek", "automate", - "automatron", "automation", - "automatted", "automate", - "automibile", "automobile", - "automitive", "automotive", - "automoblie", "automobile", - "automomous", "autonomous", - "automonous", "autonomous", - "automotice", "automotive", - "automotion", "automation", - "automotize", "automotive", - "automotove", "automotive", - "autonamous", "autonomous", - "autonation", "automation", - "autonimous", "autonomous", - "autonomity", "autonomy", - "autononous", "autonomous", - "auttoatack", "autoattack", - "auxilliary", "auxiliary", - "availabale", "available", - "availaible", "available", - "availiable", "available", - "averageadi", "averaged", - "averageifs", "averages", - "awesomeley", "awesomely", - "awesomelly", "awesomely", - "awesomenss", "awesomeness", - "awkwardess", "awkwardness", - "babysister", "babysitter", - "babysiting", "babysitting", - "babysittng", "babysitting", - "bachelores", "bachelors", - "backgorund", "background", - "backgroudn", "backgrounds", - "backgrouds", "backgrounds", - "backgrouns", "backgrounds", - "backgruond", "backgrounds", - "backpacing", "backpacking", - "backpackng", "backpacking", - "backrgound", "backgrounds", - "backrounds", "backgrounds", - "baksetball", "basketball", - "balanceada", "balanced", - "balanceado", "balanced", - "balckberry", "blackberry", - "balckhawks", "blackhawks", - "balcksmith", "blacksmith", - "bandwagoon", "bandwagon", - "bangaldesh", "bangladesh", - "bangladash", "bangladesh", - "bangledash", "bangladesh", - "bangledesh", "bangladesh", - "banglidesh", "bangladesh", - "bankrupcty", "bankruptcy", - "bankruptsy", "bankruptcy", - "bankrutpcy", "bankruptcy", - "barabrians", "barbarians", - "barbariens", "barbarians", - "barbarions", "barbarians", - "barbarisch", "barbaric", - "barberians", "barbarians", - "bargianing", "bargaining", - "bartendars", "bartenders", - "basektball", "basketball", - "baskteball", "basketball", - "bastardous", "bastards", - "battelship", "battleship", - "battelstar", "battlestar", - "battlearts", "battlestar", - "battlechip", "battleship", - "battlefied", "battlefield", - "battlefont", "battlefront", - "battlehips", "battleship", - "battlesaur", "battlestar", - "battlescar", "battlestar", - "battleshop", "battleship", - "battlestsr", "battlestar", - "beahviours", "behaviours", - "beautifuly", "beautifully", - "beautilful", "beautifully", - "beautyfull", "beautiful", - "becnhmarks", "benchmarks", - "beethoveen", "beethoven", - "begginings", "beginnings", - "begininngs", "beginnings", - "beginninng", "beginnings", - "behaivours", "behaviours", - "behaviorly", "behavioral", - "behavoiral", "behavioral", - "behavoiurs", "behaviours", - "behavorial", "behavioral", - "behavoural", "behavioral", - "behvaiours", "behaviours", - "beleagured", "beleaguered", - "beleivable", "believable", - "beliavable", "believable", - "beliebable", "believable", - "believeble", "believable", - "beliveable", "believable", - "benchamrks", "benchmarks", - "benchmakrs", "benchmarks", - "benckmarks", "benchmarks", - "benefecial", "beneficial", - "beneficary", "beneficiary", - "beneficiul", "beneficial", - "benefitial", "beneficial", - "beneifical", "beneficial", - "benelovent", "benevolent", - "benevalent", "benevolent", - "benevelant", "benevolent", - "benevelent", "benevolent", - "benevelont", "benevolent", - "benevloent", "benevolent", - "benevolant", "benevolent", - "benificial", "beneficial", - "benovelent", "benevolent", - "bernouilli", "bernoulli", - "besitality", "bestiality", - "bestaility", "bestiality", - "besteality", "bestiality", - "betrayeado", "betrayed", - "bilateraly", "bilaterally", - "billborads", "billboards", - "bioligical", "biological", - "biologiset", "biologist", - "biologiskt", "biologist", - "birghtness", "brightness", - "birmignham", "birmingham", - "birmimgham", "birmingham", - "bisexuella", "bisexual", - "bitterseet", "bittersweet", - "bitterswet", "bittersweet", - "blackahwks", "blackhawks", - "blackbarry", "blackberry", - "blackbeary", "blackberry", - "blackbeery", "blackberry", - "blackcawks", "blackhawks", - "blackhakws", "blackhawks", - "blackhwaks", "blackhawks", - "blackmsith", "blacksmith", - "blackshits", "blacksmith", - "blasphemey", "blasphemy", - "blitzkreig", "blitzkrieg", - "blochchain", "blockchain", - "blockcahin", "blockchain", - "blockchian", "blockchain", - "bloodboner", "bloodborne", - "bloodbonre", "bloodborne", - "bloodborbe", "bloodborne", - "bloodbrone", "bloodborne", - "bloodporne", "bloodborne", - "bloorborne", "bloodborne", - "blueberies", "blueberries", - "blueberris", "blueberries", - "blueberrry", "blueberry", - "bluebrints", "blueprints", - "boardcasts", "broadcasts", - "bodyheight", "bodyweight", - "bodyweigth", "bodyweight", - "bodywieght", "bodyweight", - "bombarment", "bombardment", - "bookmakred", "bookmarked", - "bootlaoder", "bootloader", - "bootleader", "bootloader", - "boradcasts", "broadcasts", - "borderlads", "borderlands", - "borderlans", "borderlands", - "bottelneck", "bottleneck", - "bottlebeck", "bottleneck", - "boundaires", "boundaries", - "bounderies", "boundaries", - "bourgeoius", "bourgeois", - "boycutting", "boycotting", - "boyfirends", "boyfriends", - "boyfreinds", "boyfriends", - "boyfrients", "boyfriends", - "braceletes", "bracelets", - "braceletts", "bracelets", - "brainwased", "brainwashed", - "brakedowns", "breakdowns", - "braodcasts", "broadcasts", - "brasillian", "brazilian", - "bratenders", "bartenders", - "brazilains", "brazilians", - "brazileans", "brazilians", - "braziliaan", "brazilians", - "brazilions", "brazilians", - "brazillans", "brazilians", - "brightoner", "brighten", - "brigthness", "brightness", - "brillaince", "brilliance", - "brilliante", "brilliance", - "brillianty", "brilliantly", - "brimestone", "brimstone", - "brimingham", "birmingham", - "broacasted", "broadcast", - "brotherhod", "brotherhood", - "brotherood", "brotherhood", - "brusselers", "brussels", - "brutallity", "brutally", - "buisnesses", "businesses", - "bulgariska", "bulgaria", - "bulletpoof", "bulletproof", - "bulletprof", "bulletproof", - "bureaucats", "bureaucrats", - "businesman", "businessman", - "businesmen", "businessmen", - "businessen", "businessmen", - "butterfies", "butterflies", - "cabinettas", "cabinets", - "caclulated", "calculated", - "caclulator", "calculator", - "cahracters", "characters", - "calcluator", "calculators", - "calcualted", "calculated", - "calcualtor", "calculator", - "calculador", "calculator", - "calcularon", "calculator", - "calculater", "calculator", - "calculatin", "calculations", - "calibratin", "calibration", - "calibraton", "calibration", - "califnoria", "californian", - "califonria", "californian", - "califorian", "californian", - "califorina", "california", - "californai", "californian", - "califronia", "california", - "caligraphy", "calligraphy", - "caliofrnia", "californian", - "calrifying", "clarifying", - "calssified", "classified", - "caluclated", "calculated", - "caluclator", "calculator", - "caluculate", "calculate", - "cambodican", "cambodia", - "camofluage", "camouflage", - "camoufalge", "camouflage", - "camouglage", "camouflage", - "campaiging", "campaigning", - "campaignes", "campaigns", - "cancellato", "cancellation", - "candidatas", "candidates", - "candidatxs", "candidates", - "candidiate", "candidate", - "canditates", "candidates", - "cannibalsm", "cannibalism", - "cannisters", "canisters", - "cannonical", "canonical", - "capabality", "capability", - "capabiltiy", "capability", - "capacators", "capacitors", - "capaciters", "capacitors", - "capactiors", "capacitors", - "capasitors", "capacitors", - "capatilism", "capitalism", - "capatilist", "capitalist", - "capatilize", "capitalize", - "capialized", "capitalized", - "capicators", "capacitors", - "capitalisn", "capitals", - "capitalits", "capitalists", - "capitalsim", "capitalism", - "capitalsit", "capitalists", - "capitarist", "capitalist", - "capitilism", "capitalism", - "capitilist", "capitalist", - "capitilize", "capitalize", - "capitlaism", "capitalism", - "capitlaist", "capitalist", - "capitlaize", "capitalized", - "capitolism", "capitalism", - "capitolist", "capitalist", - "capitolize", "capitalize", - "captainers", "captains", - "captialism", "capitalism", - "captialist", "capitalist", - "captialize", "capitalize", - "captivitiy", "captivity", - "caraciture", "caricature", - "carciature", "caricature", - "cardinales", "cardinals", - "cardinalis", "cardinals", - "carefullly", "carefully", - "cariacture", "caricature", - "caricatore", "caricature", - "cariciture", "caricature", - "caricuture", "caricature", - "carismatic", "charismatic", - "carribbean", "caribbean", - "cartdridge", "cartridge", - "cartdriges", "cartridges", - "carthagian", "carthaginian", - "cartilidge", "cartilage", - "cartirdges", "cartridges", - "cartrdiges", "cartridges", - "cartriages", "cartridges", - "cartrigdes", "cartridges", - "casaulties", "casualties", - "cassowarry", "cassowary", - "casualites", "casualties", - "casualries", "casualties", - "casulaties", "casualties", - "cataclysim", "cataclysm", - "cataclysym", "cataclysm", - "catagories", "categories", - "catapillar", "caterpillar", - "catapiller", "caterpillar", - "catastrope", "catastrophe", - "catastrphe", "catastrophe", - "categorice", "categorize", - "categoried", "categorized", - "categoriei", "categorize", - "cateogrize", "categorized", - "catepillar", "caterpillar", - "caterpilar", "caterpillar", - "catholicsm", "catholicism", - "catholicus", "catholics", - "catholisim", "catholicism", - "cativating", "activating", - "cattleship", "battleship", - "causalties", "casualties", - "cautionsly", "cautiously", - "celebratin", "celebration", - "celebrites", "celebrities", - "celebritiy", "celebrity", - "cellpading", "cellpadding", - "cellulaire", "cellular", - "cemetaries", "cemeteries", - "censorhsip", "censorship", - "censurship", "censorship", - "centipedle", "centipede", - "ceremonias", "ceremonies", - "ceremoniis", "ceremonies", - "ceremonije", "ceremonies", - "cerimonial", "ceremonial", - "cerimonies", "ceremonies", - "certainity", "certainty", - "certainlyt", "certainty", - "chairtable", "charitable", - "chalenging", "challenging", - "challanged", "challenged", - "challanges", "challenges", - "challegner", "challenger", - "challender", "challenger", - "challengue", "challenger", - "challengur", "challenger", - "challening", "challenging", - "challneger", "challenger", - "chanceller", "chancellor", - "chancillor", "chancellor", - "chansellor", "chancellor", - "charachter", "character", - "charactere", "characterize", - "characterz", "characterize", - "charactors", "characters", - "charakters", "characters", - "charatable", "charitable", - "charecters", "characters", - "charistics", "characteristics", - "charitible", "charitable", - "chartiable", "charitable", - "chechpoint", "checkpoint", - "checkpiont", "checkpoint", - "checkpoins", "checkpoints", - "checkponts", "checkpoints", - "cheesecase", "cheesecake", - "cheesecave", "cheesecake", - "cheeseface", "cheesecake", - "cheezecake", "cheesecake", - "chemcially", "chemically", - "chidlbirth", "childbirth", - "chihuahuha", "chihuahua", - "childbrith", "childbirth", - "childrends", "childrens", - "childrenis", "childrens", - "childrents", "childrens", - "chirstians", "christians", - "chocalates", "chocolates", - "chocloates", "chocolates", - "chocoaltes", "chocolates", - "chocolatie", "chocolates", - "chocolatos", "chocolates", - "chocolatte", "chocolates", - "chocolotes", "chocolates", - "cholestrol", "cholesterol", - "chormosome", "chromosome", - "chornicles", "chronicles", - "chrisitans", "christians", - "christains", "christians", - "christiaan", "christian", - "christimas", "christians", - "christinas", "christians", - "christines", "christians", - "christmans", "christians", - "chromasome", "chromosome", - "chromesome", "chromosome", - "chromisome", "chromosome", - "chromosmes", "chromosomes", - "chromosoms", "chromosomes", - "chromosone", "chromosome", - "chromosoom", "chromosome", - "chromozome", "chromosome", - "chronciles", "chronicles", - "chronicals", "chronicles", - "chronicels", "chronicles", - "chronocles", "chronicles", - "chronosome", "chromosome", - "chrsitians", "christians", - "cigarattes", "cigarettes", - "cigerattes", "cigarettes", - "cincinatti", "cincinnati", - "cinncinati", "cincinnati", - "circulaire", "circular", - "circulaton", "circulation", - "circumsice", "circumcised", - "circumsied", "circumcised", - "circumwent", "circumvent", - "circunvent", "circumvent", - "cirruculum", "curriculum", - "claculator", "calculator", - "clairfying", "clarifying", - "clasically", "classically", - "classicals", "classics", - "classrooom", "classroom", - "cleanliess", "cleanliness", - "cleareance", "clearance", - "cleverleys", "cleverly", - "cliffhager", "cliffhanger", - "climateers", "climates", - "climatiser", "climates", - "clincially", "clinically", - "clitoridis", "clitoris", - "clitorious", "clitoris", - "co-incided", "coincided", - "cockroachs", "cockroaches", - "cockroahes", "cockroaches", - "coefficent", "coefficient", - "cognatious", "contagious", - "cognitivie", "cognitive", - "coincidnce", "coincide", - "colelctive", "collective", - "colelctors", "collectors", - "collapsers", "collapses", - "collaquial", "colloquial", - "collasping", "collapsing", - "collataral", "collateral", - "collaterol", "collateral", - "collatoral", "collateral", - "collcetion", "collections", - "colleauges", "colleagues", - "colleciton", "collection", - "collectems", "collects", - "collectief", "collective", - "collecties", "collects", - "collectifs", "collects", - "collectivo", "collection", - "collectoin", "collections", - "collectons", "collections", - "collectros", "collects", - "collegaues", "colleagues", - "collequial", "colloquial", - "colleteral", "collateral", - "colliquial", "colloquial", - "collission", "collisions", - "collitions", "collisions", - "colloqiual", "colloquial", - "colloquail", "colloquial", - "colloqueal", "colloquial", - "collpasing", "collapsing", - "colonialsm", "colonialism", - "colorblend", "colorblind", - "coloublind", "colorblind", - "columbidae", "columbia", - "comapnions", "companions", - "comaprable", "comparable", - "comaprison", "comparison", - "comaptible", "compatible", - "combatabts", "combatants", - "combatents", "combatants", - "combinatin", "combinations", - "combinaton", "combination", - "comediants", "comedians", - "comepndium", "compendium", - "comferting", "comforting", - "comforming", "comforting", - "comfortbly", "comfortably", - "comisioned", "commissioned", - "comisioner", "commissioner", - "comissions", "commissions", - "commandbox", "commando", - "commandent", "commandment", - "commandeur", "commanders", - "commandore", "commanders", - "commandpod", "commando", - "commanists", "communists", - "commemters", "commenters", - "commencera", "commerce", - "commenciez", "commence", - "commentaar", "commentary", - "commentare", "commenter", - "commentars", "commenters", - "commentart", "commentator", - "commentery", "commentary", - "commentsry", "commenters", - "commercail", "commercials", - "commercent", "commence", - "commerical", "commercial", - "comminists", "communists", - "commisison", "commissions", - "commissons", "commissions", - "commiteted", "commited", - "commodites", "commodities", - "commtiment", "commitments", - "communicae", "communicated", - "communisim", "communism", - "communiste", "communities", - "communites", "communities", - "communters", "commenters", - "compadible", "compatible", - "compagnons", "companions", - "compainons", "companions", - "compairson", "comparison", - "compalined", "complained", - "compandium", "compendium", - "companians", "companions", - "companines", "companions", - "compansate", "compensate", - "comparabil", "comparable", - "comparason", "comparison", - "comparaste", "compares", - "comparatie", "comparative", - "compareble", "comparable", - "comparemos", "compares", - "comparions", "comparison", - "compariosn", "comparisons", - "comparisen", "compares", - "comparitve", "comparative", - "comparsion", "comparison", - "compartent", "compartment", - "compartmet", "compartment", - "compatibel", "compatible", - "compatibil", "compatible", - "compeating", "completing", - "compeditor", "competitor", - "compednium", "compendium", - "compeeting", "completing", - "compeltely", "completely", - "compelting", "completing", - "compeltion", "completion", - "compemdium", "compendium", - "compenduim", "compendium", - "compenents", "components", - "compenidum", "compendium", - "compensare", "compensate", - "comperable", "comparable", - "comperhend", "comprehend", - "compession", "compassion", - "competance", "competence", - "competator", "competitor", - "competenet", "competence", - "competense", "competence", - "competenze", "competence", - "competeted", "competed", - "competetor", "competitor", - "competidor", "competitor", - "competiors", "competitors", - "competitie", "competitive", - "competitin", "competitions", - "competitio", "competitor", - "competiton", "competition", - "competitve", "competitive", - "compilance", "compliance", - "compilaton", "compilation", - "compinsate", "compensate", - "compitable", "compatible", - "compitance", "compliance", - "complacant", "complacent", - "complaince", "compliance", - "complaines", "complaints", - "complainig", "complaining", - "complainte", "complained", - "complation", "completion", - "compleatly", "completely", - "complecate", "complicate", - "completeds", "completes", - "completent", "complement", - "completily", "complexity", - "completito", "completion", - "completley", "completely", - "complexers", "complexes", - "complexety", "complexity", - "complianed", "compliance", - "compliants", "complaints", - "complicaed", "complicate", - "complicare", "complicate", - "complicati", "complicit", - "complicato", "complication", - "complicite", "complicate", - "complicted", "complicated", - "complience", "compliance", - "complimate", "complicate", - "complition", "completion", - "complusion", "compulsion", - "complusive", "compulsive", - "complusory", "compulsory", - "compolsive", "compulsive", - "compolsory", "compulsory", - "compolsury", "compulsory", - "componants", "components", - "componenet", "components", - "componsate", "compensate", - "comporable", "comparable", - "compositae", "composite", - "compositie", "composite", - "compositon", "composition", - "compraison", "comparisons", - "compramise", "compromise", - "comprassem", "compress", - "comprehand", "comprehend", - "compresion", "compression", - "compresors", "compressor", - "compresser", "compressor", - "compressio", "compressor", - "compresson", "compression", - "comprihend", "comprehend", - "comprimise", "compromise", - "compromiss", "compromises", - "compromize", "compromise", - "compromsie", "compromises", - "comprossor", "compressor", - "compteting", "completing", - "comptetion", "completion", - "compulisve", "compulsive", - "compulosry", "compulsory", - "compulsary", "compulsory", - "compulsery", "compulsory", - "compulsing", "compulsion", - "compulsivo", "compulsion", - "compulsury", "compulsory", - "compuslion", "compulsion", - "compuslive", "compulsive", - "compuslory", "compulsory", - "compustion", "compulsion", - "computanti", "computation", - "conatiners", "containers", - "concedendo", "conceded", - "concedered", "conceded", - "conceitual", "conceptual", - "concentate", "concentrate", - "concenting", "connecting", - "conceptial", "conceptual", - "conceptuel", "conceptual", - "concersion", "concession", - "concesions", "concession", - "concidered", "considered", - "conciously", "consciously", - "concission", "concession", - "conclsuion", "concussion", - "conclusies", "conclusive", - "conclution", "conclusion", - "concorrent", "concurrent", - "concsience", "conscience", - "conculsion", "conclusion", - "conculsive", "conclusive", - "concurment", "concurrent", - "concurrant", "concurrent", - "concurrect", "concurrent", - "concusions", "concussion", - "concusison", "concussions", - "condamning", "condemning", - "condemming", "condemning", - "condencing", "condemning", - "condenming", "condemning", - "condensend", "condensed", - "condidtion", "condition", - "conditinal", "conditional", - "conditiner", "conditioner", - "conditiond", "conditioned", - "conditiong", "conditioning", - "condmening", "condemning", - "conduiting", "conducting", - "conencting", "connecting", - "conenction", "connection", - "conenctors", "connectors", - "conesencus", "consensus", - "confedarcy", "confederacy", - "confedence", "conference", - "confedercy", "confederacy", - "conferance", "conference", - "conferenze", "conference", - "conferming", "confirming", - "confernece", "conferences", - "confessino", "confessions", - "confidance", "confidence", - "confidenly", "confidently", - "confidense", "confidence", - "confidenty", "confidently", - "conflcting", "conflating", - "conflicing", "conflicting", - "conflictos", "conflicts", - "confliting", "conflating", - "confriming", "confirming", - "confussion", "confession", - "congratule", "congratulate", - "congresman", "congressman", - "congresmen", "congressmen", - "congressen", "congressmen", - "conjecutre", "conjecture", - "conjuction", "conjunction", - "conjuncion", "conjunction", - "conlcusion", "conclusion", - "conncetion", "connections", - "conneciton", "connection", - "connecties", "connects", - "connectins", "connects", - "connectivy", "connectivity", - "connectpro", "connector", - "conneticut", "connecticut", - "connotaion", "connotation", - "conpsiracy", "conspiracy", - "conqeuring", "conquering", - "conqouring", "conquering", - "conquerers", "conquerors", - "conquoring", "conquering", - "consciense", "conscience", - "consciouly", "consciously", - "consdiered", "considered", - "consending", "consenting", - "consensuel", "consensual", - "consenusal", "consensual", - "consequece", "consequence", - "consequnce", "consequence", - "conservare", "conserve", - "conservato", "conservation", - "conservice", "conserve", - "conservies", "conserve", - "conservite", "conserve", - "consicence", "conscience", - "consideras", "considers", - "consideret", "considerate", - "consipracy", "conspiracy", - "consistant", "consistent", - "consistens", "consists", - "consisteny", "consistency", - "consitency", "consistency", - "consituted", "constituted", - "conslutant", "consultant", - "consluting", "consulting", - "consolidad", "consolidated", - "consonents", "consonants", - "consorcium", "consortium", - "conspirace", "conspiracies", - "conspiricy", "conspiracy", - "conspriacy", "conspiracy", - "constaints", "constraints", - "constatnly", "constantly", - "constently", "constantly", - "constitude", "constitute", - "constitued", "constitute", - "constituem", "constitute", - "constituer", "constitute", - "constitues", "constitutes", - "constituie", "constitute", - "constituit", "constitute", - "constitutn", "constituents", - "constituye", "constitute", - "constnatly", "constantly", - "constracts", "constructs", - "constraits", "constraints", - "constransi", "constraints", - "constrants", "constraints", - "construced", "constructed", - "constructo", "construction", - "construint", "constraint", - "construits", "constructs", - "construted", "constructed", - "consueling", "consulting", - "consultata", "consultant", - "consultate", "consultant", - "consultati", "consultant", - "consultato", "consultation", - "consultent", "consultant", - "consumated", "consummated", - "consumbale", "consumables", - "consuments", "consumes", - "consumirem", "consumerism", - "consumires", "consumerism", - "consumirse", "consumerism", - "consumiste", "consumes", - "consumpion", "consumption", - "contaction", "contacting", - "contageous", "contagious", - "contagiosa", "contagious", - "contagioso", "contagious", - "contaigous", "contagious", - "containors", "containers", - "contaminen", "containment", - "contanting", "contacting", - "contection", "contention", - "contectual", "contextual", - "conteiners", "contenders", - "contempate", "contemplate", - "contemplat", "contempt", - "contempory", "contemporary", - "contenants", "continents", - "contencion", "contention", - "contendors", "contenders", - "contenents", "continents", - "conteneurs", "contenders", - "contengent", "contingent", - "contension", "contention", - "contentino", "contention", - "contentios", "contentious", - "contentous", "contentious", - "contestais", "contests", - "contestans", "contests", - "contestase", "contests", - "contestion", "contention", - "contestors", "contests", - "contextful", "contextual", - "contextuel", "contextual", - "contextura", "contextual", - "contianers", "containers", - "contianing", "containing", - "contibuted", "contributed", - "contibutes", "contributes", - "contigents", "continents", - "contigious", "contagious", - "contignent", "contingent", - "continants", "continents", - "continenal", "continental", - "continenet", "continents", - "contineous", "continuous", - "continetal", "continental", - "contingecy", "contingency", - "contingeny", "contingency", - "continient", "contingent", - "continious", "continuous", - "continiuty", "continuity", - "contintent", "contingent", - "continualy", "continually", - "continuare", "continue", - "continuati", "continuity", - "continuato", "continuation", - "continuent", "contingent", - "continuety", "continuity", - "continunes", "continents", - "continuons", "continuous", - "continutiy", "continuity", - "continuuum", "continuum", - "contitnent", "contingent", - "contiuning", "containing", - "contiunity", "continuity", - "contorller", "controllers", - "contracing", "contracting", - "contractar", "contractor", - "contracter", "contractor", - "contractin", "contraction", - "contractos", "contracts", - "contradice", "contradicted", - "contradics", "contradicts", - "contredict", "contradict", - "contribued", "contributed", - "contribuem", "contribute", - "contribuer", "contribute", - "contribues", "contributes", - "contribuie", "contribute", - "contribuit", "contribute", - "contributo", "contribution", - "contributs", "contributes", - "contribuye", "contribute", - "contricted", "contracted", - "contridict", "contradict", - "contriubte", "contributes", - "controlelr", "controllers", - "controlers", "controls", - "controling", "controlling", - "controlles", "controls", - "controvery", "controversy", - "controvesy", "controversy", - "contrubite", "contributes", - "contrubute", "contribute", - "contuining", "continuing", - "contuinity", "continuity", - "convaluted", "convoluted", - "convcition", "convictions", - "conveinent", "convenient", - "conveluted", "convoluted", - "convencion", "convention", - "conveniant", "convenient", - "conveniece", "convenience", - "convenince", "convenience", - "convential", "conventional", - "converesly", "conversely", - "convergens", "converse", - "converison", "conversions", - "converning", "converting", - "conversare", "converse", - "conversino", "conversions", - "conversley", "conversely", - "conversoin", "conversions", - "conversons", "conversions", - "convertion", "conversion", - "convertire", "converter", - "converying", "converting", - "conveyered", "conveyed", - "conviccion", "conviction", - "conviciton", "conviction", - "convienent", "convenient", - "conviluted", "convoluted", - "convincted", "convince", - "convinsing", "convincing", - "convinving", "convincing", - "convoluded", "convoluted", - "convoulted", "convoluted", - "convulated", "convoluted", - "convuluted", "convoluted", - "cooperatve", "cooperative", - "coordenate", "coordinate", - "coordiante", "coordinate", - "coordinare", "coordinate", - "coordinato", "coordination", - "coordinats", "coordinates", - "coordonate", "coordinate", - "cooridnate", "coordinate", - "copehnagen", "copenhagen", - "copenaghen", "copenhagen", - "copenahgen", "copenhagen", - "copengagen", "copenhagen", - "copengahen", "copenhagen", - "copenhagan", "copenhagen", - "copenhague", "copenhagen", - "copenhagun", "copenhagen", - "copenhaven", "copenhagen", - "copenhegan", "copenhagen", - "copyrighed", "copyrighted", - "copyrigted", "copyrighted", - "corinthans", "corinthians", - "corinthias", "corinthians", - "corinthins", "corinthians", - "cornmitted", "committed", - "corporatie", "corporate", - "corralated", "correlated", - "corralates", "correlates", - "correccion", "correction", - "correciton", "corrections", - "correcters", "correctors", - "correctess", "correctness", - "correctivo", "correction", - "correctons", "corrections", - "corregated", "correlated", - "correkting", "correcting", - "correlatas", "correlates", - "correlatie", "correlated", - "correlatos", "correlates", - "correspend", "correspond", - "corrilated", "correlated", - "corrilates", "correlates", - "corrispond", "correspond", - "corrolated", "correlated", - "corrolates", "correlates", - "corrospond", "correspond", - "corrpution", "corruption", - "corrulates", "correlates", - "corrupcion", "corruption", - "cosmeticas", "cosmetics", - "cosmeticos", "cosmetics", - "costumized", "customized", - "counceling", "counseling", - "councellor", "councillor", - "councelors", "counselors", - "councilers", "councils", - "counselers", "counselors", - "counsellng", "counselling", - "counsilers", "counselors", - "counsiling", "counseling", - "counsilors", "counselors", - "counsolers", "counselors", - "counsoling", "counseling", - "countepart", "counteract", - "counteratk", "counteract", - "counterbat", "counteract", - "countercat", "counteract", - "countercut", "counteract", - "counteries", "counters", - "countoring", "countering", - "countryies", "countryside", - "countrying", "countering", - "courcework", "coursework", - "coursefork", "coursework", - "courthosue", "courthouse", - "courtrooom", "courtroom", - "cousnelors", "counselors", - "coutneract", "counteract", - "coutnering", "countering", - "covenental", "covenant", - "cranberrry", "cranberry", - "creationis", "creations", - "creationsm", "creationism", - "creationst", "creationist", - "creativily", "creatively", - "creativley", "creatively", - "credibilty", "credibility", - "creeperest", "creepers", - "crimanally", "criminally", - "criminalty", "criminally", - "criminalul", "criminally", - "criticable", "critical", - "criticarlo", "critical", - "criticiing", "criticising", - "criticisim", "criticism", - "criticisme", "criticise", - "criticisng", "criticising", - "criticists", "critics", - "criticisze", "criticise", - "criticizms", "criticisms", - "criticizng", "criticizing", - "critisiced", "criticized", - "critisicms", "criticisms", - "critisicsm", "criticisms", - "critisiscm", "criticisms", - "critisisms", "criticisms", - "critisizes", "criticises", - "critisizms", "criticisms", - "critiziced", "criticized", - "critizised", "criticized", - "critizisms", "criticisms", - "critizized", "criticized", - "crocodille", "crocodile", - "crossfiter", "crossfire", - "crutchetts", "crutches", - "crystalens", "crystals", - "crystalisk", "crystals", - "crystallis", "crystals", - "cuatiously", "cautiously", - "culterally", "culturally", - "cultrually", "culturally", - "culumative", "cumulative", - "culutrally", "culturally", - "cumbersone", "cumbersome", - "cumbursome", "cumbersome", - "cumpolsory", "compulsory", - "cumulitive", "cumulative", - "currancies", "currencies", - "currenctly", "currency", - "currenices", "currencies", - "currentfps", "currents", - "currentlys", "currents", - "currentpos", "currents", - "currentusa", "currents", - "curriculem", "curriculum", - "curriculim", "curriculum", - "curriences", "currencies", - "curroption", "corruption", - "custimized", "customized", - "customzied", "customized", - "custumized", "customized", - "cutscences", "cutscene", - "cutscenses", "cutscene", - "dangerouly", "dangerously", - "dealerhsip", "dealerships", - "deathamtch", "deathmatch", - "deathmacth", "deathmatch", - "debateable", "debatable", - "decembeard", "december", - "decendants", "descendants", - "decendents", "descendants", - "decideable", "decidable", - "deciptions", "depictions", - "decisiones", "decisions", - "declarasen", "declares", - "declaraste", "declares", - "declaremos", "declares", - "decomposit", "decompose", - "decoracion", "decoration", - "decorativo", "decoration", - "decoritive", "decorative", - "decroative", "decorative", - "decsending", "descending", - "dedicacion", "dedication", - "dedikation", "dedication", - "deducatble", "deductible", - "deducitble", "deductible", - "defacation", "defamation", - "defamating", "defamation", - "defanitely", "definately", - "defelction", "deflection", - "defendeers", "defender", - "defendents", "defendants", - "defenderes", "defenders", - "defenesman", "defenseman", - "defenselss", "defenseless", - "defensivly", "defensively", - "defianetly", "definately", - "defiantely", "definately", - "defiantley", "definately", - "defibately", "definately", - "deficately", "definately", - "deficiancy", "deficiency", - "deficience", "deficiencies", - "deficienct", "deficient", - "deficienty", "deficiency", - "defiintely", "definately", - "definaetly", "definately", - "definaitly", "definately", - "definaltey", "definately", - "definataly", "definately", - "definateky", "definately", - "definately", "definitely", - "definatily", "definately", - "defination", "definition", - "definative", "definitive", - "definatlly", "definately", - "definatrly", "definately", - "definayely", "definately", - "defineatly", "definately", - "definetaly", "definately", - "definetely", "definitely", - "definetily", "definately", - "definetlly", "definetly", - "definettly", "definately", - "definicion", "definition", - "definietly", "definitely", - "definining", "defining", - "definitaly", "definately", - "definiteyl", "definitly", - "definitivo", "definition", - "definitley", "definitely", - "definitlly", "definitly", - "definitlry", "definitly", - "definitlty", "definitly", - "definjtely", "definately", - "definltely", "definately", - "definotely", "definately", - "definstely", "definately", - "defintaley", "definately", - "defintiely", "definitely", - "defintiion", "definitions", - "definutely", "definately", - "deflaction", "deflection", - "defleciton", "deflection", - "deflektion", "deflection", - "defniately", "definately", - "degenarate", "degenerate", - "degenerare", "degenerate", - "degenerite", "degenerate", - "degoratory", "derogatory", - "degraderad", "degraded", - "dehydraded", "dehydrated", - "dehyrdated", "dehydrated", - "deifnately", "definately", - "deisgnated", "designated", - "delaership", "dealership", - "delearship", "dealership", - "delegaties", "delegate", - "delegative", "delegate", - "delfection", "deflection", - "delibarate", "deliberate", - "deliberant", "deliberate", - "delibirate", "deliberate", - "deligthful", "delightful", - "deliverate", "deliberate", - "deliverees", "deliveries", - "deliviered", "delivered", - "deliviring", "delivering", - "delporable", "deplorable", - "delpoyment", "deployment", - "delutional", "delusional", - "dementieva", "dementia", - "deminsions", "dimensions", - "democracis", "democracies", - "democracts", "democrat", - "democratas", "democrats", - "democrates", "democrats", - "demograhic", "demographic", - "demographs", "demographics", - "demograpic", "demographic", - "demolation", "demolition", - "demolicion", "demolition", - "demolision", "demolition", - "demolitian", "demolition", - "demoliting", "demolition", - "demoloshed", "demolished", - "demolution", "demolition", - "demonished", "demolished", - "demonstate", "demonstrate", - "demonstras", "demonstrates", - "demorcracy", "democracy", - "denegerate", "degenerate", - "denominato", "denomination", - "denomintor", "denominator", - "deocrative", "decorative", - "deomcratic", "democratic", - "deparments", "departments", - "departmens", "departments", - "departmnet", "departments", - "depcitions", "depictions", - "depdending", "depending", - "depencency", "dependency", - "dependance", "dependence", - "dependancy", "dependency", - "dependandt", "dependant", - "dependends", "depended", - "dependened", "depended", - "dependenta", "dependant", - "dependente", "dependence", - "depicitons", "depictions", - "deplorabel", "deplorable", - "deplorabil", "deplorable", - "deplorible", "deplorable", - "deplyoment", "deployment", - "depolyment", "deployment", - "depositers", "deposits", - "depressief", "depressive", - "depressies", "depressive", - "deprivaton", "deprivation", - "deragotory", "derogatory", - "derivaties", "derivatives", - "deriviated", "derived", - "derivitave", "derivative", - "derivitive", "derivative", - "derogatary", "derogatory", - "derogatery", "derogatory", - "derogetory", "derogatory", - "derogitory", "derogatory", - "derogotary", "derogatory", - "derogotory", "derogatory", - "derviative", "derivative", - "descendats", "descendants", - "descendend", "descended", - "descenting", "descending", - "descerning", "descending", - "descipable", "despicable", - "descisions", "decisions", - "descriibes", "describes", - "descripton", "description", - "desginated", "designated", - "desigining", "designing", - "desireable", "desirable", - "desktopbsd", "desktops", - "despciable", "despicable", - "desperatly", "desperately", - "desperetly", "desperately", - "despicaple", "despicable", - "despicible", "despicable", - "dessicated", "desiccated", - "destinatin", "destinations", - "destinaton", "destination", - "destoryers", "destroyers", - "destorying", "destroying", - "destroyeds", "destroyers", - "destroyeer", "destroyers", - "destrucion", "destruction", - "destrucive", "destructive", - "destryoing", "destroying", - "detectarlo", "detector", - "detectaron", "detector", - "detectoare", "detector", - "determinas", "determines", - "determinig", "determining", - "determinsm", "determinism", - "deutschand", "deutschland", - "devastaded", "devastated", - "devastaing", "devastating", - "devastanti", "devastating", - "devasteted", "devastated", - "develepors", "developers", - "develoeprs", "developers", - "developmet", "developments", - "developors", "develops", - "developped", "developed", - "developres", "develops", - "develpment", "development", - "devestated", "devastated", - "devolvendo", "devolved", - "deyhdrated", "dehydrated", - "diagnosied", "diagnose", - "diagnosies", "diagnosis", - "diagnositc", "diagnostic", - "diagnossed", "diagnose", - "diagnosted", "diagnose", - "diagnotics", "diagnostic", - "diagonstic", "diagnostic", - "dichotomoy", "dichotomy", - "dicitonary", "dictionary", - "diconnects", "disconnects", - "dicovering", "discovering", - "dictateurs", "dictates", - "dictionare", "dictionaries", - "differance", "difference", - "differenly", "differently", - "differense", "differences", - "differente", "difference", - "differentl", "differential", - "differenty", "differently", - "differnece", "difference", - "difficulte", "difficulties", - "difficults", "difficulties", - "difficutly", "difficulty", - "diffuculty", "difficulty", - "diganostic", "diagnostic", - "dimensinal", "dimensional", - "dimentions", "dimensions", - "dimesnions", "dimensions", - "dimineshes", "diminishes", - "diminising", "diminishing", - "dimunitive", "diminutive", - "dinosaures", "dinosaurs", - "dinosaurus", "dinosaurs", - "dipections", "depictions", - "diplimatic", "diplomatic", - "diplomacia", "diplomatic", - "diplomancy", "diplomacy", - "dipolmatic", "diplomatic", - "directinla", "directional", - "directionl", "directional", - "directivos", "directions", - "directores", "directors", - "directorys", "directors", - "directsong", "directions", - "disaapoint", "disappoint", - "disagreeed", "disagreed", - "disapeared", "disappeared", - "disappeard", "disappeared", - "disappered", "disappeared", - "disappiont", "disappoint", - "disaproval", "disapproval", - "disastorus", "disastrous", - "disastrosa", "disastrous", - "disastrose", "disastrous", - "disastrosi", "disastrous", - "disastroso", "disastrous", - "disaterous", "disastrous", - "discalimer", "disclaimer", - "discapline", "discipline", - "discepline", "discipline", - "disception", "discretion", - "discharded", "discharged", - "disciplers", "disciples", - "disciplies", "disciplines", - "disciplins", "disciplines", - "disciprine", "discipline", - "disclamier", "disclaimer", - "discliamer", "disclaimer", - "disclipine", "discipline", - "disclousre", "disclosure", - "disclsoure", "disclosure", - "discograhy", "discography", - "discograpy", "discography", - "discolsure", "disclosure", - "disconenct", "disconnect", - "disconncet", "disconnects", - "disconnets", "disconnects", - "discontued", "discounted", - "discoruage", "discourages", - "discources", "discourse", - "discourgae", "discourages", - "discourges", "discourages", - "discoveres", "discovers", - "discoveryd", "discovered", - "discoverys", "discovers", - "discrecion", "discretion", - "discreddit", "discredited", - "discrepany", "discrepancy", - "discresion", "discretion", - "discreting", "discretion", - "discribing", "describing", - "discrimine", "discriminate", - "discrouage", "discourages", - "discrption", "discretion", - "discusison", "discussions", - "discusting", "discussing", - "disgracful", "disgraceful", - "disgrunted", "disgruntled", - "disgruntld", "disgruntled", - "disguisted", "disguise", - "disgustiny", "disgustingly", - "disgustosa", "disgusts", - "disgustose", "disgusts", - "disgustosi", "disgusts", - "disgustoso", "disgusts", - "dishcarged", "discharged", - "dishinored", "dishonored", - "disicpline", "discipline", - "disiplined", "disciplined", - "dislcaimer", "disclaimer", - "dismanteld", "dismantled", - "dismanting", "dismantling", - "dismentled", "dismantled", - "dispecable", "despicable", - "dispencary", "dispensary", - "dispencers", "dispenser", - "dispencing", "dispensing", - "dispensare", "dispenser", - "dispensory", "dispensary", - "dispesnary", "dispensary", - "dispicable", "despicable", - "displayfps", "displays", - "dispositon", "disposition", - "dispostion", "disposition", - "disputerad", "disputed", - "disrecpect", "disrespect", - "disrection", "discretion", - "disrepsect", "disrespect", - "disresepct", "disrespect", - "disrespekt", "disrespect", - "disription", "disruption", - "disrispect", "disrespect", - "disrputing", "disrupting", - "disruptivo", "disruption", - "disruptron", "disruption", - "dissapears", "disappears", - "dissappear", "disappear", - "disscusion", "discussion", - "dissmisive", "dismissive", - "dissodance", "dissonance", - "dissonante", "dissonance", - "dissonence", "dissonance", - "distastful", "distasteful", - "disticntly", "distinctly", - "distiction", "distinction", - "distincion", "distinction", - "distincive", "distinctive", - "distinclty", "distinctly", - "distinctie", "distinctive", - "distinctin", "distinctions", - "distingish", "distinguish", - "distingush", "distinguish", - "distintcly", "distinctly", - "distoriton", "distortion", - "distorsion", "distortion", - "distortian", "distortion", - "distortron", "distortion", - "distractes", "distracts", - "distractia", "district", - "distractin", "district", - "distractiv", "district", - "distration", "distortion", - "distribuem", "distribute", - "distribuer", "distribute", - "distribuie", "distribute", - "distribuit", "distribute", - "distributs", "distributors", - "distribuye", "distribute", - "distrotion", "distortion", - "distrubing", "disturbing", - "distrubtes", "distrust", - "distrubute", "distribute", - "distubring", "disturbing", - "disturbace", "disturbance", - "disturping", "disrupting", - "disucssing", "discussing", - "disucssion", "discussion", - "disurption", "disruption", - "ditributed", "distributed", - "diversifiy", "diversify", - "dividendes", "dividends", - "dividendos", "dividends", - "divideneds", "dividend", - "divinition", "divination", - "divinitory", "divinity", - "divisiones", "divisions", - "dobulelift", "doublelift", - "doccuments", "documents", - "documentry", "documentary", - "dogmatisch", "dogmatic", - "dolphinese", "dolphins", - "domianting", "dominating", - "domimation", "domination", - "dominacion", "domination", - "dominaters", "dominates", - "donwgraded", "downgraded", - "donwloaded", "downloaded", - "donwvoters", "downvoters", - "donwvoting", "downvoting", - "doomsdaily", "doomsday", - "doubellift", "doublelift", - "doubleiift", "doublelift", - "doubleleft", "doublelift", - "doublelfit", "doublelift", - "doublerift", "doublelift", - "doulbelift", "doublelift", - "downgarded", "downgraded", - "downgrated", "downgrade", - "downlaoded", "downloaded", - "downloadas", "downloads", - "downloades", "downloads", - "downovting", "downvoting", - "downroaded", "downgraded", - "downsiders", "downsides", - "downstaris", "downstairs", - "downstiars", "downstairs", - "downtokers", "downvoters", - "downtoking", "downvoting", - "downtraded", "downgraded", - "downviting", "downvoting", - "downvotear", "downvoters", - "downvoteas", "downvoters", - "downvoteds", "downvoters", - "downvotees", "downvoters", - "downvotesd", "downvoters", - "downvotess", "downvoters", - "downvotest", "downvoters", - "downvoteur", "downvoters", - "downvoties", "downvoters", - "downvotres", "downvoters", - "downvotted", "downvote", - "downvottes", "downvoters", - "downwoters", "downvoters", - "downwoting", "downvoting", - "drasticaly", "drastically", - "drasticlly", "drastically", - "draughtman", "draughtsman", - "dumbbellls", "dumbbells", - "dumbfouded", "dumbfounded", - "dumbfouned", "dumbfounded", - "dungeoness", "dungeons", - "dupilcates", "duplicates", - "duplicants", "duplicates", - "duplicatas", "duplicates", - "duplicitas", "duplicates", - "duplifaces", "duplicates", - "durabiltiy", "durability", - "dyamically", "dynamically", - "dynamicaly", "dynamically", - "dynamicdns", "dynamics", - "dynamiclly", "dynamically", - "dynamicpsf", "dynamics", - "dynamitage", "dynamite", - "dysfuncion", "dysfunction", - "earhtbound", "earthbound", - "earthqauke", "earthquake", - "earthquack", "earthquake", - "earthquaks", "earthquakes", - "earthquate", "earthquake", - "earthqukes", "earthquakes", - "easthetics", "aesthetics", - "ecoligical", "ecological", - "ecomonical", "economical", - "econimical", "economical", - "econimists", "economists", - "economicas", "economics", - "economicos", "economics", - "economicus", "economics", - "economisch", "economic", - "economisit", "economists", - "effeciency", "efficiency", - "effectivly", "effectively", - "efficeincy", "efficiency", - "efficently", "efficiently", - "efficiancy", "efficiency", - "efficienct", "efficient", - "efficienty", "efficiently", - "egotistcal", "egotistical", - "ehtnically", "ethnically", - "ejaculaion", "ejaculation", - "ejaculatie", "ejaculate", - "ejaculatin", "ejaculation", - "ejaculaton", "ejaculation", - "ejaculatte", "ejaculate", - "electircal", "electrical", - "electivite", "elective", - "electoraat", "electorate", - "electorale", "electorate", - "electorite", "electorate", - "electornic", "electronic", - "electrican", "electrician", - "electriciy", "electricity", - "electricty", "electricity", - "electrinic", "electrician", - "electroate", "electorate", - "electrodan", "electron", - "electroinc", "electron", - "electrolye", "electrolytes", - "electroman", "electron", - "electroncs", "electrons", - "electrones", "electrons", - "electronik", "election", - "electronis", "electronics", - "electronix", "election", - "elemantary", "elementary", - "elementery", "elementary", - "elementray", "elementary", - "eleminated", "eliminated", - "elephantes", "elephants", - "elephantis", "elephants", - "elephantos", "elephants", - "elephantus", "elephants", - "eletricity", "electricity", - "elimanates", "eliminates", - "elimenates", "eliminates", - "elimentary", "elementary", - "elimimates", "eliminates", - "eliminaste", "eliminates", - "eliminatin", "elimination", - "eliminaton", "elimination", - "eliminster", "eliminates", - "ellipitcal", "elliptical", - "ellipsical", "elliptical", - "ellipticle", "elliptical", - "ellitpical", "elliptical", - "ellpitical", "elliptical", - "eloquantly", "eloquently", - "eloquintly", "eloquently", - "emapthetic", "empathetic", - "embarassed", "embarrassed", - "embarassig", "embarassing", - "embarrased", "embarrassed", - "embarrases", "embarrassed", - "embezelled", "embezzled", - "emblamatic", "emblematic", - "embodyment", "embodiment", - "emergenies", "emergencies", - "emmigrated", "emigrated", - "emminently", "eminently", - "emmisaries", "emissaries", - "emobdiment", "embodiment", - "emotionaly", "emotionally", - "empahsized", "emphasized", - "empahsizes", "emphasizes", - "empathatic", "empathetic", - "emphacized", "emphasized", - "emphatetic", "empathetic", - "emphatised", "emphasized", - "emphatized", "emphasized", - "emphatizes", "emphasizes", - "emphazised", "emphasized", - "emphazises", "emphasizes", - "emphesized", "emphasized", - "emphesizes", "emphasizes", - "emphisized", "emphasized", - "emphisizes", "emphasizes", - "empiricaly", "empirically", - "employeers", "employees", - "employeurs", "employer", - "emprisoned", "imprisoned", - "encahnting", "enchanting", - "enchancing", "enchanting", - "enchanging", "enchanting", - "enchantent", "enchantment", - "enchantmet", "enchantments", - "encompases", "encompasses", - "encounterd", "encountered", - "encountred", "encountered", - "encouraing", "encouraging", - "encoutners", "encounters", - "encription", "encryption", - "encrpytion", "encryption", - "encyrption", "encryption", - "endlessley", "endlessly", - "endolithes", "endoliths", - "enforceing", "enforcing", - "engagemnet", "engagements", - "engagemnts", "engagements", - "engieneers", "engineers", - "enginereed", "engineered", - "enivitable", "inevitable", - "enlargment", "enlargement", - "enlighment", "enlighten", - "enlightend", "enlightened", - "enlightned", "enlightened", - "enrolement", "enrollment", - "enrollemnt", "enrollment", - "enterpirse", "enterprise", - "enterprice", "enterprise", - "enterpries", "enterprises", - "enterprize", "enterprise", - "enterprsie", "enterprises", - "enterrpise", "enterprises", - "entertaing", "entertaining", - "enthically", "ethnically", - "enthisiast", "enthusiast", - "enthuiasts", "enthusiast", - "enthuisast", "enthusiasts", - "enthusiams", "enthusiasm", - "enthusiant", "enthusiast", - "enthusiats", "enthusiast", - "enthusiest", "enthusiast", - "enthusists", "enthusiasts", - "envelopped", "envelope", - "enveloppen", "envelope", - "enveloppes", "envelope", - "enviorment", "environment", - "enviroment", "environment", - "environmet", "environments", - "equiavlent", "equivalents", - "equilavent", "equivalent", - "equilibium", "equilibrium", - "equilibrim", "equilibrium", - "equilibrum", "equilibrium", - "equippment", "equipment", - "equitorial", "equatorial", - "equivalant", "equivalent", - "equivalnce", "equivalence", - "equivalnet", "equivalents", - "equivelant", "equivalent", - "equivelent", "equivalent", - "equivilant", "equivalent", - "equivilent", "equivalent", - "equivlaent", "equivalents", - "equivolent", "equivalent", - "eratically", "erratically", - "escalative", "escalate", - "escavation", "escalation", - "esitmation", "estimation", - "esoterisch", "esoteric", - "especailly", "especially", - "espeically", "especially", - "espressino", "espresso", - "espression", "espresso", - "essencials", "essentials", - "essensials", "essentials", - "essentails", "essentials", - "essentialy", "essentially", - "essentiels", "essentials", - "essentuals", "essentials", - "estabishes", "establishes", - "estimacion", "estimation", - "estimativo", "estimation", - "estination", "estimation", - "ethicallly", "ethically", - "ethincally", "ethnically", - "ethnicites", "ethnicities", - "ethnicitiy", "ethnicity", - "euphorical", "euphoria", - "euphorisch", "euphoric", - "euthanaisa", "euthanasia", - "euthanazia", "euthanasia", - "euthanesia", "euthanasia", - "evaluacion", "evaluation", - "evalutaion", "evaluation", - "evaulating", "evaluating", - "evaulation", "evaluation", - "eventaully", "eventually", - "eventially", "eventually", - "everyoneis", "everyones", - "exacberate", "exacerbated", - "exagerated", "exaggerated", - "exagerates", "exaggerates", - "exagerrate", "exaggerate", - "exaggarate", "exaggerate", - "exaggurate", "exaggerate", - "exahusting", "exhausting", - "exahustion", "exhaustion", - "examinated", "examined", - "examinerad", "examined", - "exapansion", "expansion", - "exapnsions", "expansions", - "exauhsting", "exhausting", - "exauhstion", "exhaustion", - "excecuting", "executing", - "excecution", "execution", - "exceedigly", "exceedingly", - "exceedinly", "exceedingly", - "excellance", "excellence", - "excellenet", "excellence", - "excellenze", "excellence", - "excerising", "exercising", - "excessivly", "excessively", - "exchangees", "exchanges", - "excitiment", "excitement", - "exclsuives", "exclusives", - "exclusivas", "exclusives", - "exclusivly", "exclusively", - "exclusivos", "exclusives", - "exclusivty", "exclusivity", - "exclussive", "exclusives", - "exclusvies", "exclusives", - "excpetions", "exceptions", - "exculsives", "exclusives", - "exculsivly", "exclusively", - "execptions", "exceptions", - "exectuable", "executable", - "exectuions", "executions", - "exectuives", "executives", - "execusions", "executions", - "executabil", "executable", - "executible", "executable", - "executiner", "executioner", - "executings", "executions", - "executivas", "executives", - "exeedingly", "exceedingly", - "exepmtions", "exemptions", - "exeptional", "exceptional", - "exercicing", "exercising", - "exercizing", "exercising", - "exersicing", "exercising", - "exersising", "exercising", - "exersizing", "exercising", - "exerternal", "external", - "exeuctions", "executions", - "exhasuting", "exhausting", - "exhasution", "exhaustion", - "exhaustivo", "exhaustion", - "exhibicion", "exhibition", - "exhibitons", "exhibits", - "exhuasting", "exhausting", - "exhuastion", "exhaustion", - "exibitions", "exhibitions", - "exictement", "excitement", - "exipration", "expiration", - "existantes", "existent", - "existenial", "existential", - "existental", "existential", - "exlcusives", "exclusives", - "exorbatant", "exorbitant", - "exorbatent", "exorbitant", - "exorbidant", "exorbitant", - "exorbirant", "exorbitant", - "exorbitent", "exorbitant", - "expalining", "explaining", - "expanisons", "expansions", - "expansivos", "expansions", - "expanssion", "expansions", - "expantions", "expansions", - "expecially", "especially", - "expectaion", "expectation", - "expectansy", "expectancy", - "expectency", "expectancy", - "expections", "exceptions", - "expedetion", "expedition", - "expedicion", "expedition", - "expeditivo", "expedition", - "expeiments", "experiments", - "expemtions", "exemptions", - "expendeble", "expendable", - "expendible", "expendable", - "expensable", "expendable", - "expentancy", "expectancy", - "expereince", "experience", - "experement", "experiment", - "experiance", "experience", - "experieced", "experienced", - "experieces", "experiences", - "experiemnt", "experiment", - "experiened", "experienced", - "experiense", "experiences", - "expermient", "experiments", - "experssion", "expression", - "expextancy", "expectancy", - "expidetion", "expedition", - "expierence", "experience", - "expination", "expiration", - "expirement", "experiment", - "explanatin", "explanations", - "explicatia", "explicit", - "explicatie", "explicit", - "explicatif", "explicit", - "explicatii", "explicit", - "explicetly", "explicitly", - "explicilty", "explicitly", - "explioting", "exploiting", - "exploiding", "exploiting", - "exploition", "exploiting", - "explorarea", "explorer", - "exploreres", "explorers", - "explosivas", "explosives", - "explossion", "explosions", - "explossive", "explosives", - "explosvies", "explosives", - "explotions", "explosions", - "explusions", "explosions", - "expodition", "exposition", - "expoliting", "exploiting", - "expolsions", "explosions", - "expolsives", "explosives", - "exponental", "exponential", - "exposicion", "exposition", - "expositivo", "exposition", - "expotition", "exposition", - "exprensive", "expressive", - "expresions", "expression", - "expresison", "expressions", - "expressens", "expresses", - "expressief", "expressive", - "expressley", "expressly", - "expriation", "expiration", - "extensivly", "extensively", - "extentions", "extensions", - "exterioara", "exterior", - "exterioare", "exterior", - "extermally", "externally", - "extermists", "extremists", - "extraccion", "extraction", - "extractivo", "extraction", - "extractnow", "extraction", - "extradtion", "extraction", - "extremaste", "extremes", - "extremeley", "extremely", - "extremelly", "extremely", - "extrememly", "extremely", - "extremests", "extremists", - "extremised", "extremes", - "extremisim", "extremism", - "extremisme", "extremes", - "extremiste", "extremes", - "extrenally", "externally", - "extrimists", "extremists", - "eyeballers", "eyeballs", - "fabriacted", "fabricated", - "fabricatie", "fabricated", - "faciliated", "facilitated", - "facilitait", "facilitate", - "facilitant", "facilitate", - "facilitare", "facilitate", - "facisnated", "fascinated", - "facitilies", "facilities", - "facsinated", "fascinated", - "fahernheit", "fahrenheit", - "fahrenhiet", "fahrenheit", - "fallatious", "fallacious", - "fallicious", "fallacious", - "falshbacks", "flashbacks", - "familiarty", "familiarity", - "familiarze", "familiarize", - "fanaticals", "fanatics", - "fanfaction", "fanfiction", - "fanfcition", "fanfiction", - "fanficiton", "fanfiction", - "fanserivce", "fanservice", - "fanservise", "fanservice", - "fanservive", "fanservice", - "fantasiose", "fantasies", - "farehnheit", "fahrenheit", - "farhenheit", "fahrenheit", - "fascianted", "fascinated", - "fascinatie", "fascinated", - "fascinatin", "fascination", - "fascistisk", "fascists", - "fatalaties", "fatalities", - "favoruites", "favourites", - "favourates", "favourites", - "favouritsm", "favourites", - "favourties", "favourites", - "federacion", "federation", - "federativo", "federation", - "fellowhsip", "fellowship", - "fellowshop", "fellowship", - "feminimity", "femininity", - "feministas", "feminists", - "feminitity", "femininity", - "fermentato", "fermentation", - "fertalizer", "fertilizer", - "fertelizer", "fertilizer", - "fertilizar", "fertilizer", - "fertilzier", "fertilizer", - "fertiziler", "fertilizer", - "festivales", "festivals", - "fetishiste", "fetishes", - "ficticious", "fictitious", - "filessytem", "filesystem", - "filesytems", "filesystem", - "filmamkers", "filmmakers", - "filmmakare", "filmmakers", - "finallizes", "finalizes", - "financialy", "financially", - "fingernals", "fingernails", - "fingerpies", "fingertips", - "fingerpint", "fingerprint", - "fingertaps", "fingertips", - "fingertits", "fingertips", - "fingertops", "fingertips", - "fireballls", "fireballs", - "firefigher", "firefighter", - "firefigter", "firefighter", - "firendlies", "friendlies", - "firghtened", "frightened", - "fisionable", "fissionable", - "flashligth", "flashlight", - "flaskbacks", "flashbacks", - "flawleslly", "flawlessly", - "flexibiliy", "flexibility", - "flexibilty", "flexibility", - "flimmakers", "filmmakers", - "fluctuatie", "fluctuate", - "fluctuatin", "fluctuations", - "flutterhsy", "fluttershy", - "fluttersky", "fluttershy", - "flutterspy", "fluttershy", - "forcifully", "forcefully", - "forecfully", "forcefully", - "foreginers", "foreigners", - "foregorund", "foreground", - "foreignese", "foreigners", - "foreigness", "foreigners", - "foreignors", "foreigners", - "foreingers", "foreigners", - "forensisch", "forensic", - "foreseeble", "foreseeable", - "forgeiners", "foreigners", - "forgieners", "foreigners", - "forgivance", "forgiven", - "forgivenss", "forgiveness", - "forgotting", "forgetting", - "foriegners", "foreigners", - "formadible", "formidable", - "formalhaut", "fomalhaut", - "formallity", "formally", - "formallize", "formalize", - "formatiing", "formatting", - "formatings", "formations", - "formativos", "formations", - "formidabel", "formidable", - "formidabil", "formidable", - "formidible", "formidable", - "forminable", "formidable", - "formitable", "formidable", - "formuladas", "formulas", - "formulados", "formulas", - "forseeable", "foreseeable", - "fortelling", "foretelling", - "fortunatly", "fortunately", - "fortunetly", "fortunately", - "foundaiton", "foundations", - "foundaries", "foundries", - "foundatoin", "foundations", - "fractalers", "fractals", - "fractalius", "fractals", - "fractalpus", "fractals", - "fracturare", "fracture", - "fragmanted", "fragment", - "francaises", "franchises", - "franchices", "franchises", - "franchines", "franchises", - "franchizes", "franchises", - "franchsies", "franchises", - "fransiscan", "franciscan", - "franticaly", "frantically", - "franticlly", "frantically", - "fraternaty", "fraternity", - "fraternety", "fraternity", - "fraterntiy", "fraternity", - "fraturnity", "fraternity", - "fraudalent", "fraudulent", - "fraudelant", "fraudulent", - "fraudelent", "fraudulent", - "fraudolent", "fraudulent", - "fraudulant", "fraudulent", - "freedomers", "freedoms", - "freedomest", "freedoms", - "freindlies", "friendlies", - "freindship", "friendship", - "frequencey", "frequency", - "friednship", "friendships", - "friednzone", "friendzoned", - "friendhsip", "friendship", - "friendsies", "friendlies", - "friendzies", "friendlies", - "friendzond", "friendzoned", - "frientship", "friendship", - "frigthened", "frightened", - "fromatting", "formatting", - "fromidable", "formidable", - "frontlinie", "frontline", - "fruadulent", "fraudulent", - "frustraded", "frustrated", - "frustradet", "frustrates", - "frustraits", "frustrates", - "frustrants", "frustrates", - "frustratin", "frustration", - "frustrsted", "frustrates", - "fucntional", "functional", - "fulfulling", "fulfilling", - "fullfiling", "fulfilling", - "fullfilled", "fulfilled", - "fullscrean", "fullscreen", - "fulttershy", "fluttershy", - "funcitonal", "functional", - "fundametal", "fundamental", - "furstrated", "frustrated", - "furstrates", "frustrates", - "furutistic", "futuristic", - "futhermore", "furthermore", - "futurestic", "futuristic", - "futurisitc", "futuristic", - "futurustic", "futuristic", - "galvinized", "galvanized", - "garuanteed", "guaranteed", - "garuantees", "guarantees", - "gauntanamo", "guantanamo", - "gauntlents", "gauntlet", - "gauranteed", "guaranteed", - "gaurantees", "guarantees", - "gaurenteed", "guaranteed", - "gaurentees", "guarantees", - "generalice", "generalize", - "generalife", "generalize", - "generalnie", "generalize", - "generaters", "generates", - "generaties", "generate", - "generatios", "generators", - "generatons", "generators", - "generatore", "generate", - "generelize", "generalize", - "generocity", "generosity", - "generoisty", "generosity", - "generostiy", "generosity", - "geneticaly", "genetically", - "geneticlly", "genetically", - "genitalias", "genitals", - "genuinelly", "genuinely", - "geographia", "geographical", - "geogrpahic", "geographic", - "germanisch", "germanic", - "gigantisch", "gigantic", - "gimmickers", "gimmicks", - "girlfirend", "girlfriend", - "girlfreind", "girlfriend", - "girlfriens", "girlfriends", - "girlfrinds", "girlfriends", - "girlfrined", "girlfriends", - "goalkeaper", "goalkeeper", - "goalkeeprs", "goalkeeper", - "goalkepeer", "goalkeeper", - "goegraphic", "geographic", - "golakeeper", "goalkeeper", - "goldburger", "goldberg", - "goosebumbs", "goosebumps", - "goosegumps", "goosebumps", - "goosepumps", "goosebumps", - "gothenberg", "gothenburg", - "govenrment", "government", - "govermenet", "goverment", - "govermnent", "governments", - "governemnt", "government", - "governened", "governed", - "governered", "governed", - "governmant", "governmental", - "governmetn", "governments", - "governmnet", "government", - "govnerment", "government", - "govornment", "government", - "gradiating", "graduating", - "gradiation", "graduation", - "graduacion", "graduation", - "grapefriut", "grapefruit", - "grapefrukt", "grapefruit", - "graphicaly", "graphically", - "graphiclly", "graphically", - "gratituous", "gratuitous", - "gratiutous", "gratuitous", - "gratuidous", "gratuitous", - "gratuituos", "gratuitous", - "gratutious", "gratuitous", - "graudating", "graduating", - "graudation", "graduation", - "gravitatie", "gravitate", - "greatfully", "gratefully", - "greenhosue", "greenhouse", - "greviances", "grievances", - "grievences", "grievances", - "grilfriend", "girlfriend", - "guaduloupe", "guadalupe", - "guanatanmo", "guantanamo", - "guantamamo", "guantanamo", - "guantamano", "guantanamo", - "guantanano", "guantanamo", - "guantanemo", "guantanamo", - "guantanoma", "guantanamo", - "guantanomo", "guantanamo", - "guantonamo", "guantanamo", - "guarantess", "guarantees", - "guardiands", "guardians", - "guardianes", "guardians", - "guardianis", "guardians", - "guarenteed", "guaranteed", - "guarentees", "guarantees", - "guarnateed", "guaranteed", - "guarnatees", "guarantees", - "guarunteed", "guaranteed", - "guaruntees", "guarantees", - "guatamalan", "guatemalan", - "gunatanamo", "guantanamo", - "gunlsinger", "gunslinger", - "gunsiinger", "gunslinger", - "gunslanger", "gunslinger", - "gunsligner", "gunslinger", - "gunstinger", "gunslinger", - "gymanstics", "gymnastics", - "gymnasitcs", "gymnastics", - "gynmastics", "gymnastics", - "haemorrage", "haemorrhage", - "halloweeen", "halloween", - "hambergers", "hamburgers", - "hamburgare", "hamburger", - "hamburgesa", "hamburgers", - "hamburgles", "hamburgers", - "hamburgurs", "hamburgers", - "handcuffes", "handcuffs", - "handelbars", "handlebars", - "handicaped", "handicapped", - "handwritng", "handwriting", - "harasments", "harassments", - "hardlinked", "hardline", - "harmoniacs", "harmonic", - "harmonisch", "harmonic", - "harrasment", "harassment", - "harrassing", "harassing", - "harvasting", "harvesting", - "haversting", "harvesting", - "headhpones", "headphones", - "headphoens", "headphones", - "headquarer", "headquarter", - "headquater", "headquarter", - "headshoots", "headshot", - "healtchare", "healthcare", - "healtheast", "healthiest", - "healthyest", "healthiest", - "heapdhones", "headphones", - "heartbeart", "heartbeat", - "heartbeast", "heartbeat", - "heartborne", "heartbroken", - "heartbrake", "heartbreak", - "hearthsone", "hearthstone", - "heatlhcare", "healthcare", - "heavyweght", "heavyweight", - "heavyweigt", "heavyweight", - "hedgehodge", "hedgehog", - "heidelburg", "heidelberg", - "heigthened", "heightened", - "heistation", "hesitation", - "helathcare", "healthcare", - "helicopers", "helicopters", - "helicoptor", "helicopter", - "helicotper", "helicopters", - "helicpoter", "helicopter", - "helictoper", "helicopters", - "helikopter", "helicopter", - "hemingwary", "hemingway", - "hemingwavy", "hemingway", - "hemipshere", "hemisphere", - "hemishpere", "hemisphere", - "hemmorhage", "hemorrhage", - "hempishere", "hemisphere", - "herculeans", "hercules", - "herculeasy", "hercules", - "herculeees", "hercules", - "hesitstion", "hesitation", - "hestiation", "hesitation", - "hieghtened", "heightened", - "hierachies", "hierarchies", - "hieroglphs", "hieroglyphs", - "highalnder", "highlander", - "highlighed", "highlighted", - "highligted", "highlighted", - "highloader", "highlander", - "highpander", "highlander", - "highscholl", "highschool", - "highshcool", "highschool", - "hillarious", "hilarious", - "hinderance", "hindrance", - "hinderence", "hindrance", - "hipsterest", "hipsters", - "hispanicos", "hispanics", - "hispanicus", "hispanics", - "histarical", "historical", - "histerical", "historical", - "historiaan", "historians", - "historicas", "historians", - "historicly", "historical", - "historiens", "histories", - "historisch", "historic", - "hoemopathy", "homeopathy", - "hollywoood", "hollywood", - "homecuming", "homecoming", - "homeoapthy", "homeopathy", - "homeonwers", "homeowners", - "homeopahty", "homeopathy", - "homeophaty", "homeopathy", - "homeopothy", "homeopathy", - "homeothapy", "homeopathy", - "homepoathy", "homeopathy", - "homewoners", "homeowners", - "homoepathy", "homeopathy", - "homogeneos", "homogeneous", - "homogeneus", "homogeneous", - "homophibia", "homophobia", - "homophibic", "homophobic", - "homophobie", "homophobe", - "homophonia", "homophobia", - "homophopia", "homophobia", - "homophopic", "homophobic", - "homosexaul", "homosexual", - "homosexuel", "homosexual", - "honeymooon", "honeymoon", - "hopefullly", "hopefully", - "hopeleslly", "hopelessly", - "horisontal", "horizontal", - "horizantal", "horizontal", - "horizontes", "horizons", - "horiztonal", "horizontal", - "horrendeus", "horrendous", - "horriblely", "horribly", - "hospitales", "hospitals", - "hospitalty", "hospitality", - "hospitible", "hospitable", - "hsitorians", "historians", - "humanaties", "humanities", - "humanitary", "humanity", - "humiliatin", "humiliation", - "humiliaton", "humiliation", - "humilitied", "humiliated", - "humillated", "humiliated", - "hurricance", "hurricane", - "hurriganes", "hurricanes", - "hurrikanes", "hurricanes", - "hurrycanes", "hurricanes", - "hydropilic", "hydrophilic", - "hydropobic", "hydrophobic", - "hyperbolie", "hyperbole", - "hyperlobic", "hyperbolic", - "hyperlogic", "hyperbolic", - "hypertrohy", "hypertrophy", - "hypertropy", "hypertrophy", - "hyphotesis", "hypothesis", - "hypocrates", "hypocrites", - "hypocriscy", "hypocrisy", - "hypocrises", "hypocrites", - "hypocritus", "hypocrites", - "hypocrties", "hypocrites", - "hypocrytes", "hypocrites", - "hypokrites", "hypocrites", - "hypothecis", "hypothesis", - "hypotheiss", "hypotheses", - "hypothesus", "hypotheses", - "hypothises", "hypotheses", - "hypothisis", "hypothesis", - "hypothosis", "hypothesis", - "hyprocites", "hypocrites", - "hystarical", "hysterical", - "hystericly", "hysterical", - "hysteriska", "hysteria", - "ibuprofein", "ibuprofen", - "ibuprofine", "ibuprofen", - "icelandinc", "icelandic", - "idealisitc", "idealistic", - "idealogies", "ideologies", - "identicial", "identical", - "identifyed", "identified", - "identitets", "identities", - "ideolagies", "ideologies", - "ideoligies", "ideologies", - "ideologias", "ideologies", - "ideologice", "ideologies", - "ideologije", "ideologies", - "ideologins", "ideologies", - "ideologisk", "ideologies", - "ideolouges", "ideologies", - "illegalest", "illegals", - "illegallly", "illegally", - "illegimacy", "illegitimacy", - "illegitime", "illegitimate", - "illegitimt", "illegitimate", - "illimunati", "illuminati", - "illinoians", "illinois", - "illistrate", "illiterate", - "illitarate", "illiterate", - "illitirate", "illiterate", - "illumanati", "illuminati", - "illumaniti", "illuminati", - "illumianti", "illuminati", - "illumimati", "illuminati", - "illuminaci", "illuminati", - "illuminadi", "illuminati", - "illuminami", "illuminati", - "illuminazi", "illuminati", - "illuminite", "illuminati", - "illuminiti", "illuminati", - "illuminoti", "illuminati", - "illuminuti", "illuminati", - "illumniati", "illuminati", - "illumunati", "illuminati", - "illuninati", "illuminati", - "illusiones", "illusions", - "illustrant", "illustrate", - "illustrare", "illustrate", - "illustrato", "illustration", - "imablanced", "imbalanced", - "imablances", "imbalances", - "imaginatie", "imaginative", - "imaginaton", "imagination", - "imaginitve", "imaginative", - "imbalenced", "imbalanced", - "imbalences", "imbalances", - "imcomplete", "incomplete", - "imediately", "immediately", - "imigration", "emigration", - "immaturaty", "immaturity", - "immaturety", "immaturity", - "immedeatly", "immediately", - "immediatly", "immediately", - "immedietly", "immediately", - "immenseley", "immensely", - "immidately", "immediately", - "immigranti", "immigration", - "immigrents", "immigrants", - "immitating", "imitating", - "immobilien", "immobile", - "immobilier", "immobile", - "immobilzed", "immobile", - "immobilzer", "immobile", - "immobilzes", "immobile", - "immortales", "immortals", - "immortalis", "immortals", - "immortaliy", "immortality", - "immortalls", "immortals", - "immortalty", "immortality", - "impartirla", "impartial", - "impecabbly", "impeccably", - "impeccible", "impeccable", - "impeckable", "impeccable", - "impelments", "implements", - "imperetive", "imperative", - "imperialsm", "imperialism", - "imperialst", "imperialist", - "imperitave", "imperative", - "imperitive", "imperative", - "implaments", "implements", - "implantase", "implants", - "implausble", "implausible", - "implausibe", "implausible", - "implemenet", "implements", - "implicatia", "implicit", - "implicatie", "implicit", - "implicatii", "implicit", - "implicetly", "implicitly", - "impliciete", "implicit", - "implicilty", "implicitly", - "impliments", "implements", - "imporbable", "improbable", - "importanly", "importantly", - "importanty", "importantly", - "importence", "importance", - "importerad", "imported", - "imporvised", "improvised", - "impossable", "impossible", - "impossbily", "impossibly", - "impossibal", "impossibly", - "impossibel", "impossibly", - "impossibry", "impossibly", - "impossibul", "impossibly", - "impractial", "impractical", - "impreative", "imperative", - "impresison", "impressions", - "impressoin", "impressions", - "impressons", "impressions", - "improbabil", "improbable", - "improbible", "improbable", - "impropable", "improbable", - "improsined", "imprisoned", - "improsoned", "imprisoned", - "improvemnt", "improvement", - "improvents", "improves", - "improvized", "improvised", - "imprsioned", "imprisoned", - "impulsemos", "impulses", - "imrpovised", "improvised", - "inablility", "inability", - "inaccruate", "inaccurate", - "inadaquate", "inadequate", - "inadaquete", "inadequate", - "inadecuate", "inadequate", - "inadeguate", "inadequate", - "inadeqaute", "inadequate", - "inadequete", "inadequate", - "inadequite", "inadequate", - "inadiquate", "inadequate", - "inagurated", "inaugurated", - "inbalanced", "imbalanced", - "inbetweeen", "inbetween", - "incarnaton", "incarnation", - "incentivos", "incentives", - "inchoerent", "incoherent", - "incidentes", "incidents", - "incidently", "incidentally", - "incidentul", "incidental", - "inclreased", "increased", - "incognitio", "incognito", - "incoherant", "incoherent", - "incohorent", "incoherent", - "incorectly", "incorrectly", - "incorrecly", "incorrectly", - "incorrecty", "incorrectly", - "incorretly", "incorrectly", - "incraments", "increments", - "incredable", "incredible", - "incredably", "incredibly", - "incremetal", "incremental", - "incriments", "increments", - "inctroduce", "introduce", - "indefenite", "indefinite", - "indefinate", "indefinite", - "indefinete", "indefinite", - "indefinity", "indefinitely", - "indeginous", "indigenous", - "indentical", "identical", - "independet", "independent", - "indepenent", "independent", - "inderictly", "indirectly", - "indicaters", "indicates", - "indicativo", "indication", - "indicatore", "indicate", - "indicitave", "indicative", - "indicitive", "indicative", - "indiffernt", "indifferent", - "indigenius", "indigenous", - "indiginous", "indigenous", - "indigneous", "indigenous", - "indikation", "indication", - "indireclty", "indirectly", - "indirektly", "indirectly", - "individuel", "individual", - "indiviudal", "individuals", - "indivudual", "individual", - "indoensian", "indonesian", - "indonasian", "indonesian", - "indoneisan", "indonesian", - "indonesean", "indonesian", - "indonesien", "indonesian", - "indonesion", "indonesian", - "indonisian", "indonesian", - "indonistan", "indonesian", - "indpendent", "independent", - "industiral", "industrial", - "industires", "industries", - "industrail", "industrial", - "industrees", "industries", - "industrias", "industries", - "industriel", "industrial", - "industrija", "industrial", - "industrije", "industries", - "indviduals", "individuals", - "inefficent", "inefficient", - "ineqaulity", "inequality", - "inequailty", "inequality", - "inevatible", "inevitable", - "inevetable", "inevitable", - "inevetably", "inevitably", - "inevetible", "inevitable", - "inevidable", "inevitable", - "inevidably", "inevitably", - "inevitible", "inevitable", - "inevitibly", "inevitably", - "inevtiable", "inevitable", - "inevtiably", "inevitably", - "infallable", "infallible", - "infaltable", "inflatable", - "infeccious", "infectious", - "infecteous", "infectious", - "infectuous", "infectious", - "infedility", "infidelity", - "infektious", "infectious", - "inferioara", "inferior", - "inferioare", "inferior", - "inferiorty", "inferiority", - "inferrence", "inference", - "infestaion", "infestation", - "infestaton", "infestation", - "infestions", "infections", - "infideltiy", "infidelity", - "infidility", "infidelity", - "infiltrade", "infiltrate", - "infiltrait", "infiltrate", - "infiltrare", "infiltrate", - "infiltrase", "infiltrate", - "infinately", "infinitely", - "infinetely", "infinitely", - "infiniment", "infinite", - "infinitley", "infinitely", - "infintiely", "infinitely", - "inflamable", "inflatable", - "inflateble", "inflatable", - "inflatible", "inflatable", - "infleunced", "influenced", - "inflitrate", "infiltrate", - "influanced", "influenced", - "influances", "influences", - "influencie", "influences", - "influening", "influencing", - "influensed", "influences", - "influenser", "influences", - "influenses", "influences", - "influental", "influential", - "influented", "influenced", - "influentes", "influences", - "influneced", "influenced", - "infograhic", "infographic", - "infograpic", "infographic", - "infomation", "information", - "informable", "informal", - "informarla", "informal", - "informarle", "informal", - "informarlo", "informal", - "informatie", "informative", - "informella", "informal", - "informerad", "informed", - "informtion", "information", - "infridging", "infringing", - "infrigning", "infringing", - "infulenced", "influenced", - "infulences", "influences", - "ingenuitiy", "ingenuity", - "ingrediant", "ingredient", - "ingrediens", "ingredients", - "ingrediets", "ingredient", - "inhabitans", "inhabitants", - "inhabitats", "inhabitants", - "inherantly", "inherently", - "inherintly", "inherently", - "inheritage", "heritage", - "inhernetly", "inherently", - "inifnitely", "infinitely", - "initaition", "initiation", - "initalised", "initialised", - "initaliser", "initialiser", - "initalises", "initialises", - "initalisms", "initialisms", - "initalized", "initialized", - "initalizer", "initializer", - "initalizes", "initializes", - "initalling", "initialling", - "initalness", "initialness", - "initiaitve", "initiatives", - "initiaties", "initiatives", - "initiativs", "initiatives", - "initiatves", "initiatives", - "initiavite", "initiatives", - "inititaive", "initiatives", - "inititiave", "initiatives", - "initmately", "intimately", - "initmidate", "intimidate", - "inituition", "initiation", - "injustaces", "injustices", - "injusticas", "injustices", - "inmigrants", "immigrants", - "innoavtion", "innovations", - "innocentes", "innocents", - "innotation", "innovation", - "innovacion", "innovation", - "innovaiton", "innovations", - "innovatief", "innovate", - "innovaties", "innovate", - "innovativo", "innovation", - "innvoation", "innovation", - "inofficial", "unofficial", - "inpsection", "inspection", - "inquisator", "inquisitor", - "inquisidor", "inquisitor", - "inquisiter", "inquisitor", - "inquisitio", "inquisitor", - "inquisitir", "inquisitor", - "inquisiton", "inquisition", - "inquistior", "inquisitor", - "inquizitor", "inquisitor", - "inqusitior", "inquisitor", - "insensitve", "insensitive", - "insepction", "inspection", - "insistance", "insistence", - "insistente", "insistence", - "insistenze", "insistence", - "insistince", "insistence", - "insitution", "institution", - "inspeccion", "inspection", - "inspeciton", "inspections", - "inspectons", "inspections", - "inspectres", "inspectors", - "inspektion", "inspection", - "inspektors", "inspectors", - "inspiraste", "inspires", - "inspiraton", "inspiration", - "inspirerad", "inspired", - "inspireras", "inspires", - "insrugency", "insurgency", - "instabiliy", "instability", - "instabilty", "instability", - "installeer", "installer", - "installent", "installment", - "installesd", "installs", - "installion", "installing", - "instatance", "instance", - "instelling", "installing", - "instituded", "instituted", - "instituion", "institution", - "institutie", "institute", - "institutue", "instituted", - "instrament", "instrument", - "instrcutor", "instructors", - "instrucion", "instruction", - "instructer", "instructor", - "instructie", "instructed", - "instruktor", "instructor", - "instuction", "instruction", - "instuments", "instruments", - "insturcted", "instructed", - "insturctor", "instructor", - "insturment", "instrument", - "instutions", "intuitions", - "instututed", "instituted", - "insurgance", "insurgency", - "insurgancy", "insurgency", - "intangable", "intangible", - "intangeble", "intangible", - "intangibil", "intangible", - "intanjible", "intangible", - "integraded", "integrated", - "integrarla", "integral", - "integrarlo", "integral", - "integratie", "integrated", - "integreres", "interferes", - "integreted", "integrated", - "inteligent", "intelligent", - "intenseley", "intensely", - "intensitiy", "intensity", - "intentinal", "intentional", - "intentines", "intestines", - "interacive", "interactive", - "interactes", "interacts", - "interactie", "interactive", - "interactue", "interacted", - "interasted", "interacted", - "interbread", "interbreed", - "intercepto", "interception", - "intercorse", "intercourse", - "intercouse", "intercourse", - "intereacts", "interfaces", - "interected", "interacted", - "interefers", "interferes", - "interesant", "interest", - "interesing", "interesting", - "interestes", "interests", - "interfacce", "interfaces", - "interfears", "interferes", - "interfeers", "interferes", - "interferce", "interferes", - "interferre", "interfere", - "intergated", "integrated", - "interioara", "interior", - "interioare", "interior", - "intermedie", "intermediate", - "internetbs", "internets", - "internetes", "internets", - "internetis", "internets", - "internetts", "internets", - "internetus", "internets", - "interprate", "interpret", - "interrugum", "interregnum", - "interruped", "interrupted", - "interstela", "interstellar", - "intervalls", "intervals", - "intervalos", "intervals", - "interveign", "intervening", - "interveing", "intervening", - "interveiws", "interviews", - "intervento", "intervention", - "intervenue", "intervene", - "interveres", "interferes", - "intervieni", "interviewing", - "intervieuw", "interviews", - "interviewd", "interviewed", - "interviewr", "interviewer", - "intervines", "intervenes", - "interviwed", "interviewed", - "interviwer", "interviewer", - "interwebbs", "interwebs", - "intestents", "intestines", - "intestinas", "intestines", - "intestinos", "intestines", - "intestions", "intestines", - "intidimate", "intimidate", - "intimadate", "intimidate", - "intimatley", "intimately", - "intimiated", "intimidate", - "intimidade", "intimidated", - "intimidant", "intimidate", - "intimidare", "intimidate", - "intimitade", "intimidated", - "intimitaly", "intimately", - "intimitate", "intimidate", - "intimitely", "intimately", - "intolarant", "intolerant", - "intolerace", "intolerance", - "intolerate", "intolerant", - "intolerent", "intolerant", - "intolorant", "intolerant", - "intolorent", "intolerant", - "intorduced", "introduced", - "intorduces", "introduces", - "intorverts", "introverts", - "intoxicted", "intoxicated", - "intraverts", "introverts", - "intreguing", "intriguing", - "intricaces", "intricacies", - "intriguied", "intrigue", - "intrigured", "intrigue", - "intrinseci", "intrinsic", - "intrinsinc", "intrinsic", - "intriquing", "intriguing", - "intriuging", "intriguing", - "introdecks", "introduces", - "introdused", "introduces", - "introvents", "introverts", - "introvered", "introverted", - "introversa", "introverts", - "introverse", "introverts", - "introversi", "introverts", - "introverso", "introverts", - "introversy", "introverts", - "introveted", "introverted", - "intruduced", "introduced", - "intruduces", "introduces", - "intruiging", "intriguing", - "intruments", "instruments", - "intuitevly", "intuitively", - "intuitivly", "intuitively", - "intuitivno", "intuition", - "intutively", "intuitively", - "inumerable", "enumerable", - "inusrgency", "insurgency", - "invaderats", "invaders", - "invaildate", "invalidates", - "invairably", "invariably", - "invaldiate", "invalidates", - "invalidade", "invalidate", - "invalidare", "invalidate", - "invalubale", "invaluable", - "invalueble", "invaluable", - "invaraibly", "invariably", - "invariabil", "invariably", - "invaribaly", "invariably", - "invaulable", "invaluable", - "inveitable", "inevitable", - "inveitably", "inevitably", - "invensions", "inventions", - "inventario", "inventor", - "inventarlo", "inventor", - "inventaron", "inventor", - "inventings", "inventions", - "inventivos", "inventions", - "invertendo", "inverted", - "inverterad", "inverted", - "invertions", "inventions", - "investemnt", "investments", - "investiage", "investigate", - "investions", "inventions", - "investirat", "investigator", - "investmens", "investments", - "invicinble", "invincible", - "invididual", "individual", - "invincable", "invincible", - "invinceble", "invincible", - "invinicble", "invincible", - "invinsible", "invincible", - "invinvible", "invincible", - "invisibily", "invisibility", - "invitacion", "invitation", - "invitating", "invitation", - "involunary", "involuntary", - "involvment", "involvement", - "ironcially", "ironically", - "irracional", "irrational", - "irrationel", "irrational", - "irrelavant", "irrelevant", - "irrelavent", "irrelevant", - "irrelevent", "irrelevant", - "irrelivant", "irrelevant", - "irrelivent", "irrelevant", - "irrevelant", "irrelevant", - "irreverant", "irrelevant", - "irridation", "irritation", - "irriration", "irritation", - "irritacion", "irritation", - "irritaties", "irritate", - "islamisist", "islamist", - "islamistas", "islamists", - "isntalling", "installing", - "isntructed", "instructed", - "isntrument", "instrument", - "israeliens", "israelis", - "israelitas", "israelis", - "italianess", "italians", - "itnroduced", "introduced", - "jailborken", "jailbroken", - "jalibroken", "jailbroken", - "jamaicains", "jamaican", - "jamaicaman", "jamaican", - "jerusaleum", "jerusalem", - "jounralism", "journalism", - "jounralist", "journalist", - "jouranlism", "journalism", - "jouranlist", "journalist", - "journalims", "journals", - "journalits", "journals", - "journalizm", "journalism", - "journalsim", "journalism", - "journolist", "journalist", - "judegments", "judgements", - "judgemenal", "judgemental", - "judgemetal", "judgemental", - "jugdements", "judgements", - "juggarnaut", "juggernaut", - "juggeranut", "juggernaut", - "juggernath", "juggernaut", - "juggernout", "juggernaut", - "juggernuat", "juggernaut", - "juggetnaut", "juggernaut", - "jugglenaut", "juggernaut", - "juggurnaut", "juggernaut", - "justifible", "justifiable", - "juvenilles", "juvenile", - "kickstarer", "kickstarter", - "kickstartr", "kickstarter", - "kickstater", "kickstarter", - "kidnapning", "kidnapping", - "kidnappade", "kidnapped", - "killingest", "killings", - "kilometros", "kilometers", - "kilomiters", "kilometers", - "kilomoters", "kilometers", - "kilomteres", "kilometers", - "kindapping", "kidnapping", - "kingdomers", "kingdoms", - "krpytonite", "kryptonite", - "krypotnite", "kryptonite", - "krypronite", "kryptonite", - "kryptinite", "kryptonite", - "kryptolite", "kryptonite", - "kryptonyte", "kryptonite", - "krypyonite", "kryptonite", - "krytponite", "kryptonite", - "kyrptonite", "kryptonite", - "labarotory", "laboratory", - "laboratroy", "laboratory", - "laborerers", "laborers", - "laboritory", "laboratory", - "laborotory", "laboratory", - "lackbuster", "lackluster", - "lacklaster", "lackluster", - "landacapes", "landscapes", - "landingers", "landings", - "landshapes", "landscapes", - "landspaces", "landscapes", - "lannasters", "lannisters", - "lannesters", "lannisters", - "lannistars", "lannisters", - "lannsiters", "lannisters", - "lateration", "alteration", - "latitudine", "latitude", - "laughabley", "laughably", - "laughablly", "laughably", - "launchered", "launched", - "leaglizing", "legalizing", - "lectureres", "lectures", - "legalazing", "legalizing", - "legalizare", "legalize", - "legalizate", "legalize", - "legendaies", "legendaries", - "legendaris", "legendaries", - "legimitacy", "legitimacy", - "legimitate", "legitimate", - "legislatie", "legislative", - "legitamacy", "legitimacy", - "legitamate", "legitimate", - "legitamicy", "legitimacy", - "legitamite", "legitimate", - "legitemacy", "legitimacy", - "legitemate", "legitimate", - "legitimaly", "legitimacy", - "legitimicy", "legitimacy", - "legitimite", "legitimate", - "leiutenant", "lieutenant", - "lesbianese", "lesbians", - "lesbianest", "lesbians", - "leuitenant", "lieutenant", - "levetating", "levitating", - "liberacion", "liberation", - "liberalest", "liberate", - "liberalizm", "liberalism", - "liberalnim", "liberalism", - "liberalsim", "liberalism", - "liberarion", "liberation", - "liberaties", "liberate", - "liberatore", "liberate", - "libertania", "libertarians", - "libguistic", "linguistic", - "lietuenant", "lieutenant", - "lieutanant", "lieutenant", - "lieutanent", "lieutenant", - "lieutenent", "lieutenant", - "lifestiles", "lifestyles", - "lifestlyes", "lifestyles", - "lifesystem", "filesystem", - "lifesytles", "lifestyles", - "lifetimers", "lifetimes", - "lifetsyles", "lifestyles", - "lighhtning", "lightening", - "lightergas", "lighters", - "lighthning", "lightening", - "lighthorse", "lighthouse", - "lighthosue", "lighthouse", - "lighthours", "lighthouse", - "lightining", "lighting", - "lightneing", "lightening", - "lightnting", "lightening", - "lightrooom", "lightroom", - "lightweigt", "lightweight", - "ligitation", "litigation", - "ligthening", "lightening", - "ligthhouse", "lighthouse", - "likelyhood", "likelihood", - "limination", "limitation", - "limitacion", "limitation", - "limitaiton", "limitation", - "limitating", "limitation", - "limitativo", "limitation", - "linguisics", "linguistics", - "linguisitc", "linguistics", - "linguistcs", "linguistics", - "linguistis", "linguistics", - "linguitics", "linguistic", - "lingusitic", "linguistics", - "lingvistic", "linguistic", - "liousville", "louisville", - "listeneres", "listeners", - "literallly", "literally", - "literarely", "literary", - "literarlly", "literary", - "literatire", "literate", - "literative", "literate", - "literatute", "literate", - "lithuanina", "lithuania", - "litterally", "literally", - "liuetenant", "lieutenant", - "liveatream", "livestream", - "livelehood", "livelihood", - "liverpoool", "liverpool", - "livescream", "livestream", - "livestreem", "livestream", - "livestrems", "livestream", - "livilehood", "livelihood", - "livliehood", "livelihood", - "lobbyistes", "lobbyists", - "lockacreen", "lockscreen", - "logictical", "logistical", - "logisitcal", "logistical", - "logisticas", "logistics", - "logisticly", "logistical", - "loiusville", "louisville", - "lollipoopy", "lollipop", - "lonelyness", "loneliness", - "longevitiy", "longevity", - "lonileness", "loneliness", - "lonlieness", "loneliness", - "louieville", "louisville", - "louisiania", "louisiana", - "louisianna", "louisiana", - "louisivlle", "louisville", - "louisviile", "louisville", - "lousiville", "louisville", - "luietenant", "lieutenant", - "mabyelline", "maybelline", - "magnifient", "magnificent", - "mainpulate", "manipulate", - "mainstreem", "mainstream", - "maintaince", "maintained", - "maintaines", "maintains", - "maintainig", "maintaining", - "maintenace", "maintenance", - "maintianed", "maintained", - "maintioned", "mentioned", - "malfuncion", "malfunction", - "malpractce", "malpractice", - "managebale", "manageable", - "maneagable", "manageable", - "maneouvred", "manoeuvred", - "maneouvres", "manoeuvres", - "maneuveres", "maneuvers", - "maneuveurs", "maneuver", - "manifestas", "manifests", - "manifestes", "manifests", - "manifestus", "manifests", - "manipluate", "manipulate", - "manipualte", "manipulate", - "manipulant", "manipulate", - "manipulare", "manipulate", - "manipulted", "manipulated", - "maniuplate", "manipulate", - "mannarisms", "mannerisms", - "mannersims", "mannerisms", - "mannorisms", "mannerisms", - "manufacter", "manufacture", - "manufacure", "manufacture", - "manufature", "manufacture", - "maraudeurs", "marauder", - "margaritte", "margaret", - "margianlly", "marginally", - "marginaali", "marginal", - "marginable", "marginal", - "marignally", "marginally", - "marijuanna", "marijuana", - "marketting", "marketing", - "marshmalow", "marshmallow", - "masculinty", "masculinity", - "massacrare", "massacre", - "massivelly", "massively", - "masteriers", "masteries", - "masternind", "mastermind", - "masterpice", "masterpiece", - "mastrubate", "masturbate", - "mastubrate", "masturbated", - "masturabte", "masturbate", - "masturbait", "masturbate", - "masturbare", "masturbate", - "masturbeta", "masturbated", - "masturdate", "masturbate", - "materiales", "materials", - "materialsm", "materialism", - "maximazing", "maximizing", - "maximixing", "maximizing", - "mayballine", "maybelline", - "maybellene", "maybelline", - "maybellibe", "maybelline", - "maybilline", "maybelline", - "mccarthyst", "mccarthyist", - "mdifielder", "midfielder", - "meagthread", "megathread", - "meaningess", "meanings", - "meaningles", "meanings", - "meatballls", "meatballs", - "mecahnical", "mechanical", - "mecahnisms", "mechanisms", - "mechancial", "mechanical", - "mechandise", "merchandise", - "mechanichs", "mechanics", - "mechanicle", "mechanical", - "mechanicly", "mechanical", - "mechanicus", "mechanics", - "mechanincs", "mechanic", - "mechanisim", "mechanism", - "mechansims", "mechanisms", - "mechinical", "mechanical", - "mechinisms", "mechanisms", - "mediaction", "medications", - "medicacion", "medication", - "medicaiton", "medication", - "medicalert", "medicare", - "medicallly", "medically", - "medicatons", "medications", - "medicinens", "medicines", - "medicinske", "medicine", - "medicority", "mediocrity", - "medidating", "meditating", - "mediocirty", "mediocrity", - "mediocraty", "mediocrity", - "mediocrety", "mediocrity", - "mediocricy", "mediocrity", - "mediocrily", "mediocrity", - "mediocrisy", "mediocrity", - "meditacion", "medications", - "meditaiton", "meditation", - "melatonian", "melatonin", - "melatonion", "melatonin", - "mellinnium", "millennium", - "melodieuse", "melodies", - "membrances", "membrane", - "mentallity", "mentally", - "mentionnes", "mentions", - "mercenaire", "mercenaries", - "mercenares", "mercenaries", - "mercentile", "mercantile", - "merchanise", "merchandise", - "merchantos", "merchants", - "messagease", "messages", - "messagepad", "messaged", - "messenging", "messaging", - "metabalism", "metabolism", - "metabilism", "metabolism", - "metabloism", "metabolism", - "metablosim", "metabolism", - "metabolics", "metabolism", - "metabolizm", "metabolism", - "metabolsim", "metabolism", - "metalurgic", "metallurgic", - "metaphoras", "metaphors", - "metaphores", "metaphors", - "metaphyics", "metaphysics", - "meterology", "meteorology", - "methaphors", "metaphors", - "methodolgy", "methodology", - "methodoloy", "methodology", - "metrapolis", "metropolis", - "metrolopis", "metropolis", - "metropilis", "metropolis", - "metroplois", "metropolis", - "metropolin", "metropolitan", - "metropolos", "metropolis", - "metropolys", "metropolis", - "mexicanese", "mexicans", - "mexicaness", "mexicans", - "michelline", "michelle", - "micorwaves", "microwaves", - "microhpone", "microphone", - "microscoop", "microscope", - "microvaves", "microwaves", - "microvaxes", "microwaves", - "micrpohone", "microphones", - "midfeilder", "midfielder", - "midfiedler", "midfielder", - "midfieldes", "midfielders", - "midfielers", "midfielders", - "midfileder", "midfielder", - "midifelder", "midfielder", - "midnlessly", "mindlessly", - "migitation", "mitigation", - "migrainers", "migraines", - "miletsones", "milestones", - "milisecond", "millisecond", - "militiades", "militias", - "militiants", "militias", - "millinnium", "millennium", - "miminalist", "minimalist", - "minamilist", "minimalist", - "mindleslly", "mindlessly", - "minimazing", "minimizing", - "minimilast", "minimalist", - "minimilist", "minimalist", - "mininalist", "minimalist", - "ministeres", "ministers", - "ministerns", "ministers", - "minneaplis", "minneapolis", - "minneapols", "minneapolis", - "minnesotta", "minnesota", - "minoritets", "minorities", - "minoroties", "minorities", - "miracalous", "miraculous", - "miracluous", "miraculous", - "miracoulus", "miraculous", - "mircophone", "microphone", - "mircoscope", "microscope", - "mircowaves", "microwaves", - "misandrony", "misandry", - "miscarrage", "miscarriage", - "miscarrige", "miscarriage", - "misdemenor", "misdemeanor", - "miserabley", "miserably", - "miserablly", "miserably", - "misforture", "misfortune", - "misgoynist", "misogynist", - "misinfomed", "misinformed", - "misinterpt", "misinterpret", - "misisonary", "missionary", - "misoganist", "misogynist", - "misogenist", "misogynist", - "misoginist", "misogynist", - "misoginyst", "misogynist", - "misognyist", "misogynist", - "misogonist", "misogynist", - "misogonyst", "misogynist", - "misogyinst", "misogynist", - "misogynyst", "misogynist", - "misoygnist", "misogynist", - "mispelling", "misspelling", - "missionare", "missionaries", - "missionera", "missionary", - "missisippi", "mississippi", - "mississipi", "mississippi", - "mississppi", "mississippi", - "misspeling", "misspelling", - "misspellng", "misspelling", - "mistakedly", "mistakenly", - "mistakinly", "mistakenly", - "mistankely", "mistakenly", - "misterious", "mysterious", - "misteryous", "mysterious", - "mistreaded", "mistreated", - "misygonist", "misogynist", - "mitigaiton", "mitigation", - "moderacion", "moderation", - "moderaters", "moderates", - "moderatley", "moderately", - "moderatore", "moderate", - "moderatorn", "moderation", - "modificato", "modification", - "modifieras", "modifiers", - "modifieres", "modifiers", - "moisturier", "moisturizer", - "moleculair", "molecular", - "molestaion", "molestation", - "molestarle", "molester", - "molestarme", "molester", - "molestarse", "molester", - "molestarte", "molester", - "molestered", "molested", - "momentarly", "momentarily", - "monagomous", "monogamous", - "monetizare", "monetize", - "monitering", "monitoring", - "monogymous", "monogamous", - "monolistic", "monolithic", - "monolitich", "monolithic", - "monolopies", "monopolies", - "monolothic", "monolithic", - "monolythic", "monolithic", - "monopilies", "monopolies", - "monoploies", "monopolies", - "monopolets", "monopolies", - "monopolice", "monopolies", - "monopolios", "monopolies", - "monothilic", "monolithic", - "monsterous", "monsters", - "montioring", "monitoring", - "monumentos", "monuments", - "monumentul", "monumental", - "monumentus", "monuments", - "mormonisim", "mormonism", - "morphinate", "morphine", - "morrisette", "morissette", - "morrisound", "morrison", - "mosquitero", "mosquito", - "mosquiters", "mosquitoes", - "motherbard", "motherboard", - "motherboad", "motherboard", - "motherbord", "motherboard", - "motivaiton", "motivations", - "motiviated", "motivated", - "motorcicle", "motorcycle", - "motorcylce", "motorcycle", - "motorcyles", "motorcycles", - "motorollas", "motorola", - "mouthpeace", "mouthpiece", - "mouthpeice", "mouthpiece", - "movespeeed", "movespeed", - "mozzaralla", "mozzarella", - "mozzeralla", "mozzarella", - "mozzorella", "mozzarella", - "mulitation", "mutilation", - "mulitplied", "multiplied", - "mulitplier", "multiplier", - "mulitverse", "multiverse", - "multilpier", "multiplier", - "multiplaer", "multiplier", - "multiplaye", "multiply", - "multiplayr", "multiply", - "multiplays", "multiply", - "multipleye", "multiply", - "multipling", "multiplying", - "multiplyed", "multiplied", - "multiplyer", "multiple", - "multiplyng", "multiplying", - "murderered", "murdered", - "murdereres", "murderers", - "muscicians", "musicians", - "musculaire", "muscular", - "mushroooms", "mushroom", - "mutialtion", "mutilation", - "mutiliated", "mutilated", - "mutliation", "mutilation", - "mutliplied", "multiplied", - "mutliplier", "multiplier", - "mutliverse", "multiverse", - "mysogynist", "misogynist", - "mysterieus", "mysteries", - "nagivating", "navigating", - "nagivation", "navigation", - "narcassism", "narcissism", - "narcassist", "narcissist", - "narcessist", "narcissist", - "narciscism", "narcissism", - "narciscist", "narcissist", - "narcisissm", "narcissism", - "narcisisst", "narcissist", - "narcisists", "narcissist", - "narcissicm", "narcissism", - "narcissict", "narcissist", - "narcissitc", "narcissist", - "narcissits", "narcissist", - "narcoticos", "narcotics", - "narrativas", "narratives", - "narrativos", "narratives", - "narritives", "narratives", - "nashvillle", "nashville", - "nationales", "nationals", - "nationalis", "nationals", - "nationalit", "nationalist", - "nationaliy", "nationality", - "nationalty", "nationality", - "nationella", "national", - "naturually", "naturally", - "naviagting", "navigating", - "naviagtion", "navigation", - "navigatore", "navigate", - "neccessary", "necessary", - "necesarily", "necessarily", - "necessairy", "necessarily", - "necessarly", "necessary", - "necessarry", "necessary", - "necessiate", "necessitate", - "necessites", "necessities", - "neckbeared", "neckbeard", - "neckboards", "neckbeards", - "neckbreads", "neckbeards", - "neckneards", "neckbeards", - "necromacer", "necromancer", - "necromaner", "necromancer", - "needleslly", "needlessly", - "negativaty", "negativity", - "negativley", "negatively", - "negelcting", "neglecting", - "negilgence", "negligence", - "negiotated", "negotiated", - "neglacting", "neglecting", - "neglagence", "negligence", - "neglegance", "negligence", - "neglegible", "negligible", - "neglegting", "neglecting", - "neglibible", "negligible", - "neglicence", "negligence", - "neglicible", "negligible", - "neglicting", "neglecting", - "negligable", "negligible", - "negligance", "negligence", - "negligeble", "negligible", - "negligente", "negligence", - "negociated", "negotiated", - "negogiated", "negotiated", - "negoitated", "negotiated", - "negotaited", "negotiated", - "negotation", "negotiation", - "negotiaion", "negotiation", - "negotiatie", "negotiated", - "negotiatin", "negotiations", - "negotiaton", "negotiation", - "neigbhours", "neighbours", - "neighbhors", "neighbours", - "neighbords", "neighbours", - "neighbores", "neighbours", - "netowrking", "networking", - "netruality", "neutrality", - "neturality", "neutrality", - "netwroking", "networking", - "neurologia", "neurological", - "neutrailty", "neutrality", - "newletters", "newsletters", - "newlsetter", "newsletter", - "newsettler", "newsletter", - "newslatter", "newsletter", - "nieghbours", "neighbours", - "nightmates", "nightmares", - "nightmears", "nightmares", - "nightmeres", "nightmares", - "nigthmares", "nightmares", - "nipticking", "nitpicking", - "nitpciking", "nitpicking", - "nominacion", "nomination", - "nominatino", "nominations", - "nominativo", "nomination", - "nominatons", "nominations", - "nonsencial", "nonsensical", - "nontheless", "nonetheless", - "northerend", "northern", - "nostalgica", "nostalgia", - "nostalgija", "nostalgia", - "noteworhty", "noteworthy", - "nothingess", "nothingness", - "noticabely", "noticeably", - "noticabley", "noticeably", - "noticiably", "noticeably", - "notoriosly", "notoriously", - "novembeard", "november", - "nuetrality", "neutrality", - "nutricious", "nutritious", - "nutrientes", "nutrients", - "nutritents", "nutrients", - "nutritinal", "nutritional", - "nutritiuos", "nutritious", - "nutritivos", "nutritious", - "nutrituous", "nutritious", - "nutrutious", "nutritious", - "obatinable", "obtainable", - "obejctives", "objectives", - "obilgatory", "obligatory", - "objecitves", "objectives", - "objectivas", "objectives", - "objectivly", "objectively", - "objectivst", "objectives", - "objectivty", "objectivity", - "objektives", "objectives", - "obligitary", "obligatory", - "obligitory", "obligatory", - "observabil", "observable", - "observarse", "observers", - "observaton", "observation", - "observeras", "observers", - "observered", "observed", - "observeres", "observers", - "observible", "observable", - "obstancles", "obstacles", - "obstrucion", "obstruction", - "obstructin", "obstruction", - "obtainabie", "obtainable", - "obtaineble", "obtainable", - "obtainible", "obtainable", - "obtianable", "obtainable", - "ocasionaly", "occasionally", - "ocassional", "occasional", - "ocassioned", "occasioned", - "occaisonal", "occasional", - "occasionly", "occasional", - "occassions", "occasions", - "occational", "occasional", - "occulation", "occupation", - "occupaiton", "occupation", - "occurances", "occurrences", - "occurences", "occurrences", - "occurrance", "occurrence", - "octohedral", "octahedral", - "octohedron", "octahedron", - "offensivly", "offensively", - "offereings", "offerings", - "officailly", "officially", - "olbigatory", "obligatory", - "ominpotent", "omnipotent", - "ominscient", "omniscient", - "omnipetent", "omnipotent", - "omnipitent", "omnipotent", - "omnipotant", "omnipotent", - "omnisicent", "omniscient", - "omniverous", "omnivorous", - "omnsicient", "omniscient", - "onmipotent", "omnipotent", - "onmiscient", "omniscient", - "operatings", "operations", - "operativne", "operative", - "operativos", "operations", - "oportunity", "opportunity", - "opponenets", "opponent", - "oppononent", "opponent", - "oppressiun", "oppressing", - "optimisitc", "optimistic", - "optimizare", "optimize", - "optimizate", "optimize", - "optimizied", "optimize", - "organicaly", "organically", - "organiclly", "organically", - "organisate", "organise", - "organische", "organise", - "organisera", "organizers", - "organisere", "organizers", - "organisert", "organizers", - "organisier", "organise", - "organisims", "organism", - "organismed", "organise", - "organismen", "organise", - "organismer", "organise", - "organismes", "organisms", - "organismus", "organisms", - "organisten", "organise", - "organiszed", "organise", - "organizaed", "organize", - "organizare", "organizer", - "organizate", "organize", - "organizors", "organizers", - "organizuje", "organize", - "organziers", "organizers", - "orientaion", "orientation", - "orientarla", "oriental", - "orientarlo", "oriental", - "origianlly", "originally", - "originales", "originals", - "originalet", "originated", - "originalis", "originals", - "originalty", "originality", - "orignially", "originally", - "origniated", "originated", - "origonally", "originally", - "origonated", "originated", - "ostencibly", "ostensibly", - "ostenisbly", "ostensibly", - "ostensably", "ostensibly", - "ostentibly", "ostensibly", - "ostrasiced", "ostracized", - "ostrasized", "ostracized", - "ostraziced", "ostracized", - "ostrazised", "ostracized", - "ostrecized", "ostracized", - "ostricized", "ostracized", - "ostrocized", "ostracized", - "oustanding", "outstanding", - "outcalssed", "outclassed", - "outlcassed", "outclassed", - "outnumberd", "outnumbered", - "outnumbred", "outnumbered", - "outperfoms", "outperform", - "outperfrom", "outperform", - "outpreform", "outperform", - "outrageuos", "outrageous", - "outragious", "outrageous", - "outragoues", "outrageous", - "outreagous", "outrageous", - "outsourcad", "outsourced", - "outsouring", "outsourcing", - "outsoursed", "outsourced", - "outweighes", "outweighs", - "overarcing", "overarching", - "overclockd", "overclocked", - "overcloked", "overclocked", - "overcoding", "overcoming", - "overheards", "overhead", - "overheared", "overhead", - "overhooked", "overlooked", - "overlanded", "overloaded", - "overlaoded", "overloaded", - "overlaping", "overlapping", - "overlauded", "overloaded", - "overloards", "overload", - "overlorded", "overloaded", - "overlordes", "overlords", - "overnurfed", "overturned", - "overpirced", "overpriced", - "overpowerd", "overpowered", - "overpowred", "overpowered", - "overprised", "overpriced", - "overtunned", "overturned", - "overtunred", "overturned", - "overturing", "overturn", - "overweigth", "overweight", - "overwhemed", "overwhelmed", - "overwieght", "overweight", - "overwritte", "overwrite", - "pahtfinder", "pathfinder", - "painfullly", "painfully", - "painkilers", "painkillers", - "pairlament", "parliament", - "pakistanti", "pakistani", - "paladinlst", "paladins", - "palcements", "placements", - "paleolitic", "paleolithic", - "palestinan", "palestinian", - "paltformer", "platformer", - "palyerbase", "playerbase", - "parachutte", "parachute", - "parademics", "paramedics", - "paradiggum", "paradigm", - "paragraghs", "paragraphs", - "paragrahps", "paragraphs", - "paragrapgh", "paragraphs", - "paragrpahs", "paragraphs", - "parahprase", "paraphrase", - "paralleles", "parallels", - "parallells", "parallels", - "paramadics", "paramedics", - "paramaters", "parameters", - "paramecias", "paramedics", - "parametics", "paramedics", - "parametros", "parameters", - "paramiters", "parameters", - "paramormal", "paranormal", - "paranoicas", "paranoia", - "paranomral", "paranormal", - "paranornal", "paranormal", - "parapharse", "paraphrase", - "paraphraze", "paraphrase", - "paraprhase", "paraphrase", - "parasitter", "parasite", - "parilament", "parliament", - "parituclar", "particular", - "parlaiment", "parliament", - "parliamant", "parliament", - "parliamone", "parliament", - "parliement", "parliament", - "parrallell", "parallel", - "parrallely", "parallelly", - "partiarchy", "patriarchy", - "participas", "participants", - "participat", "participants", - "participte", "participate", - "particualr", "particular", - "partiotism", "patriotism", - "passionais", "passions", - "passionale", "passionately", - "passionant", "passionate", - "passionite", "passionate", - "passivedns", "passives", - "passivelly", "passively", - "patenterad", "patented", - "pathfidner", "pathfinder", - "pathfindir", "pathfinder", - "pathifnder", "pathfinder", - "patientens", "patients", - "patrairchy", "patriarchy", - "patriachry", "patriarchy", - "patriarcal", "patriarchal", - "patriarhal", "patriarchal", - "patriatchy", "patriarchy", - "patriatism", "patriotism", - "patrionism", "patriotism", - "patriotics", "patriotism", - "patriotisk", "patriots", - "patroitism", "patriotism", - "patryarchy", "patriarchy", - "pedantisch", "pedantic", - "pedestiran", "pedestrian", - "pedestrain", "pedestrian", - "pedictions", "depictions", - "pedohpiles", "pedophiles", - "pedohpilia", "pedophilia", - "pedophilac", "pedophilia", - "pedophilea", "pedophilia", - "pedophilie", "pedophile", - "pedophilla", "pedophilia", - "pedophille", "pedophile", - "pedopholia", "pedophilia", - "penetraion", "penetration", - "penetratin", "penetration", - "penetraton", "penetration", - "penguinese", "penguins", - "penguiness", "penguins", - "peninsulla", "peninsula", - "penninsula", "peninsula", - "peodphiles", "pedophiles", - "peodphilia", "pedophilia", - "pepperment", "peppermint", - "pepperonni", "pepperoni", - "percantage", "percentage", - "percantile", "percentile", - "percaution", "precaution", - "percenatge", "percentages", - "percential", "percentile", - "percentige", "percentile", - "perceptoin", "perceptions", - "percession", "percussion", - "percetange", "percentages", - "percetnage", "percentages", - "percintile", "percentile", - "percission", "percussion", - "percpetion", "perceptions", - "percusions", "percussion", - "perdicting", "predicting", - "perdiction", "prediction", - "perdictive", "predictive", - "perenially", "perennially", - "perfeccion", "perfection", - "perfecxion", "perfection", - "perfektion", "perfection", - "perferable", "preferable", - "perferably", "preferably", - "perference", "preference", - "perferring", "preferring", - "perfexcion", "perfection", - "perfomance", "performance", - "performace", "performance", - "performane", "performances", - "performans", "performances", - "performens", "performers", - "performous", "performs", - "perfromers", "performers", - "perhiperal", "peripheral", - "peridinkle", "periwinkle", - "perihperal", "peripheral", - "periodisch", "periodic", - "periperhal", "peripheral", - "peripheals", "peripherals", - "peripheria", "peripheral", - "periphiral", "peripheral", - "periphreal", "peripheral", - "periphrial", "peripheral", - "peritinkle", "periwinkle", - "periwankle", "periwinkle", - "periwinkel", "periwinkle", - "periwinkie", "periwinkle", - "periwinlke", "periwinkle", - "permanenty", "permanently", - "permanetly", "permanently", - "permisions", "permission", - "permisison", "permissions", - "permissble", "permissible", - "permissibe", "permissible", - "permissons", "permissions", - "perogative", "prerogative", - "perordered", "preordered", - "perpatuate", "perpetuate", - "perpetualy", "perpetually", - "perpetuare", "perpetuate", - "persausion", "persuasion", - "persausive", "persuasive", - "persective", "respective", - "persectued", "persecuted", - "persecutie", "persecuted", - "persecutin", "persecution", - "perserving", "preserving", - "persicuted", "persecuted", - "persistant", "persistent", - "persistens", "persists", - "persoanlly", "personally", - "persocuted", "persecuted", - "personalie", "personalized", - "personalis", "personas", - "personarse", "personas", - "personatus", "personas", - "personnell", "personnel", - "perspecive", "perspective", - "perspectie", "perspectives", - "persuasian", "persuasion", - "persuasing", "persuasion", - "persuasivo", "persuasion", - "persuation", "persuasion", - "persucuted", "persecuted", - "persumably", "presumably", - "persussion", "persuasion", - "persvasive", "persuasive", - "perswasion", "persuasion", - "pertinante", "pertinent", - "pervailing", "prevailing", - "pervalence", "prevalence", - "pervention", "prevention", - "perversley", "perverse", - "pesitcides", "pesticides", - "pessimistc", "pessimistic", - "pessimitic", "pessimistic", - "pestacides", "pesticides", - "pestecides", "pesticides", - "pesticedes", "pesticides", - "pesticidas", "pesticides", - "pestisides", "pesticides", - "pestizides", "pesticides", - "pharamcist", "pharmacist", - "pharmacias", "pharmacist", - "pharmacyst", "pharmacist", - "pharmasist", "pharmacist", - "pharmicist", "pharmacist", - "phemonenon", "phenomenon", - "phenemenon", "phenomenon", - "phenemonal", "phenomenal", - "phenomanal", "phenomenal", - "phenomanon", "phenomenon", - "phenomemon", "phenomenon", - "phenomenen", "phenomenon", - "phenomenol", "phenomenal", - "phenomenom", "phenomenon", - "phenominon", "phenomenon", - "phenomonal", "phenomenal", - "phenomonen", "phenomenon", - "phenomonon", "phenomenon", - "phenonemal", "phenomenal", - "phenonemon", "phenomenon", - "phenonmena", "phenomena", - "philipines", "philippines", - "philippins", "philippines", - "philisophy", "philosophy", - "phillipine", "philippine", - "phillipses", "phillies", - "philosiphy", "philosophy", - "philosohpy", "philosophy", - "philosoper", "philosopher", - "philospher", "philosopher", - "philospohy", "philosophy", - "photogragh", "photograph", - "photograhs", "photographs", - "photograhy", "photography", - "photograps", "photographs", - "photograpy", "photography", - "photogrpah", "photographs", - "photoshopd", "photoshopped", - "photoshope", "photoshopped", - "phramacist", "pharmacist", - "phsyically", "physically", - "phsyicians", "physicians", - "phsyicists", "physicists", - "phsyiology", "physiology", - "phycisians", "physicians", - "phycisists", "physicists", - "phyiscally", "physically", - "phyisology", "physiology", - "physcially", "physically", - "physcology", "psychology", - "physcopath", "psychopath", - "physicials", "physicians", - "physiciens", "physicians", - "physioligy", "physiology", - "picthforks", "pitchforks", - "pinoneered", "pioneered", - "pitchferks", "pitchforks", - "pitchfolks", "pitchforks", - "pitchfords", "pitchforks", - "pitchworks", "pitchforks", - "pitckforks", "pitchforks", - "pittaburgh", "pittsburgh", - "pittsbrugh", "pittsburgh", - "placehoder", "placeholder", - "placeholdr", "placeholder", - "placeholer", "placeholder", - "placemenet", "placements", - "plagairism", "plagiarism", - "plagarisim", "plagiarism", - "plagiariam", "plagiarism", - "plagiarios", "plagiarism", - "plagiarius", "plagiarism", - "plagiarizm", "plagiarism", - "plagierism", "plagiarism", - "plaguarism", "plagiarism", - "plaigarism", "plagiarism", - "plasticosa", "plastics", - "platfarmer", "platformer", - "platformar", "platformer", - "platformie", "platformer", - "platfotmer", "platformer", - "platfromer", "platformer", - "platofrmer", "platformer", - "playaround", "playground", - "playersare", "playerbase", - "playgorund", "playground", - "playthrogh", "playthrough", - "playthrouh", "playthrough", - "playwrites", "playwrights", - "plethorian", "plethora", - "policitian", "politician", - "polinators", "pollinators", - "polishuset", "polishes", - "politessen", "politeness", - "politicain", "politician", - "politicaly", "politically", - "politicien", "politician", - "politicing", "politician", - "politicion", "politician", - "politickin", "politician", - "politiikan", "politician", - "politiness", "politeness", - "polititian", "politician", - "popualtion", "populations", - "populairty", "popularity", - "populaiton", "populations", - "popularaty", "popularity", - "popularest", "populate", - "popularily", "popularity", - "populaties", "populate", - "populatiry", "popularity", - "populative", "populate", - "populatoin", "populations", - "popultaion", "populations", - "pormetheus", "prometheus", - "pornograhy", "pornography", - "pornograpy", "pornography", - "pornogrphy", "pornography", - "porportion", "proportion", - "portabilty", "portability", - "portarying", "portraying", - "portoguese", "portuguese", - "portraiing", "portraying", - "portrating", "portraying", - "portrayels", "portrays", - "portugeuse", "portuguese", - "portuguise", "portuguese", - "posessions", "possessions", - "posicional", "positional", - "positevely", "positively", - "positioing", "positioning", - "positionly", "positional", - "positionne", "positioned", - "positivley", "positively", - "possesives", "possessive", - "possessers", "possesses", - "possessess", "possesses", - "possibiliy", "possibility", - "possibilty", "possibility", - "possissive", "possessive", - "posthomous", "posthumous", - "potentialy", "potentially", - "poulations", "populations", - "powerhorse", "powerhouse", - "powerhosue", "powerhouse", - "powerhours", "powerhouse", - "powerhsell", "powershell", - "powerprint", "powerpoint", - "powersehll", "powershell", - "ppublisher", "publisher", - "practially", "practically", - "practicaly", "practically", - "practicess", "practise", - "practiclly", "practically", - "practioner", "practitioner", - "precaucion", "precaution", - "precausion", "precaution", - "precautios", "precautions", - "precedance", "precedence", - "precedense", "precedence", - "preceeding", "preceding", - "precendece", "precedence", - "precentage", "percentage", - "precentile", "percentile", - "preciselly", "precisely", - "precuation", "precautions", - "precussion", "percussion", - "predecated", "predicated", - "predecence", "precedence", - "predecesor", "predecessor", - "predection", "prediction", - "predective", "predictive", - "prediccion", "prediction", - "prediceted", "predicated", - "predicited", "predicated", - "predicitng", "predicting", - "prediciton", "prediction", - "predicitve", "predictive", - "predickted", "predicated", - "predictave", "predictive", - "predictivo", "prediction", - "predictons", "predictions", - "predjuiced", "prejudiced", - "predjuices", "prejudices", - "preduction", "prediction", - "preductive", "predictive", - "predujiced", "prejudiced", - "predujices", "prejudices", - "prefarable", "preferable", - "prefarably", "preferably", - "prefection", "perfection", - "preferance", "preference", - "prefereble", "preferable", - "preferente", "preference", - "preferenze", "preference", - "preferible", "preferable", - "preferibly", "preferably", - "prefernece", "preferences", - "preformers", "performers", - "pregancies", "pregnancies", - "pregnanies", "pregnancies", - "preipheral", "peripheral", - "preisdents", "presidents", - "preisthood", "priesthood", - "prejeduced", "prejudiced", - "prejeduces", "prejudices", - "prejiduced", "prejudiced", - "prejiduces", "prejudices", - "prejucided", "prejudiced", - "prejucides", "prejudices", - "prejuduced", "prejudiced", - "prejuduces", "prejudices", - "prelimiary", "preliminary", - "prematurly", "prematurely", - "preminence", "preeminence", - "premission", "permission", - "preorderes", "preorders", - "prepartion", "preparation", - "prepetuate", "perpetuate", - "preposters", "preposterous", - "prescients", "presidents", - "prescirbed", "prescribed", - "prescriped", "prescribed", - "presearing", "preserving", - "presecuted", "persecuted", - "presedency", "presidency", - "presedents", "presidents", - "presenning", "presenting", - "presentase", "presents", - "presentato", "presentation", - "presention", "presenting", - "presentors", "presents", - "preservare", "preserve", - "preservato", "preservation", - "preserverd", "preserved", - "presidancy", "presidency", - "presidante", "presidents", - "presidenta", "presidential", - "presidenty", "presidency", - "presidunce", "presidency", - "presistent", "persistent", - "presonally", "personally", - "presonhood", "personhood", - "pressuming", "pressuring", - "prestigios", "prestigious", - "prestigous", "prestigious", - "presuambly", "presumably", - "presuasion", "persuasion", - "presuasive", "persuasive", - "presumebly", "presumably", - "presumendo", "presumed", - "presumibly", "presumably", - "presumpton", "presumption", - "pretaining", "pertaining", - "pretection", "protection", - "pretendias", "pretends", - "pretensive", "pretense", - "pretentios", "pretentious", - "pretentous", "pretentious", - "prevalecen", "prevalence", - "prevalente", "prevalence", - "prevencion", "prevention", - "preventivo", "prevention", - "preventors", "prevents", - "previaling", "prevailing", - "previosuly", "previously", - "previoulsy", "previously", - "prevolence", "prevalence", - "pricinpals", "principals", - "primarilly", "primarily", - "primatives", "primitives", - "princepals", "principals", - "princesess", "princesses", - "princibles", "principles", - "principaly", "principality", - "principels", "principals", - "principial", "principal", - "principias", "principals", - "principlas", "principals", - "prinicipal", "principal", - "prinicpals", "principals", - "prinicples", "principles", - "printerest", "printers", - "prioratize", "prioritize", - "prioretize", "prioritize", - "prioritice", "prioritize", - "prioritied", "prioritize", - "prioroties", "priorities", - "priorotize", "prioritize", - "priotities", "priorities", - "priotitize", "prioritize", - "privaleged", "privileged", - "privaleges", "privileges", - "privaticed", "privatized", - "privelaged", "privileged", - "privelages", "privileges", - "priveldges", "privileges", - "priveleged", "privileged", - "priveleges", "privileges", - "privelidge", "privileged", - "priveliged", "privileged", - "priveliges", "privileges", - "privetized", "privatized", - "privilaged", "privileged", - "privilages", "privileges", - "priviledge", "privilege", - "privilegde", "privileges", - "privilegie", "privilege", - "priviliged", "privileged", - "priviliges", "privileges", - "privitazed", "privatized", - "privitized", "privatized", - "probabiliy", "probability", - "probabilty", "probability", - "probablies", "probable", - "probablybe", "probable", - "problemita", "problematic", - "procalimed", "proclaimed", - "procceding", "proceeding", - "procedding", "proceeding", - "procederal", "procedural", - "procedings", "proceedings", - "procedrual", "procedural", - "proceededs", "proceeds", - "proceedure", "procedure", - "proceesing", "proceeding", - "processsor", "processors", - "proclamied", "proclaimed", - "proclaming", "proclaiming", - "procliamed", "proclaimed", - "procreatin", "procreation", - "procudures", "procedures", - "prodcution", "production", - "prodecural", "procedural", - "prodecures", "procedures", - "produccion", "production", - "produceras", "produces", - "produceres", "produces", - "producirse", "producers", - "produciton", "production", - "producting", "production", - "productino", "productions", - "productivo", "production", - "productivy", "productivity", - "productoin", "productions", - "produktion", "production", - "produktive", "productive", - "produtcion", "productions", - "profesions", "profession", - "professers", "professors", - "professorn", "profession", - "professsor", "professors", - "proffesion", "profession", - "proficeint", "proficient", - "proficiant", "proficient", - "proficieny", "proficiency", - "proficincy", "proficiency", - "profitabel", "profitable", - "profitabil", "profitable", - "profitible", "profitable", - "proftiable", "profitable", - "programmar", "programmer", - "programmme", "programme", - "progresing", "progressing", - "progresion", "progression", - "progresive", "progressive", - "progressie", "progressives", - "progressin", "progression", - "progresson", "progression", - "progressos", "progresses", - "progressus", "progresses", - "prohibirte", "prohibit", - "prohibites", "prohibits", - "prohibitng", "prohibiting", - "prohibiton", "prohibition", - "prohibitus", "prohibits", - "prohibitve", "prohibited", - "prohobited", "prohibited", - "prohpecies", "prophecies", - "projecitle", "projectiles", - "projectiel", "projectiles", - "projecties", "projectiles", - "projectils", "projectiles", - "projectles", "projectiles", - "projectlie", "projectiles", - "projectyle", "projectile", - "projektile", "projectile", - "projektion", "projection", - "prometheas", "prometheus", - "promethese", "prometheus", - "promethius", "prometheus", - "promethous", "prometheus", - "promethues", "prometheus", - "prominance", "prominence", - "prominenty", "prominently", - "prominetly", "prominently", - "promiscous", "promiscuous", - "promiscuos", "promiscuous", - "promoteurs", "promotes", - "promotheus", "prometheus", - "promotinal", "promotional", - "pronoucned", "pronounced", - "pronouning", "pronouncing", - "propechies", "prophecies", - "propencity", "propensity", - "propenents", "proponents", - "properites", "properties", - "propersity", "propensity", - "propertion", "proportion", - "propertius", "properties", - "prophacies", "prophecies", - "prophocies", "prophecies", - "propietary", "proprietary", - "proplusion", "propulsion", - "propoganda", "propaganda", - "propogates", "propagates", - "propolsion", "propulsion", - "proponants", "proponents", - "proponenet", "proponent", - "proporcion", "proportion", - "proporties", "properties", - "proporting", "proportion", - "propositon", "proposition", - "propotions", "proportions", - "proprietry", "proprietary", - "proprotion", "proportion", - "propserity", "prosperity", - "propserous", "prosperous", - "propulaios", "propulsion", - "propulsing", "propulsion", - "propultion", "propulsion", - "propuslion", "propulsion", - "prosectued", "prosecuted", - "prosectuor", "prosecutor", - "prosecuter", "prosecutor", - "prosecutie", "prosecuted", - "prosicuted", "prosecuted", - "prosicutor", "prosecutor", - "prosocuted", "prosecuted", - "prosparity", "prosperity", - "prospectos", "prospects", - "prosperety", "prosperity", - "prospertiy", "prosperity", - "prosphetic", "prosthetic", - "prosporous", "prosperous", - "prostehtic", "prosthetic", - "prosterity", "prosperity", - "prostethic", "prosthetic", - "prostitite", "prostitute", - "prostitude", "prostitute", - "prostituee", "prostitute", - "prostituer", "prostitute", - "prostitues", "prostitutes", - "prostiture", "prostitute", - "prostituto", "prostitution", - "prostituye", "prostitute", - "protaginst", "protagonist", - "protastant", "protestant", - "proteccion", "protection", - "proteciton", "protections", - "protectice", "protective", - "protectiei", "protective", - "protectoin", "protections", - "protectons", "protectors", - "protectron", "protection", - "protestans", "protests", - "protestare", "protesters", - "protestato", "protestant", - "protestent", "protestant", - "protestina", "protestant", - "prothsetic", "prosthetic", - "protistant", "protestant", - "protocoles", "protocols", - "protocolls", "protocols", - "protocolos", "protocols", - "protohypes", "prototypes", - "protostant", "protestant", - "prototipes", "prototypes", - "prototpyes", "prototypes", - "protraying", "portraying", - "protuguese", "portuguese", - "provencial", "provincial", - "proveribal", "proverbial", - "provervial", "proverbial", - "providance", "providence", - "providince", "providence", - "provinciae", "province", - "provincies", "province", - "provincija", "provincial", - "provinence", "providence", - "provinical", "provincial", - "provintial", "provincial", - "provinvial", "provincial", - "provisiosn", "provision", - "provisonal", "provisional", - "provocatie", "provocative", - "pscyhology", "psychology", - "pscyhopath", "psychopath", - "pshycology", "psychology", - "pshycopath", "psychopath", - "psychedlic", "psychedelic", - "psychiatic", "psychiatric", - "psycholoog", "psychology", - "psychopaat", "psychopath", - "psychopats", "psychopaths", - "ptichforks", "pitchforks", - "publicitan", "publication", - "publisheed", "published", - "publisherr", "publisher", - "publishher", "publisher", - "publissher", "publisher", - "publlisher", "publisher", - "punihsment", "punishments", - "punishemnt", "punishments", - "punishible", "punishable", - "punishmnet", "punishments", - "punissable", "punishable", - "punsihable", "punishable", - "purchacing", "purchasing", - "purpolsion", "propulsion", - "purposedly", "purposely", - "purposelly", "purposely", - "purpotedly", "purportedly", - "pususading", "persuading", - "pyschology", "psychology", - "pyschopath", "psychopath", - "qaulifiers", "qualifiers", - "quailfiers", "qualifiers", - "qualfiiers", "qualifiers", - "qualifieds", "qualifies", - "qualifiies", "qualifiers", - "qualifiing", "qualifying", - "qualifires", "qualifiers", - "qualifyers", "qualifiers", - "qualitying", "qualifying", - "quanitites", "quantities", - "quantaties", "quantities", - "quantitize", "quantities", - "quarantena", "quarantine", - "quarantene", "quarantine", - "quarantied", "quarantine", - "quarintine", "quarantine", - "quaruntine", "quarantine", - "quesitoned", "questioned", - "questional", "questionable", - "questionne", "questioned", - "rabinnical", "rabbinical", - "radiactive", "radioactive", - "radioacive", "radioactive", - "rainbowers", "rainbows", - "randmoness", "randomness", - "randomzied", "randomized", - "randonmess", "randomness", - "randumness", "randomness", - "raspberrry", "raspberry", - "rationalle", "rationale", - "readmition", "readmission", - "realitvely", "relatively", - "realtively", "relatively", - "realtivity", "relativity", - "reaserched", "researched", - "reasercher", "researcher", - "rebiulding", "rebuilding", - "reboudning", "rebounding", - "rebouncing", "rebounding", - "rebuidling", "rebuilding", - "rebuliding", "rebuilding", - "rebuplican", "republican", - "reccommend", "recommend", - "recepients", "recipients", - "receptoras", "receptors", - "receptores", "receptors", - "recgonised", "recognised", - "recgonized", "recognized", - "recgonizes", "recognizes", - "reciepents", "recipients", - "recipeints", "recipients", - "recipiants", "recipients", - "recocnised", "recognised", - "recoginsed", "recognised", - "recoginzed", "recognized", - "recognices", "recognizes", - "recogniton", "recognition", - "recognzied", "recognised", - "recomended", "recommended", - "recommande", "recommend", - "recommands", "recommends", - "recommeded", "recommended", - "recommened", "recommend", - "recommennd", "recommends", - "recomments", "recommends", - "recompence", "recompense", - "reconcider", "reconsider", - "reconcille", "reconcile", - "recongised", "recognised", - "recongized", "recognized", - "recongizes", "recognizes", - "reconisder", "reconsider", - "reconsiled", "reconsider", - "recordarle", "recorder", - "recordarme", "recorder", - "recordarse", "recorder", - "recordarte", "recorder", - "recreacion", "recreation", - "recreatief", "recreate", - "recreativo", "recreation", - "recrutiers", "recruiters", - "rectanglar", "rectangular", - "rectangual", "rectangular", - "rectanguar", "rectangular", - "recuriters", "recruiters", - "recurrance", "recurrence", - "recursivly", "recursively", - "redefinied", "redefine", - "redefinine", "redefine", - "redemtpion", "redemption", - "redepmtion", "redemption", - "redesiging", "redesign", - "rediculous", "ridiculous", - "redmeption", "redemption", - "redneckers", "rednecks", - "redneckese", "rednecks", - "redneckest", "rednecks", - "reduncancy", "redundancy", - "redundency", "redundancy", - "redundnacy", "redundancy", - "redunduncy", "redundancy", - "reenforced", "reinforced", - "reevaulate", "reevaluate", - "refedendum", "referendum", - "refelcting", "reflecting", - "refelction", "reflection", - "refelctive", "reflective", - "referances", "references", - "referandum", "referendum", - "referemces", "references", - "referemdum", "referendum", - "referendim", "referendum", - "referendom", "referendum", - "referenece", "reference", - "referening", "referencing", - "referenses", "referees", - "referentes", "references", - "referneces", "references", - "referrence", "reference", - "referundum", "referendum", - "refference", "reference", - "refleciton", "reflections", - "reflecters", "reflects", - "reflektion", "reflection", - "reflextion", "reflection", - "reformerad", "reformed", - "refrigerar", "refrigerator", - "refurbised", "refurbished", - "regenarate", "regenerate", - "registeres", "registers", - "registrato", "registration", - "regresives", "regressive", - "regressivo", "regression", - "regualting", "regulating", - "regualtion", "regulations", - "regualtors", "regulators", - "regulacion", "regulation", - "regulament", "regulate", - "regulaotrs", "regulators", - "regularily", "regularly", - "regularing", "regulating", - "regularlas", "regulars", - "regularlos", "regulars", - "regulaters", "regulators", - "regulatios", "regulators", - "regulatons", "regulations", - "rehtorical", "rhetorical", - "reinstaled", "reinstalled", - "reitrement", "retirement", - "relagation", "relaxation", - "relatation", "relaxation", - "relativety", "relativity", - "relativily", "relativity", - "relativley", "relatively", - "relavation", "relaxation", - "relaxating", "relaxation", - "relazation", "relaxation", - "releagtion", "relegation", - "relegetion", "relegation", - "relentness", "relentless", - "reletnless", "relentless", - "relevation", "revelation", - "relexation", "relegation", - "relfecting", "reflecting", - "relfection", "reflection", - "relfective", "reflective", - "reliabilty", "reliability", - "reliablely", "reliably", - "religiones", "religions", - "religiosly", "religiously", - "religiousy", "religiously", - "religously", "religiously", - "relitavely", "relatively", - "reluctanct", "reluctant", - "reluctanly", "reluctantly", - "reluctanty", "reluctantly", - "remarcably", "remarkably", - "remarkibly", "remarkably", - "rememberes", "remembers", - "remenicent", "reminiscent", - "reminisent", "reminiscent", - "reminscent", "reminiscent", - "remmebered", "remembered", - "renaissace", "renaissance", - "renderered", "rendered", - "renegerate", "regenerate", - "renewabels", "renewables", - "renewebles", "renewables", - "rennovated", "renovated", - "renweables", "renewables", - "repatition", "repetition", - "repblicans", "republicans", - "repbulican", "republican", - "repeadedly", "repeatedly", - "repeadetly", "repeatedly", - "repearable", "repeatable", - "repearedly", "repealed", - "repeatadly", "repeatedly", - "repeatedlt", "repealed", - "repeatetly", "repeatedly", - "repeatible", "repeatable", - "repeatidly", "repeatedly", - "repectable", "repeatable", - "repentable", "repeatable", - "repentence", "repentance", - "repersents", "represents", - "repetation", "repetition", - "repeteadly", "repeatedly", - "repetetion", "repetition", - "repeticion", "repetition", - "repetitivo", "repetition", - "replacated", "replicated", - "replaceble", "replaceable", - "replacemet", "replacements", - "replacemnt", "replacement", - "replacemtn", "replacements", - "replecated", "replicated", - "repoistory", "repository", - "reponsible", "responsible", - "reportadly", "reportedly", - "reporteros", "reporters", - "reportidly", "reportedly", - "repositary", "repository", - "reposotory", "repository", - "repostiory", "repository", - "representn", "representing", - "repressent", "represents", - "repressivo", "repression", - "repsectful", "respectful", - "repsecting", "respecting", - "repsective", "respective", - "repsonding", "responding", - "repsonsive", "responsive", - "reptuation", "reputation", - "repubicans", "republicans", - "republcian", "republican", - "republians", "republicans", - "republicon", "republican", - "repuglican", "republican", - "repulicans", "republicans", - "reputacion", "reputation", - "requirment", "requirement", - "requrement", "requirement", - "resemblace", "resemble", - "reserached", "researched", - "reseracher", "researchers", - "reserverad", "reserved", - "reservered", "reserved", - "residental", "residential", - "resistable", "resistible", - "resistanes", "resistances", - "resistanse", "resistances", - "resistence", "resistance", - "resistendo", "resisted", - "resistered", "resisted", - "resistnace", "resistances", - "resitsance", "resistances", - "resoltuion", "resolutions", - "resolucion", "resolution", - "resolutino", "resolutions", - "resolutoin", "resolutions", - "resolutons", "resolutions", - "resolvemos", "resolves", - "resolvendo", "resolved", - "resolveres", "resolves", - "resolverse", "resolves", - "resolviste", "resolves", - "resonabelt", "resonate", - "resoultion", "resolution", - "respecitve", "respective", - "respectifs", "respects", - "respection", "respecting", - "respectons", "respects", - "respectuos", "respects", - "respektive", "respective", - "respiratoy", "respiratory", - "responcive", "responsive", - "responisve", "responsive", - "responsibe", "responsive", - "responsiby", "responsibly", - "responsile", "responsive", - "responsing", "responding", - "ressembled", "resembled", - "restarants", "restaurants", - "restaraunt", "restaurant", - "restaruant", "restaurant", - "restatting", "restarting", - "restaurent", "restaurant", - "restauring", "restarting", - "resteraunt", "restaurant", - "restircted", "restricted", - "restorting", "restarting", - "restrainig", "restraining", - "restrcited", "restricted", - "restrcting", "restarting", - "restricing", "restricting", - "restricion", "restriction", - "restricive", "restrictive", - "restrictes", "restricts", - "restrictie", "restrictive", - "restricton", "restriction", - "restructed", "restricted", - "restuarant", "restaurant", - "resturants", "restaurants", - "resturaunt", "restaurant", - "retaliaton", "retaliation", - "rethorical", "rhetorical", - "retierment", "retirement", - "retribuito", "retribution", - "retrosepct", "retrospect", - "retrospekt", "retrospect", - "revaluated", "reevaluated", - "revealtion", "revelations", - "revelaiton", "revelations", - "revelatons", "revelations", - "revelution", "revelation", - "reversable", "reversible", - "reversably", "reversal", - "reviewtrue", "reviewer", - "revisiones", "revisions", - "revisionis", "revisions", - "revoltuion", "revolution", - "revoluiton", "revolutions", - "revolutoin", "revolutions", - "revoultion", "revolution", - "rewarching", "rewatching", - "rewatchibg", "rewatching", - "rewatchign", "rewatching", - "rewatchimg", "rewatching", - "rhapsodomy", "rhapsody", - "rhetorisch", "rhetoric", - "ridicilous", "ridiculous", - "ridicoulus", "ridiculous", - "ridiculise", "ridicule", - "ridiculize", "ridicule", - "ridiculled", "ridicule", - "ridiculose", "ridicule", - "ridiculued", "ridicule", - "rienforced", "reinforced", - "rigthfully", "rightfully", - "roleplaing", "roleplaying", - "romanmania", "romanian", - "roundaboot", "roundabout", - "rucuperate", "recuperate", - "rudimentry", "rudimentary", - "sacarmento", "sacramento", - "sacntioned", "sanctioned", - "sacraficed", "sacrificed", - "sacrafices", "sacrifices", - "sacramenno", "sacramento", - "sacreficed", "sacrificed", - "sacrefices", "sacrifices", - "sacremento", "sacramento", - "sacrifaced", "sacrificed", - "sacrifaces", "sacrifices", - "sacrifical", "sacrificial", - "sacrificas", "sacrifices", - "sacrificie", "sacrificed", - "sacrificng", "sacrificing", - "sacrifises", "sacrifices", - "sacrifized", "sacrificed", - "sacrifizes", "sacrifices", - "sacromento", "sacramento", - "sadistisch", "sadistic", - "sanctionne", "sanctioned", - "sandiwches", "sandwiches", - "sandviches", "sandwiches", - "sandwishes", "sandwiches", - "sanitazion", "sanitation", - "santiation", "sanitation", - "sastifying", "satisfying", - "satellitte", "satellites", - "satifsying", "satisfying", - "satrically", "satirically", - "satsifying", "satisfying", - "sattelites", "satellites", - "saturacion", "saturation", - "scandalosa", "scandals", - "scandalose", "scandals", - "scandalosi", "scandals", - "scandaloso", "scandals", - "scandaniva", "scandinavia", - "scandinava", "scandinavian", - "scandinvia", "scandinavia", - "scaramento", "sacramento", - "scarificed", "sacrificed", - "scarifices", "sacrifices", - "scarmbling", "scrambling", - "scartching", "scratching", - "sceintific", "scientific", - "sceintists", "scientists", - "scenarioes", "scenarios", - "scenarions", "scenarios", - "scenarious", "scenarios", - "scheudling", "scheduling", - "scholarhip", "scholarship", - "scholarley", "scholarly", - "sciencists", "scientists", - "scientests", "scientists", - "scirptures", "scriptures", - "scooterers", "scooters", - "scorebaord", "scoreboard", - "scoreborad", "scoreboard", - "scorebored", "scoreboard", - "scorpiomon", "scorpion", - "scracthing", "scratching", - "scramblies", "scramble", - "screenshat", "screenshot", - "screenshit", "screenshot", - "scriptores", "scriptures", - "scripturae", "scriptures", - "scriputres", "scriptures", - "scritpures", "scriptures", - "scrutinity", "scrutiny", - "seahawkers", "seahawks", - "sebastiaan", "sebastian", - "segegrated", "segregated", - "segragated", "segregated", - "segregaded", "segregated", - "segregatie", "segregated", - "segretated", "segregated", - "segrigated", "segregated", - "selectiose", "selections", - "selectivly", "selectively", - "selectivos", "selections", - "selfishess", "selfishness", - "senitments", "sentiments", - "sensitiviy", "sensitivity", - "sensitivty", "sensitivity", - "sentaments", "sentiments", - "sentancing", "sentencing", - "sentements", "sentiments", - "sentencian", "sentencing", - "sentensing", "sentencing", - "sentimenal", "sentimental", - "sentimetal", "sentimental", - "sentincing", "sentencing", - "sentinents", "sentiments", - "separacion", "separation", - "separaters", "separates", - "separatley", "separately", - "separatron", "separation", - "separetely", "separately", - "seperately", "separately", - "seperating", "separating", - "seperation", "separation", - "seperatism", "separatism", - "seperatist", "separatist", - "seperatley", "seperate", - "sepulchure", "sepulchre", - "serenitary", "serenity", - "serviceble", "serviceable", - "settelment", "settlement", - "settlemens", "settlements", - "settlemets", "settlements", - "settlemnts", "settlements", - "seuxalized", "sexualized", - "seventeeen", "seventeen", - "sexaulized", "sexualized", - "sexualixed", "sexualized", - "sexuallity", "sexually", - "sexualzied", "sexualized", - "sexulaized", "sexualized", - "shakespare", "shakespeare", - "shakespeer", "shakespeare", - "shakespere", "shakespeare", - "shamelesly", "shamelessly", - "shamelessy", "shamelessly", - "shaprening", "sharpening", - "shareholds", "shareholders", - "sharkening", "sharpening", - "sharpining", "sharpening", - "shartening", "sharpening", - "shatnering", "shattering", - "shattening", "shattering", - "shepharded", "shepherd", - "shilouette", "silhouette", - "shitlasses", "shitless", - "shortenend", "shortened", - "shortining", "shortening", - "sidelinien", "sideline", - "sidelinjen", "sideline", - "sidelinked", "sideline", - "sigantures", "signatures", - "sightstine", "sightstone", - "signficant", "significant", - "signifiant", "significant", - "significat", "significant", - "signitures", "signatures", - "sigthstone", "sightstone", - "sihlouette", "silhouette", - "silohuette", "silhouette", - "silouhette", "silhouette", - "similairty", "similarity", - "similarily", "similarly", - "similarlly", "similarly", - "similiarly", "similarly", - "similiarty", "similarity", - "simliarity", "similarity", - "simluation", "simulation", - "simplictic", "simplistic", - "simplifing", "simplifying", - "simplifyed", "simplified", - "simplifyng", "simplifying", - "simplisitc", "simplistic", - "simplisity", "simplicity", - "simplistes", "simplest", - "simplivity", "simplicity", - "simplyfied", "simplified", - "simualtion", "simulation", - "simulacion", "simulation", - "simulaiton", "simulations", - "simulaties", "simulate", - "simulative", "simulate", - "simulatons", "simulations", - "simulatore", "simulate", - "sincereley", "sincerely", - "sincerelly", "sincerely", - "singatures", "signatures", - "singulaire", "singular", - "singulariy", "singularity", - "singularty", "singularity", - "singulator", "singular", - "sitautions", "situations", - "situatinal", "situational", - "skatebaord", "skateboard", - "skateborad", "skateboard", - "skatebored", "skateboard", - "skatebrand", "skateboard", - "skeletones", "skeletons", - "skeptecism", "skepticism", - "skepticals", "skeptics", - "skepticles", "skeptics", - "skepticons", "skeptics", - "skeptisicm", "skepticism", - "skeptisism", "skepticism", - "sketchysex", "sketches", - "sketpicism", "skepticism", - "skillhosts", "skillshots", - "skillshits", "skillshots", - "skillshoot", "skillshots", - "skillslots", "skillshots", - "skillsofts", "skillshots", - "skillsshot", "skillshots", - "skirmiches", "skirmish", - "skpeticism", "skepticism", - "slaughterd", "slaughtered", - "slipperies", "slippers", - "smarpthone", "smartphones", - "smarthpone", "smartphone", - "snadwiches", "sandwiches", - "snowbaling", "snowballing", - "snowballes", "snowballs", - "snowballls", "snowballs", - "socailists", "socialists", - "socailized", "socialized", - "socialisim", "socialism", - "socializng", "socializing", - "socialsits", "socialists", - "sociapaths", "sociopaths", - "socilaists", "socialists", - "socilaized", "socialized", - "sociologia", "sociological", - "sociopatas", "sociopaths", - "sociopatch", "sociopaths", - "sociopatic", "sociopathic", - "socratease", "socrates", - "socreboard", "scoreboard", - "soemthings", "somethings", - "soldiarity", "solidarity", - "solidairty", "solidarity", - "soliditary", "solidarity", - "solitudine", "solitude", - "somehtings", "somethings", - "someonelse", "someones", - "somethibng", "somethin", - "somethigng", "somethin", - "somethigns", "somethings", - "somethihng", "somethin", - "somethiing", "somethin", - "somethijng", "somethin", - "somethikng", "somethin", - "somethimng", "somethin", - "somethinbg", "somethings", - "somethines", "somethings", - "somethinfg", "somethings", - "somethinhg", "somethings", - "somethinig", "somethings", - "somethinkg", "somethings", - "somethinks", "somethings", - "somethinmg", "somethings", - "somethinng", "somethings", - "somethintg", "somethings", - "somethiong", "somethin", - "somethiung", "somethin", - "sophicated", "sophisticated", - "sotrmfront", "stormfront", - "sotrylines", "storylines", - "soudntrack", "soundtrack", - "soundrtack", "soundtracks", - "soundtracs", "soundtracks", - "soundtrakc", "soundtracks", - "soundtrakk", "soundtrack", - "soundtraks", "soundtracks", - "southampon", "southampton", - "southamton", "southampton", - "southerers", "southerners", - "southernes", "southerners", - "southerton", "southern", - "souveniers", "souvenirs", - "sovereigny", "sovereignty", - "sovereinty", "sovereignty", - "soverignty", "sovereignty", - "spartaniis", "spartans", - "spartanops", "spartans", - "specailist", "specialist", - "specailize", "specializes", - "specialice", "specialize", - "specialied", "specialized", - "specialies", "specializes", - "specialits", "specials", - "speciallly", "specially", - "speciallty", "specially", - "specialops", "specials", - "specialsts", "specialists", - "specialtys", "specials", - "specialzed", "specialized", - "specialzes", "specializes", - "specifices", "specifics", - "specifiing", "specifying", - "specifiyng", "specifying", - "speciliast", "specialists", - "specimines", "specimen", - "spectarors", "spectators", - "spectaters", "spectators", - "spectracal", "spectral", - "spectraply", "spectral", - "spectrolab", "spectral", - "speculatie", "speculative", - "speculatin", "speculation", - "speecheasy", "speeches", - "speicalist", "specialist", - "spiritualy", "spiritually", - "sponsorees", "sponsors", - "sponsorhip", "sponsorship", - "sponsorise", "sponsors", - "spontaneos", "spontaneous", - "spontaneus", "spontaneous", - "spontanous", "spontaneous", - "spoonfulls", "spoonfuls", - "spreadshet", "spreadsheet", - "springfeld", "springfield", - "springfied", "springfield", - "spriritual", "spiritual", - "squirrells", "squirrels", - "squirrelus", "squirrels", - "stabelized", "stabilized", - "stabilzied", "stabilized", - "stablility", "stability", - "stablizied", "stabilized", - "staggaring", "staggering", - "stakeboard", "skateboard", - "starighten", "straighten", - "starnation", "starvation", - "startegies", "strategies", - "startupbus", "startups", - "starwberry", "strawberry", - "statememts", "statements", - "statictics", "statistics", - "stationair", "stationary", - "statisitcs", "statistics", - "statistcal", "statistical", - "statistisk", "statistics", - "stauration", "saturation", - "stealthboy", "stealthy", - "stealthely", "stealthy", - "stealthify", "stealthy", - "stealthray", "stealthy", - "steeleries", "steelers", - "stereotipe", "stereotype", - "stereotpye", "stereotypes", - "steriotype", "stereotype", - "steroetype", "stereotype", - "sterotypes", "stereotypes", - "steryotype", "stereotype", - "stimilants", "stimulants", - "stimilated", "stimulated", - "stimualted", "stimulated", - "stimulatie", "stimulated", - "stimulatin", "stimulation", - "stimulaton", "stimulation", - "stimulents", "stimulants", - "stomrfront", "stormfront", - "storelines", "storylines", - "stormfornt", "stormfront", - "stormfromt", "stormfront", - "stornfront", "stormfront", - "stornghold", "stronghold", - "stradegies", "strategies", - "strageties", "strategies", - "straighted", "straightened", - "straightie", "straighten", - "straightin", "straighten", - "straigthen", "straighten", - "stranglove", "strangle", - "strangreal", "strangle", - "stratagies", "strategies", - "strategems", "strategies", - "strategice", "strategies", - "strategisk", "strategies", - "stravation", "starvation", - "strawbarry", "strawberry", - "strawbeary", "strawberry", - "strawbeery", "strawberry", - "strawbrary", "strawberry", - "strawburry", "strawberry", - "streaching", "stretching", - "streamtrue", "streamer", - "strechting", "stretching", - "strecthing", "stretching", - "stregnthen", "strengthen", - "streichung", "stretching", - "strenghten", "strengthen", - "strengsten", "strengthen", - "strengthes", "strengths", - "strengthin", "strengthen", - "stressende", "stressed", - "striaghten", "straighten", - "stromfront", "stormfront", - "stronkhold", "stronghold", - "stroylines", "storylines", - "structered", "structured", - "structrual", "structural", - "structurel", "structural", - "strucutral", "structural", - "strucutred", "structured", - "strucutres", "structures", - "strugglign", "struggling", - "strwaberry", "strawberry", - "sttutering", "stuttering", - "stupidfree", "stupider", - "stupiditiy", "stupidity", - "sturctural", "structural", - "sturctures", "structures", - "sturggling", "struggling", - "subarmines", "submarines", - "subcultuur", "subculture", - "subesquent", "subsequent", - "subisdized", "subsidized", - "subjectief", "subjective", - "subjectifs", "subjects", - "subjectivy", "subjectively", - "subjektive", "subjective", - "submariens", "submarines", - "submarinas", "submarines", - "submergerd", "submerged", - "submerines", "submarines", - "submisison", "submissions", - "submissies", "submissive", - "submissons", "submissions", - "submittion", "submitting", - "subsadized", "subsidized", - "subscirbed", "subscribed", - "subscirber", "subscribers", - "subscribar", "subscriber", - "subscribir", "subscriber", - "subscrible", "subscriber", - "subscriped", "subscribed", - "subscrubed", "subscribed", - "subscryber", "subscriber", - "subsedized", "subsidized", - "subsequant", "subsequent", - "subsidezed", "subsidized", - "subsidiced", "subsidized", - "subsidizng", "subsidizing", - "subsiduary", "subsidiary", - "subsiquent", "subsequent", - "subsittute", "substitutes", - "subsizided", "subsidized", - "subsrcibed", "subscribed", - "substanial", "substantial", - "substansen", "substances", - "substanser", "substances", - "substanses", "substances", - "substantie", "substantive", - "substatial", "substantial", - "substences", "substances", - "substitite", "substitute", - "substittue", "substitutes", - "substitude", "substitute", - "substitued", "substitute", - "substituer", "substitute", - "substitues", "substitutes", - "substiture", "substitute", - "substituto", "substitution", - "substituts", "substitutes", - "substracts", "subtracts", - "substutite", "substitutes", - "subsudized", "subsidized", - "subtitltes", "subtitle", - "succceeded", "succeeded", - "succcesses", "successes", - "succesfuly", "successfully", - "succesions", "succession", - "successing", "succession", - "successivo", "succession", - "sucesfully", "successfully", - "sucessfull", "successful", - "sucessfuly", "successfully", - "sudnerland", "sunderland", - "sufferered", "suffered", - "sufferring", "suffering", - "sufficiant", "sufficient", - "suggestied", "suggestive", - "suggestief", "suggestive", - "suggestons", "suggests", - "sumbarines", "submarines", - "sumbissive", "submissive", - "sumbitting", "submitting", - "summerized", "summarized", - "summorized", "summarized", - "summurized", "summarized", - "sunderlona", "sunderland", - "sunderlund", "sunderland", - "sungalsses", "sunglasses", - "sunglesses", "sunglasses", - "sunglinger", "gunslinger", - "sunscreeen", "sunscreen", - "superfical", "superficial", - "superfluos", "superfluous", - "superioara", "superior", - "superioare", "superior", - "superioris", "superiors", - "superivsor", "supervisors", - "supermaket", "supermarket", - "supermarkt", "supermarket", - "superouman", "superhuman", - "superposer", "superpowers", - "superviors", "supervisors", - "superviosr", "supervisors", - "supervisar", "supervisor", - "superviser", "supervisor", - "supervisin", "supervision", - "supervison", "supervision", - "supervsior", "supervisors", - "supperssor", "suppressor", - "supplament", "supplement", - "supplemant", "supplemental", - "supplemets", "supplements", - "supportare", "supporters", - "supporteur", "supporter", - "supportied", "supported", - "supportors", "supporters", - "supposdely", "supposedly", - "supposebly", "supposedly", - "supposidly", "supposedly", - "suppresion", "suppression", - "suppresors", "suppressor", - "suppressin", "suppression", - "suppressio", "suppressor", - "suppresson", "suppression", - "suprassing", "surpassing", - "supressing", "suppressing", - "supression", "suppression", - "supsension", "suspension", - "supsicions", "suspicions", - "supsicious", "suspicious", - "surounding", "surrounding", - "surplanted", "supplanted", - "surpressed", "suppressed", - "surprizing", "surprising", - "surrenderd", "surrendered", - "surrouding", "surrounding", - "surroundes", "surrounds", - "surroundig", "surroundings", - "survivours", "survivor", - "suseptable", "susceptible", - "suseptible", "susceptible", - "suspecions", "suspicions", - "suspecious", "suspicious", - "suspencion", "suspension", - "suspendeds", "suspense", - "suspention", "suspension", - "suspicians", "suspicions", - "suspiciois", "suspicions", - "suspicioso", "suspicions", - "suspicioun", "suspicion", - "suspicison", "suspicions", - "suspiciuos", "suspicions", - "suspicsion", "suspicions", - "suspisions", "suspicions", - "suspisious", "suspicious", - "suspitions", "suspicions", - "sustainble", "sustainable", - "swaetshirt", "sweatshirt", - "swearengin", "swearing", - "swearshirt", "sweatshirt", - "sweathsirt", "sweatshirt", - "sweatshits", "sweatshirt", - "sweatshort", "sweatshirt", - "sweatshrit", "sweatshirt", - "sweerheart", "sweetheart", - "sweetshart", "sweetheart", - "switcheasy", "switches", - "switzerand", "switzerland", - "symapthize", "sympathize", - "symbolisch", "symbolic", - "symbolisim", "symbolism", - "symetrical", "symmetrical", - "sympatheic", "sympathetic", - "sympathiek", "sympathize", - "sympathien", "sympathize", - "sympathtic", "sympathetic", - "sympathyze", "sympathize", - "sympethize", "sympathize", - "symphatize", "sympathize", - "symphonity", "symphony", - "sympothize", "sympathize", - "syncronous", "synchronous", - "synomymous", "synonymous", - "synomynous", "synonymous", - "synonamous", "synonymous", - "synonimous", "synonymous", - "synonmyous", "synonymous", - "synonomous", "synonymous", - "synonumous", "synonymous", - "synonynous", "synonymous", - "sypmathize", "sympathize", - "systamatic", "systematic", - "systemetic", "systematic", - "systemisch", "systemic", - "systimatic", "systematic", - "tabelspoon", "tablespoon", - "tablespons", "tablespoons", - "tablesppon", "tablespoon", - "tacitcally", "tactically", - "taiwanesse", "taiwanese", - "taligating", "tailgating", - "tantrumers", "tantrums", - "targetting", "targeting", - "teamfigths", "teamfights", - "teamifghts", "teamfights", - "teamspeack", "teamspeak", - "techicians", "technicians", - "techincian", "technician", - "techinican", "technician", - "techinques", "techniques", - "technicain", "technician", - "technicaly", "technically", - "technicans", "technicians", - "technichan", "technician", - "technicien", "technician", - "technicion", "technician", - "technitian", "technician", - "technqiues", "techniques", - "techtician", "technician", - "tehnically", "ethnically", - "telegrapgh", "telegraph", - "teleporing", "teleporting", - "televesion", "television", - "televisivo", "television", - "temafights", "teamfights", - "temerature", "temperature", - "temperatue", "temperature", - "temperment", "temperament", - "temperture", "temperature", - "templarios", "templars", - "templarius", "templars", - "temporaily", "temporarily", - "temporarly", "temporary", - "temptating", "temptation", - "temptetion", "temptation", - "tendancies", "tendencies", - "tendencias", "tendencies", - "tendencije", "tendencies", - "tendensies", "tendencies", - "tendincies", "tendencies", - "tensionors", "tensions", - "tentacreul", "tentacle", - "termanator", "terminator", - "termendous", "tremendous", - "termiantor", "terminator", - "termigator", "terminator", - "terminales", "terminals", - "terminalis", "terminals", - "terminarla", "terminal", - "terminarlo", "terminal", - "terminaron", "terminator", - "terminater", "terminator", - "terminolgy", "terminology", - "terorrists", "terrorists", - "terrerists", "terrorists", - "terrestial", "terrestrial", - "terriblely", "terribly", - "terriories", "territories", - "territoral", "territorial", - "territores", "territories", - "territoris", "territories", - "territorry", "territory", - "terrorisim", "terrorism", - "terrorsits", "terrorists", - "terrurists", "terrorists", - "testiclees", "testicles", - "testiclies", "testicle", - "testimoney", "testimony", - "thankyooou", "thankyou", - "themselfes", "themselves", - "themsevles", "themselves", - "themsleves", "themselves", - "theocracry", "theocracy", - "theologial", "theological", - "therapetic", "therapeutic", - "therepists", "therapists", - "theripists", "therapists", - "thermastat", "thermostat", - "thermistat", "thermostat", - "thermomter", "thermometer", - "theromstat", "thermostat", - "thorttling", "throttling", - "thorughout", "throughout", - "thouroghly", "thoroughly", - "threadened", "threaded", - "threatenes", "threatens", - "threatning", "threatening", - "threshhold", "threshold", - "throthling", "throttling", - "throtlling", "throttling", - "throughiut", "throughput", - "thubmnails", "thumbnails", - "thumbmails", "thumbnails", - "thunderbot", "thunderbolt", - "thunderolt", "thunderbolt", - "tighetning", "tightening", - "tightining", "tightening", - "tigthening", "tightening", - "tjpanishad", "upanishad", - "toothbruch", "toothbrush", - "toothbruth", "toothbrush", - "toothbursh", "toothbrush", - "toothrbush", "toothbrush", - "toppingest", "toppings", - "torchilght", "torchlight", - "torchlgiht", "torchlight", - "torchligth", "torchlight", - "torhclight", "torchlight", - "torrentbig", "torrenting", - "torrenters", "torrents", - "torrentors", "torrents", - "tortillera", "tortilla", - "tortillias", "tortilla", - "tortillita", "tortilla", - "tortilllas", "tortilla", - "torunament", "tournament", - "totalitara", "totalitarian", - "touchsceen", "touchscreen", - "touchscren", "touchscreen", - "touranment", "tournaments", - "tourmanent", "tournaments", - "tournamets", "tournaments", - "tournamnet", "tournament", - "tournemant", "tournament", - "tournement", "tournament", - "toxicitity", "toxicity", - "trafficing", "trafficking", - "trainwreak", "trainwreck", - "traitorise", "traitors", - "tramboline", "trampoline", - "tramploine", "trampoline", - "trampolene", "trampoline", - "tranformed", "transformed", - "tranistion", "transition", - "tranlsated", "translated", - "transalted", "translated", - "transaltes", "translates", - "transaltor", "translator", - "transation", "transition", - "transciprt", "transcripts", - "transcirpt", "transcripts", - "transcrips", "transcripts", - "transcrito", "transcript", - "transcrits", "transcripts", - "transcrpit", "transcript", - "transfered", "transferred", - "transferer", "transferred", - "transferes", "transfers", - "transferrs", "transfers", - "transferts", "transfers", - "transfomed", "transformed", - "transfored", "transformed", - "transforme", "transfer", - "transfroms", "transforms", - "transgeder", "transgender", - "transgener", "transgender", - "transicion", "transition", - "transision", "transition", - "transister", "transistor", - "transitons", "transitions", - "transitors", "transistor", - "transkript", "transcript", - "translater", "translator", - "translatin", "translations", - "translatio", "translator", - "translpant", "transplants", - "transluent", "translucent", - "transmited", "transmitted", - "transmiter", "transmitter", - "transmitor", "transistor", - "transmorgs", "transforms", - "transpalnt", "transplants", - "transphoic", "transphobic", - "transplain", "transplant", - "transplate", "transplant", - "transplats", "transplants", - "transpoder", "transported", - "transportr", "transporter", - "transsexal", "transsexual", - "transtator", "translator", - "tranzistor", "transistor", - "trasncript", "transcript", - "trasnforms", "transforms", - "trasnlated", "translated", - "trasnlator", "translator", - "trasnplant", "transplant", - "traveleres", "travelers", - "travelodge", "traveled", - "traverlers", "traverse", - "traversare", "traverse", - "traversier", "traverse", - "treasurery", "treasury", - "trememdous", "tremendous", - "tremondous", "tremendous", - "trespasing", "trespassing", - "trianwreck", "trainwreck", - "trochlight", "torchlight", - "trustworhy", "trustworthy", - "trustworty", "trustworthy", - "trustwothy", "trustworthy", - "tryannical", "tyrannical", - "tunraround", "turnaround", - "tupparware", "tupperware", - "turnapound", "turnaround", - "turthfully", "truthfully", - "tutoriales", "tutorials", - "tyrantical", "tyrannical", - "ubiqituous", "ubiquitous", - "ubiquotous", "ubiquitous", - "ubiqutious", "ubiquitous", - "ukrainains", "ukrainians", - "ukraineans", "ukrainians", - "ukrainiens", "ukrainians", - "ukraininas", "ukrainians", - "ukrianians", "ukrainians", - "ulitmately", "ultimately", - "ulterioara", "ulterior", - "ulterioare", "ulterior", - "ultimative", "ultimate", - "ultimatley", "ultimately", - "ultimatuum", "ultimatum", - "unanwsered", "unanswered", - "unasnwered", "unanswered", - "unattanded", "unattended", - "unattented", "unattended", - "unavailabe", "unavailable", - "unavailble", "unavailable", - "unavoidble", "unavoidable", - "unawnsered", "unanswered", - "unbalenced", "unbalanced", - "unballance", "unbalance", - "unbalnaced", "unbalanced", - "unbareable", "unbearable", - "unbeakable", "unbeatable", - "unbeareble", "unbearable", - "unbeatbale", "unbeatable", - "unbeateble", "unbeatable", - "unbeerable", "unbearable", - "unbeetable", "unbeatable", - "unbeknowst", "unbeknownst", - "unbreakble", "unbreakable", - "uncencored", "uncensored", - "uncensered", "uncensored", - "uncersored", "uncensored", - "uncertainy", "uncertainty", - "uncertanty", "uncertainty", - "uncesnored", "uncensored", - "uncomitted", "uncommitted", - "uncommited", "uncommitted", - "unconcious", "unconscious", - "unconscous", "unconscious", - "undebiably", "undeniably", - "undeinable", "undeniable", - "undeinably", "undeniably", - "undenaible", "undeniable", - "undenaibly", "undeniably", - "undenyable", "undeniable", - "undenyably", "undeniably", - "underbaker", "undertaker", - "undercling", "underlying", - "underfaker", "undertaker", - "undergated", "underrated", - "undergrand", "undergrad", - "undergroud", "underground", - "undergrund", "underground", - "undermimes", "undermines", - "underminde", "undermines", - "underminig", "undermining", - "underneeth", "underneath", - "underneith", "underneath", - "undernieth", "underneath", - "underpowed", "underpowered", - "underraged", "underrated", - "underraker", "undertaker", - "underrater", "undertaker", - "undersatnd", "understands", - "understadn", "understands", - "understans", "understands", - "understnad", "understands", - "understoon", "understood", - "understsnd", "understands", - "undertoker", "undertaker", - "undertsand", "understands", - "undertunes", "undertones", - "underwager", "underwater", - "underwares", "underwater", - "underwolrd", "underworld", - "underwoord", "underworld", - "underwrold", "underworld", - "underyling", "underlying", - "undesrtand", "understands", - "undoubtedy", "undoubtedly", - "undoubtely", "undoubtedly", - "undoubtley", "undoubtedly", - "uneccesary", "unnecessary", - "unecessary", "unnecessary", - "unedcuated", "uneducated", - "unedicated", "uneducated", - "unempolyed", "unemployed", - "unexplaind", "unexplained", - "unexplaned", "unexplained", - "unfamilair", "unfamiliar", - "unfamilier", "unfamiliar", - "unfinsihed", "unfinished", - "unfirendly", "unfriendly", - "unfortuate", "unfortunate", - "unfreindly", "unfriendly", - "unfriednly", "unfriendly", - "unfriently", "unfriendly", - "ungrapeful", "ungrateful", - "ungreatful", "ungrateful", - "unhealthly", "unhealthy", - "unicornios", "unicorns", - "unifnished", "unfinished", - "unihabited", "uninhabited", - "unilatreal", "unilateral", - "unimporant", "unimportant", - "unimpresed", "unimpressed", - "unimpressd", "unimpressed", - "uninsipred", "uninspired", - "uninspried", "uninspired", - "uninstaled", "uninstalled", - "uniquiness", "uniqueness", - "univercity", "university", - "univeristy", "university", - "universale", "universe", - "universaly", "universally", - "universels", "universes", - "universets", "universes", - "universite", "universities", - "universtiy", "university", - "unjustifed", "unjustified", - "unknowingy", "unknowingly", - "unknowinly", "unknowingly", - "unnecesary", "unnecessary", - "unofficail", "unofficial", - "unoffocial", "unofficial", - "unorginial", "unoriginal", - "unorignial", "unoriginal", - "unorigonal", "unoriginal", - "unplacable", "unplayable", - "unplaybale", "unplayable", - "unplayeble", "unplayable", - "unpleasent", "unpleasant", - "unpopulair", "unpopular", - "unproteced", "unprotected", - "unqiueness", "uniqueness", - "unqualifed", "unqualified", - "unrealesed", "unreleased", - "unrealible", "unreliable", - "unrealistc", "unrealistic", - "unrealitic", "unrealistic", - "unreasonal", "unreasonably", - "unrelaible", "unreliable", - "unreleated", "unreleased", - "unrelyable", "unreliable", - "unrepetant", "unrepentant", - "unrepetent", "unrepentant", - "unresponse", "unresponsive", - "unsencored", "uncensored", - "unsetlling", "unsettling", - "unsolicted", "unsolicited", - "unsubscibe", "unsubscribe", - "unsubscrbe", "unsubscribe", - "unsucesful", "unsuccessful", - "unsuprised", "unsurprised", - "unsuprized", "unsurprised", - "unviersity", "university", - "unwrittern", "unwritten", - "urkainians", "ukrainians", - "utlimately", "ultimately", - "utlrasound", "ultrasound", - "vaccinatie", "vaccinated", - "vaccineras", "vaccines", - "valentians", "valentines", - "valentiens", "valentines", - "valentimes", "valentines", - "valentinas", "valentines", - "valentinos", "valentines", - "valentones", "valentines", - "validitity", "validity", - "valnetines", "valentines", - "vandalisim", "vandalism", - "vasectomey", "vasectomy", - "vegatarian", "vegetarian", - "vegaterian", "vegetarian", - "vegeratian", "vegetarians", - "vegetairan", "vegetarians", - "vegetarain", "vegetarians", - "vegetarien", "vegetarian", - "vegetarion", "vegetarian", - "vegetatian", "vegetarian", - "vegeterian", "vegetarian", - "vegitables", "vegetables", - "vehemantly", "vehemently", - "vehemontly", "vehemently", - "veitnamese", "vietnamese", - "veiwership", "viewership", - "veiwpoints", "viewpoints", - "venezuella", "venezuela", - "verificato", "verification", - "verifyable", "verifiable", - "veritcally", "vertically", - "veritiable", "verifiable", - "vernecular", "vernacular", - "vernicular", "vernacular", - "versatiliy", "versatility", - "versatille", "versatile", - "versatilty", "versatility", - "versitlity", "versatility", - "vewiership", "viewership", - "vibratoare", "vibrator", - "vicitmized", "victimized", - "vicotrious", "victorious", - "victemized", "victimized", - "victomized", "victimized", - "victorinos", "victorious", - "victorinus", "victorious", - "victoriosa", "victorious", - "victorioso", "victorious", - "victoriuos", "victorious", - "victumized", "victimized", - "videogaems", "videogames", - "videojames", "videogames", - "vidoegames", "videogames", - "vientamese", "vietnamese", - "vietmanese", "vietnamese", - "vietnamees", "vietnamese", - "vietnamise", "vietnamese", - "viewpionts", "viewpoints", - "vigilantie", "vigilante", - "vigoruosly", "vigorously", - "vigourosly", "vigorously", - "villageois", "villages", - "vindicitve", "vindictive", - "vindictave", "vindictive", - "visibiltiy", "visibility", - "vitenamese", "vietnamese", - "vocabluary", "vocabulary", - "volatiltiy", "volatility", - "volativity", "volatility", - "volitality", "volatility", - "volleyboll", "volleyball", - "vollyeball", "volleyball", - "volonteers", "volunteers", - "volounteer", "volunteer", - "voluntairy", "voluntarily", - "voluntarly", "voluntary", - "voluntears", "volunteers", - "volunteeer", "volunteers", - "volunteerd", "volunteered", - "voluntered", "volunteered", - "vulernable", "vulnerable", - "vulnarable", "vulnerable", - "vulnerabil", "vulnerable", - "vulnurable", "vulnerable", - "vunlerable", "vulnerable", - "warrandyte", "warranty", - "warrantles", "warranties", - "warrenties", "warranties", - "washignton", "washington", - "waterlemon", "watermelon", - "watermalon", "watermelon", - "waterproff", "waterproof", - "wavelegnth", "wavelength", - "wavelenghs", "wavelength", - "wavelenght", "wavelength", - "weakensses", "weaknesses", - "weaknesess", "weaknesses", - "weathliest", "wealthiest", - "wedensdays", "wednesdays", - "wednesdsay", "wednesdays", - "wednessday", "wednesdays", - "wednsedays", "wednesdays", - "weightened", "weighted", - "welathiest", "wealthiest", - "wellignton", "wellington", - "wellingotn", "wellington", - "wendesdays", "wednesdays", - "wereabouts", "whereabouts", - "westbroook", "westbrook", - "westernese", "westerners", - "westerness", "westerners", - "westminser", "westminster", - "westminter", "westminster", - "whatosever", "whatsoever", - "whatseover", "whatsoever", - "whipsering", "whispering", - "whsipering", "whispering", - "widepsread", "widespread", - "wikileakes", "wikileaks", - "wilderniss", "wilderness", - "wildreness", "wilderness", - "willfullly", "willfully", - "winchestor", "winchester", - "windhsield", "windshield", - "windsheild", "windshield", - "windshiled", "windshield", - "wisconsion", "wisconsin", - "wishpering", "whispering", - "withdrawan", "withdrawn", - "withdrawel", "withdrawal", - "withdrawin", "withdrawn", - "withholdng", "withholding", - "withrdawal", "withdrawals", - "witnissing", "witnessing", - "wonderfull", "wonderful", - "wonderfuly", "wonderfully", - "wonderwand", "wonderland", - "worhsiping", "worshiping", - "workingest", "workings", - "workstaion", "workstation", - "workstaton", "workstation", - "worshippig", "worshipping", - "worshoping", "worshiping", - "wrestlewar", "wrestler", - "xenohpobic", "xenophobic", - "xenophibia", "xenophobia", - "xenophibic", "xenophobic", - "xenophonic", "xenophobic", - "xenophopia", "xenophobia", - "xenophopic", "xenophobic", - "xeonphobia", "xenophobia", - "xeonphobic", "xenophobic", - "yourselfes", "yourselves", - "yoursleves", "yourselves", - "zimbabwaen", "zimbabwe", - "zionistisk", "zionists", - "abandonig", "abandoning", - "abandonne", "abandonment", - "abanonded", "abandoned", - "abdomnial", "abdominal", - "abdonimal", "abdominal", - "aberation", "aberration", - "abnormaly", "abnormally", - "abodminal", "abdominal", - "abondoned", "abandoned", - "aborigene", "aborigine", - "aboslutes", "absolutes", - "abosrbing", "absorbing", - "abreviate", "abbreviate", - "abritrary", "arbitrary", - "abruptley", "abruptly", - "absailing", "abseiling", - "absloutes", "absolutes", - "absolutey", "absolutely", - "absolutly", "absolutely", - "absoultes", "absolutes", - "abstracto", "abstraction", - "absurdley", "absurdly", - "absuridty", "absurdity", - "abusrdity", "absurdity", - "academica", "academia", - "accademic", "academic", - "accalimed", "acclaimed", - "accelerar", "accelerator", - "accending", "ascending", - "accension", "accession", - "accidenty", "accidently", - "acclamied", "acclaimed", - "accliamed", "acclaimed", - "accomdate", "accommodate", - "accordeon", "accordion", - "accordian", "accordion", - "accoridng", "according", - "accountas", "accountants", - "accountat", "accountants", - "accoustic", "acoustic", - "accroding", "according", - "accuraccy", "accuracy", - "acftually", "factually", - "acheiving", "achieving", - "achieveds", "achieves", - "achillees", "achilles", - "achilleos", "achilles", - "achilleus", "achilles", - "achiveing", "achieving", - "acitvates", "activates", - "aclhemist", "alchemist", - "acomplish", "accomplish", - "acquisito", "acquisition", - "acronymes", "acronyms", - "acronymns", "acronyms", - "acsending", "ascending", - "acsension", "ascension", - "activaste", "activates", - "activatin", "activation", - "activelly", "actively", - "activisim", "activism", - "activisit", "activist", - "activites", "activities", - "actresess", "actresses", - "acusation", "causation", - "acutality", "actuality", - "adavanced", "advanced", - "adbominal", "abdominal", - "additonal", "additional", - "addoptive", "adoptive", - "addresing", "addressing", - "addtional", "additional", - "adhearing", "adhering", - "adherance", "adherence", - "adjectivs", "adjectives", - "adjustabe", "adjustable", - "administr", "administer", - "admitedly", "admittedly", - "adolecent", "adolescent", - "adovcated", "advocated", - "adovcates", "advocates", - "adquiring", "acquiring", - "adresable", "addressable", - "adressing", "addressing", - "aduiobook", "audiobook", - "advatange", "advantage", - "adventurs", "adventures", - "adveristy", "adversity", - "advertisy", "adversity", - "advisorys", "advisors", - "aeorspace", "aerospace", - "aeropsace", "aerospace", - "aerosapce", "aerospace", - "aersopace", "aerospace", - "aestethic", "aesthetic", - "aethistic", "atheistic", - "affiliato", "affiliation", - "affinitiy", "affinity", - "affirmate", "affirmative", - "affliated", "affiliated", - "africanas", "africans", - "africanos", "africans", - "aggegrate", "aggregate", - "aggresive", "aggressive", - "agnosticm", "agnosticism", - "agregates", "aggregates", - "agreggate", "aggregate", - "agrentina", "argentina", - "agression", "aggression", - "agressive", "aggressive", - "agressvie", "agressive", - "agruement", "arguement", - "agruments", "arguments", - "agurement", "arguement", - "ailenated", "alienated", - "airbourne", "airborne", - "aircrafts", "aircraft", - "airplance", "airplane", - "airrcraft", "aircraft", - "aksreddit", "askreddit", - "alcehmist", "alchemist", - "alchemsit", "alchemist", - "alchimest", "alchemist", - "alchmeist", "alchemist", - "alchoolic", "alcoholic", - "alcoholis", "alcoholics", - "alechmist", "alchemist", - "alegience", "allegiance", - "aleinated", "alienated", - "algoriths", "algorithms", - "algoritms", "algorithms", - "algorthim", "algorithm", - "algortihm", "algorithm", - "alignemnt", "alignment", - "alimunium", "aluminium", - "alingment", "alignment", - "allainces", "alliances", - "alledgely", "allegedly", - "allegence", "allegiance", - "alleivate", "alleviate", - "allievate", "alleviate", - "alliviate", "alleviate", - "allopones", "allophones", - "allthough", "although", - "almightly", "almighty", - "alocholic", "alcoholic", - "alogrithm", "algorithm", - "alphabeat", "alphabet", - "alrightey", "alrighty", - "alrightly", "alrighty", - "alrightty", "alrighty", - "alrington", "arlington", - "alrorythm", "algorithm", - "alterante", "alternate", - "alternatr", "alternator", - "althetics", "athletics", - "althought", "although", - "altruisim", "altruism", - "amateures", "amateurs", - "ambluance", "ambulance", - "ambuigity", "ambiguity", - "amendmant", "amendment", - "amercians", "americans", - "americain", "american", - "americams", "americas", - "americaps", "americas", - "americats", "americas", - "amibguity", "ambiguity", - "aminosity", "animosity", - "amrstrong", "armstrong", - "amublance", "ambulance", - "amunition", "ammunition", - "anachrist", "anarchist", - "analagous", "analogous", - "analitycs", "analytics", - "analtyics", "analytics", - "analyitcs", "analytics", - "analyseas", "analyses", - "analysees", "analyses", - "analysens", "analyses", - "analysise", "analyses", - "analystes", "analysts", - "analzying", "analyzing", - "anarchsim", "anarchism", - "anayltics", "analytics", - "anaylzing", "analyzing", - "ancedotal", "anecdotal", - "ancedotes", "anecdotes", - "ancestory", "ancestry", - "androgeny", "androgyny", - "androides", "androids", - "androidos", "androids", - "anecdotle", "anecdote", - "anecodtal", "anecdotal", - "anecodtes", "anecdotes", - "anectodal", "anecdotal", - "anectodes", "anecdotes", - "anedoctal", "anecdotal", - "anedoctes", "anecdotes", - "animostiy", "animosity", - "anitvirus", "antivirus", - "anlaytics", "analytics", - "anniversy", "anniversary", - "annointed", "anointed", - "annoucnes", "announces", - "annoyingy", "annoyingly", - "annoymous", "anonymous", - "annoynace", "annoyance", - "annyoance", "annoyance", - "anomisity", "animosity", - "anomolies", "anomalies", - "anomolous", "anomalous", - "anomynity", "anonymity", - "anomynous", "anonymous", - "anonimity", "anonymity", - "anonmyous", "anonymous", - "anonymoys", "anonymously", - "anorexiac", "anorexic", - "anorexica", "anorexia", - "anrachist", "anarchist", - "ansestors", "ancestors", - "antarctia", "antarctica", - "antennaes", "antennas", - "antiviurs", "antivirus", - "antivrius", "antivirus", - "antivuris", "antivirus", - "anwsering", "answering", - "anynomity", "anonymity", - "anynomous", "anonymous", - "aparthide", "apartheid", - "aparthied", "apartheid", - "apartmens", "apartments", - "apocalype", "apocalypse", - "apostrope", "apostrophe", - "apparenty", "apparently", - "appearane", "appearances", - "appenines", "apennines", - "apperance", "appearance", - "appetitie", "appetite", - "applaudes", "applause", - "applicato", "application", - "appreciae", "appreciates", - "apprentie", "apprentice", - "approachs", "approaches", - "apratheid", "apartheid", - "apsaragus", "asparagus", - "apsergers", "aspergers", - "aquainted", "acquainted", - "arbirtary", "arbitrary", - "arbritary", "arbitrary", - "arcehtype", "archetype", - "archetect", "architect", - "archetpye", "archetype", - "archetyps", "archetypes", - "architecs", "architects", - "archtypes", "archetypes", - "aregument", "arguement", - "areospace", "aerospace", - "argessive", "agressive", - "argeument", "arguement", - "arguabley", "arguably", - "arguablly", "arguably", - "arguement", "argument", - "arguemnet", "arguement", - "arguemnts", "arguments", - "argumeent", "arguement", - "arhtritis", "arthritis", - "aribtrary", "arbitrary", - "ariplanes", "airplanes", - "aristolte", "aristotle", - "aristotel", "aristotle", - "aritfacts", "artifacts", - "arlignton", "arlington", - "arlingotn", "arlington", - "armistace", "armistice", - "armstorng", "armstrong", - "arpatheid", "apartheid", - "arthirtis", "arthritis", - "artifcats", "artifacts", - "artifical", "artificial", - "artillary", "artillery", - "arugement", "arguement", - "arugments", "arguments", - "asapragus", "asparagus", - "asbestoes", "asbestos", - "asborbing", "absorbing", - "asburdity", "absurdity", - "ascendend", "ascended", - "ascneding", "ascending", - "ascnesion", "ascension", - "asethetic", "aesthetic", - "asnwering", "answering", - "asociated", "associated", - "assasined", "assassinated", - "assassian", "assassin", - "assassine", "assassinate", - "assasssin", "assassins", - "assaultes", "assaults", - "assembeld", "assembled", - "assembley", "assembly", - "assemblie", "assemble", - "assisnate", "assassinate", - "assistans", "assistants", - "assistsnt", "assistants", - "assmebled", "assembled", - "associato", "association", - "assoicate", "associate", - "asssasins", "assassins", - "assualted", "assaulted", - "assulated", "assaulted", - "asteorids", "asteroids", - "astericks", "asterisk", - "asteriods", "asteroids", - "astroanut", "astronaut", - "astronuat", "astronaut", - "astrounat", "astronaut", - "asuterity", "austerity", - "atempting", "attempting", - "atheltics", "athletics", - "atheneans", "athenians", - "athesitic", "atheistic", - "athetlics", "athletics", - "athiestic", "atheistic", - "athleticm", "athleticism", - "atmosphir", "atmospheric", - "atributed", "attributed", - "atributes", "attributes", - "atrifacts", "artifacts", - "atrillery", "artillery", - "atrittion", "attrition", - "attachmet", "attachments", - "attaindre", "attainder", - "attemting", "attempting", - "attemtped", "attempted", - "attendent", "attendant", - "attension", "attention", - "attirbute", "attribute", - "attirtion", "attrition", - "attmepted", "attempted", - "attractes", "attracts", - "attractin", "attraction", - "attributo", "attribution", - "attributs", "attributes", - "attritube", "attribute", - "auctionrs", "auctions", - "auidobook", "audiobook", - "auromated", "automated", - "australin", "australians", - "authroity", "authority", - "autoattak", "autoattack", - "autogrpah", "autograph", - "autonomos", "autonomous", - "auxillary", "auxiliary", - "avaialble", "available", - "availible", "available", - "avalaible", "available", - "avaliable", "available", - "averageed", "averaged", - "avialable", "available", - "awakenend", "awakened", - "awesomley", "awesomely", - "awkawrdly", "awkwardly", - "awnsering", "answering", - "bacehlors", "bachelors", - "bachelour", "bachelor", - "bachleors", "bachelors", - "bacholers", "bachelors", - "backdooor", "backdoor", - "backfeild", "backfield", - "backfiled", "backfield", - "backgroud", "background", - "backpakcs", "backpacks", - "badnwagon", "bandwagon", - "badnwidth", "bandwidth", - "balckjack", "blackjack", - "balcklist", "blacklist", - "balitmore", "baltimore", - "ballisitc", "ballistic", - "ballsitic", "ballistic", - "balsphemy", "blasphemy", - "bandiwdth", "bandwidth", - "bandwdith", "bandwidth", - "bandwidht", "bandwidth", - "bandwitdh", "bandwidth", - "bankrupcy", "bankruptcy", - "bankrupty", "bankruptcy", - "banruptcy", "bankruptcy", - "baordwalk", "boardwalk", - "barabrian", "barbarian", - "barbarain", "barbarian", - "barbarina", "barbarian", - "barcelets", "bracelets", - "barcleona", "barcelona", - "bareclona", "barcelona", - "barrackus", "barracks", - "bascially", "basically", - "bastardes", "bastards", - "bastardos", "bastards", - "bastardus", "bastards", - "bathrooom", "bathroom", - "batlimore", "baltimore", - "battailon", "battalion", - "battlaion", "battalion", - "beahviour", "behaviour", - "beauitful", "beautiful", - "beautifyl", "beautifully", - "becnhmark", "benchmark", - "becomeing", "becoming", - "becomming", "becoming", - "beehtoven", "beethoven", - "begginers", "beginners", - "beggining", "beginning", - "begininng", "beginning", - "beginnins", "beginnings", - "behaivors", "behaviors", - "behaivour", "behaviour", - "behavoirs", "behaviors", - "behavoiur", "behaviour", - "behvaiour", "behaviour", - "beleiving", "believing", - "beliveing", "believing", - "belssings", "blessings", - "bemusemnt", "bemusement", - "benchamrk", "benchmark", - "benchmars", "benchmarks", - "benedicat", "benedict", - "benedickt", "benedict", - "benghazhi", "benghazi", - "benghazzi", "benghazi", - "bergamont", "bergamot", - "berkelely", "berkeley", - "bersekrer", "berserker", - "berskerer", "berserker", - "beseiging", "besieging", - "bestialiy", "bestiality", - "beuatiful", "beautiful", - "biginning", "beginning", - "bigrading", "brigading", - "billbaord", "billboard", - "billboars", "billboards", - "binominal", "binomial", - "birgading", "brigading", - "birghtest", "brightest", - "birhtdays", "birthdays", - "bitcoints", "bitcoins", - "blackbery", "blackberry", - "blackhaws", "blackhawks", - "blackshit", "blacksmith", - "blanketts", "blankets", - "blapshemy", "blasphemy", - "blashpemy", "blasphemy", - "blaspehmy", "blasphemy", - "blasphmey", "blasphemy", - "blatanlty", "blatantly", - "blatimore", "baltimore", - "bleuberry", "blueberry", - "bleutooth", "bluetooth", - "blisteres", "blisters", - "blizzcoin", "blizzcon", - "blockchan", "blockchain", - "blockeras", "blockers", - "bloodbore", "bloodborne", - "boardband", "broadband", - "boardcast", "broadcast", - "bodyweigt", "bodyweight", - "bookamrks", "bookmarks", - "bookmakrs", "bookmarks", - "bookmarkd", "bookmarked", - "boradband", "broadband", - "boradcast", "broadcast", - "boradwalk", "boardwalk", - "bouregois", "bourgeois", - "bourgeios", "bourgeois", - "bourgoeis", "bourgeois", - "boyfirend", "boyfriend", - "boyfreind", "boyfriend", - "boyfriens", "boyfriends", - "brabarian", "barbarian", - "bracelona", "barcelona", - "braodband", "broadband", - "braodcast", "broadcast", - "brazilias", "brazilians", - "breakdows", "breakdowns", - "breserker", "berserker", - "bretheren", "brethren", - "bridaging", "brigading", - "brightern", "brighten", - "brigthest", "brightest", - "brilliany", "brilliantly", - "brithdays", "birthdays", - "broadwalk", "boardwalk", - "bruiseres", "bruisers", - "brunettte", "brunette", - "brusseles", "brussels", - "brussells", "brussels", - "brutailty", "brutality", - "brutallly", "brutally", - "buddhisim", "buddhism", - "buddihsts", "buddhists", - "buddishts", "buddhists", - "buhddists", "buddhists", - "buidlings", "buildings", - "bulidings", "buildings", - "burgunday", "burgundy", - "burgundry", "burgundy", - "burritoes", "burritos", - "burtality", "brutality", - "busineses", "business", - "businessa", "businessman", - "businesse", "businessmen", - "businesss", "businesses", - "bussiness", "business", - "buthcered", "butchered", - "butterlfy", "butterfly", - "cacausian", "caucasian", - "caclulate", "calculate", - "cacuasian", "caucasian", - "caculater", "calculator", - "cafeteira", "cafeteria", - "cafetiera", "cafeteria", - "caffeinne", "caffeine", - "calcualte", "calculate", - "californa", "california", - "caluclate", "calculate", - "calulated", "calculated", - "calulater", "calculator", - "cambirdge", "cambridge", - "cambrdige", "cambridge", - "cambrigde", "cambridge", - "camoflage", "camouflage", - "campagins", "campaigns", - "campaings", "campaigns", - "campiagns", "campaigns", - "campusers", "campuses", - "camrbidge", "cambridge", - "canadains", "canadians", - "candadate", "candidate", - "candidats", "candidates", - "cannister", "canister", - "cannoical", "canonical", - "canoncial", "canonical", - "capactior", "capacitor", - "capicator", "capacitor", - "capitalis", "capitals", - "caprenter", "carpenter", - "capsulers", "capsules", - "capsulets", "capsules", - "carachter", "character", - "cardbaord", "cardboard", - "cardborad", "cardboard", - "cardianls", "cardinals", - "cardnials", "cardinals", - "caridnals", "cardinals", - "carmalite", "carmelite", - "carnberry", "cranberry", - "carolinia", "carolina", - "carpetner", "carpenter", - "carptener", "carpenter", - "carribean", "caribbean", - "cartdrige", "cartridge", - "cartilege", "cartilage", - "cartirdge", "cartridge", - "cartrdige", "cartridge", - "cartrigde", "cartridge", - "casaulity", "causality", - "cashieres", "cashiers", - "cassawory", "cassowary", - "cassettte", "cassette", - "casuation", "causation", - "cataclsym", "cataclysm", - "cataclyms", "cataclysm", - "catacylsm", "cataclysm", - "catacyslm", "cataclysm", - "catalcysm", "cataclysm", - "catalgoue", "catalogue", - "cathderal", "cathedral", - "catherdal", "cathedral", - "cathloics", "catholics", - "cathredal", "cathedral", - "caucaisan", "caucasian", - "caucasain", "caucasian", - "causacian", "caucasian", - "causailty", "causality", - "celebirty", "celebrity", - "celebrato", "celebration", - "celebrite", "celebrities", - "celesital", "celestial", - "celestail", "celestial", - "cementary", "cemetery", - "cemetarey", "cemetery", - "cenitpede", "centipede", - "centepide", "centipede", - "centipeed", "centipede", - "centruies", "centuries", - "centuties", "centuries", - "cerebrawl", "cerebral", - "certanity", "certainty", - "certianty", "certainty", - "cesspoool", "cesspool", - "chairmain", "chairman", - "challange", "challenge", - "challengr", "challenger", - "challengs", "challenges", - "chameloen", "chameleon", - "champagen", "champagne", - "champange", "champagne", - "chandlure", "chandler", - "changable", "changeable", - "charactor", "character", - "chatedral", "cathedral", - "chatolics", "catholics", - "checkmeat", "checkmate", - "checkpoit", "checkpoints", - "chekcmate", "checkmate", - "chemestry", "chemistry", - "chemicaly", "chemically", - "chemsitry", "chemistry", - "chernboyl", "chernobyl", - "chernobly", "chernobyl", - "chernoybl", "chernobyl", - "chernyobl", "chernobyl", - "cheronbyl", "chernobyl", - "chidlfree", "childfree", - "chidlrens", "childrens", - "chihauhua", "chihuahua", - "chihuahau", "chihuahua", - "childbird", "childbirth", - "childerns", "childrens", - "childisch", "childish", - "childresn", "childrens", - "chirstian", "christian", - "chirstmas", "christmas", - "chiuhahua", "chihuahua", - "chlidfree", "childfree", - "chlidrens", "childrens", - "chocloate", "chocolate", - "chocoalte", "chocolate", - "chocolats", "chocolates", - "chocolste", "chocolates", - "cholocate", "chocolate", - "chrenobyl", "chernobyl", - "chrisitan", "christian", - "christain", "christian", - "christams", "christmas", - "chrsitian", "christian", - "chrsitmas", "christmas", - "churchers", "churches", - "cigaretts", "cigarettes", - "cigeratte", "cigarette", - "cilivians", "civilians", - "cilpboard", "clipboard", - "cilynders", "cylinders", - "circuitos", "circuits", - "ciriculum", "curriculum", - "cirticise", "criticise", - "civilains", "civilians", - "civillian", "civilian", - "classicos", "classics", - "classicus", "classics", - "classifiy", "classify", - "cleanisng", "cleansing", - "cleasning", "cleansing", - "clikcbait", "clickbait", - "clinicaly", "clinically", - "clipbaord", "clipboard", - "clitories", "clitoris", - "clitorios", "clitoris", - "clitorius", "clitoris", - "clucthing", "clutching", - "clutchign", "clutching", - "cluthcing", "clutching", - "coca cola", "coca-cola", - "cockatils", "cocktails", - "cocktials", "cocktails", - "cognizent", "cognizant", - "colateral", "collateral", - "collabore", "collaborate", - "collasped", "collapsed", - "collaspes", "collapses", - "colleauge", "colleague", - "collectes", "collects", - "collectie", "collective", - "collecton", "collection", - "collectos", "collectors", - "collegaue", "colleague", - "collegues", "colleagues", - "collisson", "collisions", - "collonade", "colonnade", - "collonies", "colonies", - "collpased", "collapsed", - "collpases", "collapses", - "colombina", "colombia", - "columbina", "columbia", - "comapnies", "companies", - "combatans", "combatants", - "combinato", "combination", - "combusion", "combustion", - "comestics", "cosmetics", - "comisions", "commissions", - "comission", "commission", - "comitting", "committing", - "commandes", "commands", - "commentar", "commentator", - "commentes", "commenters", - "commercie", "commerce", - "commision", "commission", - "commiteed", "commited", - "commiting", "committing", - "commitmet", "commitments", - "commongly", "commonly", - "communiss", "communists", - "communite", "communities", - "communits", "communist", - "communsim", "communism", - "compaines", "companies", - "compalins", "complains", - "compalint", "compliant", - "comparisn", "comparisons", - "compeltes", "completes", - "competant", "competent", - "competend", "competed", - "competion", "competition", - "competive", "competitive", - "compilant", "compliant", - "compilare", "compiler", - "compilato", "compilation", - "compitent", "competent", - "complaind", "complained", - "complaing", "complaining", - "completen", "complement", - "completey", "completely", - "completin", "completion", - "complians", "complains", - "componant", "component", - "comprable", "comparable", - "compresas", "compress", - "compreses", "compress", - "compteurs", "computers", - "comptuers", "computers", - "computato", "computation", - "comradets", "comrades", - "comsetics", "cosmetics", - "conanical", "canonical", - "conatiner", "container", - "concelaed", "concealed", - "concelaer", "concealer", - "concelear", "concealer", - "concensus", "consensus", - "conceptos", "concepts", - "conceptul", "conceptual", - "concernig", "concerning", - "concertas", "concerts", - "concevied", "conceived", - "conciders", "considers", - "concieted", "conceited", - "concieved", "conceived", - "conclusie", "conclusive", - "concsious", "conscious", - "concurret", "concurrent", - "condamned", "condemned", - "condemend", "condemned", - "condemmed", "condemned", - "condemnig", "condemning", - "condenmed", "condemned", - "condesend", "condensed", - "condesned", "condensed", - "condmened", "condemned", - "conection", "connection", - "conenctor", "connector", - "conferene", "conferences", - "confessin", "confession", - "confideny", "confidently", - "confilcts", "conflicts", - "confimred", "confirmed", - "confirmas", "confirms", - "conflcits", "conflicts", - "confrimed", "confirmed", - "congitive", "cognitive", - "conlcuded", "concluded", - "connectes", "connects", - "connectit", "connecticut", - "connectos", "connectors", - "conquerer", "conqueror", - "consdider", "consider", - "consensul", "consensual", - "conserned", "concerned", - "consicous", "conscious", - "considerd", "considered", - "considert", "considerate", - "consisent", "consistent", - "consistes", "consists", - "consolato", "consolation", - "consolide", "consolidate", - "consonent", "consonant", - "constanly", "constantly", - "constanst", "constants", - "constanty", "constantly", - "constasnt", "constants", - "constitue", "constitutes", - "constrait", "constraints", - "construcs", "constructs", - "construde", "construed", - "construst", "constructs", - "constured", "construed", - "consulant", "consultant", - "consultat", "consultant", - "consumate", "consummate", - "contactes", "contacts", - "contactos", "contacts", - "contagios", "contagious", - "containes", "contains", - "containig", "containing", - "containts", "contains", - "contemple", "contemplate", - "contendor", "contender", - "contentas", "contents", - "contentes", "contents", - "contentos", "contents", - "contestas", "contests", - "contestat", "contestants", - "contestes", "contests", - "contextes", "contexts", - "contextos", "contexts", - "contianer", "container", - "contibute", "contribute", - "contigent", "contingent", - "continant", "continental", - "continens", "continents", - "continous", "continuous", - "continuos", "continuous", - "continute", "continue", - "contiunal", "continual", - "contracto", "contraction", - "contribue", "contribute", - "contribuo", "contributor", - "controlas", "controls", - "controled", "controlled", - "controles", "controls", - "controlls", "controls", - "convenant", "covenant", - "convencen", "convenience", - "conveniet", "convenient", - "conversie", "converse", - "conversin", "conversions", - "convertie", "convertible", - "convertis", "converts", - "cooldwons", "cooldowns", - "coordinar", "coordinator", - "copenhagn", "copenhagen", - "coprorate", "corporate", - "copywrite", "copyright", - "corcodile", "crocodile", - "corparate", "corporate", - "corproate", "corporate", - "correclty", "correctly", - "correctin", "correction", - "correlato", "correlation", - "corridoor", "corridor", - "corruptin", "corruption", - "corssfire", "crossfire", - "corsshair", "crosshair", - "corsspost", "crosspost", - "coruching", "crouching", - "cosemtics", "cosmetics", - "costumise", "costumes", - "counciles", "councils", - "councills", "councils", - "councilos", "councils", - "countains", "contains", - "counteres", "counters", - "countires", "countries", - "courching", "crouching", - "courtesey", "courtesy", - "courtesty", "courtesy", - "coururier", "courier", - "coutnered", "countered", - "crapenter", "carpenter", - "creativey", "creatively", - "creedence", "credence", - "crhistmas", "christmas", - "cricketts", "crickets", - "criminaly", "criminally", - "critereon", "criterion", - "criterias", "criteria", - "criticaly", "critically", - "criticies", "criticise", - "criticisn", "criticising", - "critisice", "criticise", - "critisicm", "criticism", - "critising", "criticising", - "critisism", "criticism", - "critisize", "criticise", - "critizing", "criticizing", - "crosshiar", "crosshair", - "crossifre", "crossfire", - "crticised", "criticised", - "crusdaers", "crusaders", - "crutchers", "crutches", - "crystalls", "crystals", - "crystalus", "crystals", - "crystalys", "crystals", - "cuacasian", "caucasian", - "cuasality", "causality", - "culitvate", "cultivate", - "culturaly", "culturally", - "culturels", "cultures", - "curiostiy", "curiosity", - "curisoity", "curiosity", - "currenlty", "currently", - "curriculm", "curriculum", - "cursaders", "crusaders", - "custcenes", "cutscenes", - "cutsceens", "cutscenes", - "cutscence", "cutscene", - "cutsences", "cutscenes", - "cyclinder", "cylinder", - "cyclistes", "cyclists", - "cylindres", "cylinders", - "cynicisim", "cynicism", - "dahsboard", "dashboard", - "dalmation", "dalmatian", - "dangeroys", "dangerously", - "dashbaord", "dashboard", - "daugthers", "daughters", - "davantage", "advantage", - "deadlfits", "deadlifts", - "deadpoool", "deadpool", - "dealershp", "dealerships", - "deathmath", "deathmatch", - "decalring", "declaring", - "decendant", "descendant", - "decendent", "descendant", - "decipting", "depicting", - "deciption", "depiction", - "decisivie", "decisive", - "declarase", "declares", - "declarees", "declares", - "decoratie", "decorative", - "decoratin", "decorations", - "decpetion", "deception", - "decpetive", "deceptive", - "decribing", "describing", - "decsended", "descended", - "deductibe", "deductible", - "defaintly", "defiantly", - "defaltion", "deflation", - "defanitly", "defiantly", - "defeintly", "definetly", - "defendent", "defendant", - "defensese", "defenseless", - "defianlty", "defiantly", - "deficeint", "deficient", - "deficieny", "deficiency", - "deficites", "deficits", - "definance", "defiance", - "definatey", "definately", - "definatly", "definitely", - "definetly", "definitely", - "definetyl", "definetly", - "definilty", "definitly", - "definitie", "definitive", - "definitin", "definitions", - "definitly", "definitely", - "definiton", "definition", - "definitve", "definite", - "definityl", "definitly", - "definltey", "definetly", - "defintaly", "defiantly", - "defintily", "definitly", - "defintion", "definition", - "defintley", "definetly", - "defitenly", "definetly", - "defitinly", "definitly", - "defitnaly", "defiantly", - "defitnely", "definetly", - "deflectin", "deflection", - "defnietly", "definetly", - "degeneret", "degenerate", - "degradato", "degradation", - "degradead", "degraded", - "degrassie", "degrasse", - "degrassse", "degrasse", - "deifnetly", "definetly", - "deifnitly", "definitly", - "deisgners", "designers", - "delagates", "delegates", - "delcaring", "declaring", - "delcining", "declining", - "delegatie", "delegate", - "delerious", "delirious", - "delfation", "deflation", - "deliveres", "delivers", - "deliverys", "delivers", - "delpoying", "deploying", - "demcorats", "democrats", - "deminsion", "dimension", - "democarcy", "democracy", - "democract", "democrat", - "demonstre", "demonstrate", - "denominar", "denominator", - "dentistas", "dentists", - "dentistes", "dentists", - "deomcrats", "democrats", - "deopsited", "deposited", - "deparment", "department", - "departmet", "departments", - "depciting", "depicting", - "depcition", "depiction", - "depection", "deception", - "depedency", "dependency", - "depicitng", "depicting", - "depiciton", "depiction", - "deplyoing", "deploying", - "depoisted", "deposited", - "depolying", "deploying", - "depositas", "deposits", - "deposites", "deposits", - "depositis", "deposits", - "depositos", "deposits", - "depostied", "deposited", - "depressie", "depressive", - "depressin", "depression", - "depserate", "desperate", - "depsoited", "deposited", - "descirbes", "describes", - "descision", "decision", - "desginers", "designers", - "desgining", "designing", - "desicions", "decisions", - "designade", "designated", - "designato", "designation", - "desingage", "disengage", - "desingers", "designers", - "desinging", "designing", - "desktopos", "desktops", - "desparate", "desperate", - "desperato", "desperation", - "despoited", "deposited", - "desriable", "desirable", - "dessigned", "designed", - "destinato", "destination", - "destoryed", "destroyed", - "destoryer", "destroyer", - "destroyes", "destroys", - "destructo", "destruction", - "destryoed", "destroyed", - "destryoer", "destroyer", - "desuction", "seduction", - "detailled", "detailed", - "detatched", "detached", - "detectivs", "detectives", - "deteriate", "deteriorate", - "determing", "determining", - "determins", "determines", - "developrs", "develops", - "diabetees", "diabetes", - "diablical", "diabolical", - "diagonaal", "diagonal", - "diagonsed", "diagnosed", - "diagonsis", "diagnosis", - "diagramas", "diagrams", - "diagramms", "diagrams", - "dialectes", "dialects", - "dialectos", "dialects", - "diarrheoa", "diarrhea", - "diasbling", "disabling", - "dichomoty", "dichotomy", - "dicovered", "discovered", - "dictaters", "dictates", - "dictionay", "dictionary", - "difenitly", "definitly", - "diferrent", "different", - "differene", "differences", - "differens", "differences", - "differeny", "differently", - "difficuly", "difficulty", - "diffucult", "difficult", - "dificulty", "difficulty", - "diganosed", "diagnosed", - "diganosis", "diagnosis", - "dimenions", "dimensions", - "dimention", "dimension", - "dimesnion", "dimension", - "diminishs", "diminishes", - "dinasours", "dinosaurs", - "dinosuars", "dinosaurs", - "dinsoaurs", "dinosaurs", - "dionsaurs", "dinosaurs", - "diphtongs", "diphthongs", - "dipthongs", "diphthongs", - "direcotry", "directory", - "directoty", "directory", - "directroy", "directory", - "disaprity", "disparity", - "disastros", "disastrous", - "disatrous", "disastrous", - "disbaling", "disabling", - "disbeleif", "disbelief", - "disbelife", "disbelief", - "disciplen", "disciplines", - "disclamer", "disclaimer", - "disclosue", "disclosure", - "disconnet", "disconnect", - "discosure", "discourse", - "discoverd", "discovered", - "discovere", "discoveries", - "discredid", "discredited", - "discribed", "described", - "discribes", "describes", - "discussin", "discussion", - "diserable", "desirable", - "disgarees", "disagrees", - "disgiused", "disguised", - "disgusied", "disguised", - "disgustes", "disgusts", - "disgustos", "disgusts", - "disgustus", "disgusts", - "dishonesy", "dishonesty", - "dishonord", "dishonored", - "disicples", "disciples", - "dismantel", "dismantle", - "dismisals", "dismissal", - "disnegage", "disengage", - "dispairty", "disparity", - "dispalyed", "displayed", - "dispartiy", "disparity", - "dispenced", "dispensed", - "dispeners", "dispenser", - "displayes", "displays", - "disruptin", "disruption", - "dissapear", "disappear", - "dissarray", "disarray", - "dissmisal", "dismissal", - "disspiate", "dissipate", - "distincte", "distinctive", - "distrcits", "districts", - "distribue", "distributed", - "distrubed", "disturbed", - "distrupts", "distrust", - "disturben", "disturbance", - "diverisfy", "diversify", - "diveristy", "diversity", - "diverstiy", "diversity", - "dividened", "dividend", - "divinitiy", "divinity", - "doccument", "document", - "docrtines", "doctrines", - "docuhebag", "douchebag", - "dogdammit", "goddammit", - "dogfather", "godfather", - "dolphines", "dolphins", - "domecracy", "democracy", - "domecrats", "democrats", - "domiantes", "dominates", - "dominatin", "domination", - "dominaton", "domination", - "dominiant", "dominant", - "donwgrade", "downgrade", - "donwloads", "downloads", - "donwsides", "downsides", - "donwvoted", "downvoted", - "donwvotes", "downvotes", - "doublelit", "doublelift", - "doucehbag", "douchebag", - "downgarde", "downgrade", - "downlaods", "downloads", - "downloaad", "download", - "downovted", "downvoted", - "dravadian", "dravidian", - "drummless", "drumless", - "dsyphoria", "dysphoria", - "dsytopian", "dystopian", - "duaghters", "daughters", - "duplicats", "duplicates", - "durabiliy", "durability", - "dynamicus", "dynamics", - "dypshoria", "dysphoria", - "dyshporia", "dysphoria", - "dysoptian", "dystopian", - "dysphoira", "dysphoria", - "dysphroia", "dysphoria", - "dyspohria", "dysphoria", - "dyspotian", "dystopian", - "dystopain", "dystopian", - "dystpoian", "dystopian", - "eachohter", "eachother", - "eachotehr", "eachother", - "eachtoher", "eachother", - "earpluggs", "earplugs", - "earthboud", "earthbound", - "eastwoood", "eastwood", - "eastwoord", "eastwood", - "ecclectic", "eclectic", - "ecomonics", "economics", - "edficient", "deficient", - "effecient", "efficient", - "efficeint", "efficient", - "efficency", "efficiency", - "efficieny", "efficiency", - "effulence", "effluence", - "egalitara", "egalitarian", - "egpytians", "egyptians", - "egyptains", "egyptians", - "egytpians", "egyptians", - "ehtically", "ethically", - "ehtnicity", "ethnicity", - "eighteeen", "eighteen", - "eitquette", "etiquette", - "ejacualte", "ejaculate", - "electivre", "elective", - "electorns", "electrons", - "electrial", "electrical", - "electricy", "electricity", - "electroal", "electoral", - "elementay", "elementary", - "elepahnts", "elephants", - "eliminase", "eliminates", - "eliminato", "elimination", - "ellignton", "ellington", - "ellingotn", "ellington", - "eloquenty", "eloquently", - "elsehwere", "elsewhere", - "emapthize", "empathize", - "embarress", "embarrassed", - "emmisarry", "emissary", - "emmisions", "emissions", - "emmitting", "emitting", - "empahsize", "emphasize", - "emperical", "empirical", - "emphaised", "emphasised", - "emphatize", "empathize", - "emphazise", "emphasize", - "emphysyma", "emphysema", - "empitness", "emptiness", - "employeer", "employer", - "employeur", "employer", - "empolyees", "employees", - "emtpiness", "emptiness", - "emualtion", "emulation", - "enahncing", "enhancing", - "enchantig", "enchanting", - "enclousre", "enclosure", - "enclsoure", "enclosure", - "encolsure", "enclosure", - "encompase", "encompass", - "encounted", "encountered", - "encrpyted", "encrypted", - "encrytped", "encrypted", - "encyrpted", "encrypted", - "endangerd", "endangered", - "enevlopes", "envelopes", - "enforcees", "enforces", - "engagemet", "engagements", - "engagment", "engagement", - "engieneer", "engineer", - "engineeer", "engineer", - "engineerd", "engineered", - "enhacning", "enhancing", - "enhanceds", "enhances", - "enligthen", "enlighten", - "enourmous", "enormous", - "ensconsed", "ensconced", - "enthicity", "ethnicity", - "enthusiam", "enthusiasm", - "enthusiat", "enthusiast", - "entirelly", "entirely", - "entitlied", "entitled", - "enveloppe", "envelope", - "epidsodes", "episodes", - "epilepsey", "epilepsy", - "epiphanny", "epiphany", - "episonage", "espionage", - "epscially", "specially", - "epsionage", "espionage", - "eqautions", "equations", - "equialent", "equivalent", - "equivalet", "equivalents", - "ermington", "remington", - "erroenous", "erroneous", - "escalatie", "escalate", - "escalatin", "escalation", - "esitmated", "estimated", - "esitmates", "estimates", - "eslewhere", "elsewhere", - "especialy", "especially", - "espianoge", "espionage", - "espinoage", "espionage", - "espoinage", "espionage", - "esponiage", "espionage", - "espressso", "espresso", - "essencial", "essential", - "essentail", "essential", - "essentias", "essentials", - "essentual", "essential", - "essesital", "essential", - "estiamted", "estimated", - "estiamtes", "estimates", - "estimatin", "estimation", - "ethcially", "ethically", - "ethincity", "ethnicity", - "ethnicaly", "ethnically", - "ethniticy", "ethnicity", - "etmyology", "etymology", - "euclidian", "euclidean", - "euorpeans", "europeans", - "euphoriac", "euphoric", - "euphorica", "euphoria", - "europenas", "europeans", - "europians", "europeans", - "eurpoeans", "europeans", - "evangelia", "evangelical", - "evelation", "elevation", - "evenlopes", "envelopes", - "eventally", "eventually", - "eventualy", "eventually", - "everthing", "everything", - "evertyime", "everytime", - "everwhere", "everywhere", - "everyoens", "everyones", - "everyteim", "everytime", - "everytiem", "everytime", - "everyting", "everything", - "eveyrones", "everyones", - "evreyones", "everyones", - "evreytime", "everytime", - "exagerate", "exaggerate", - "exahusted", "exhausted", - "exapnsive", "expansive", - "exauhsted", "exhausted", - "excahnges", "exchanges", - "excecuted", "executed", - "excecutes", "executes", - "excellant", "excellent", - "excercise", "exercise", - "excerised", "exercised", - "excerises", "exercises", - "exceuting", "executing", - "exchnages", "exchanges", - "exclsuive", "exclusive", - "excludeds", "excludes", - "exclusivs", "exclusives", - "exclusivy", "exclusivity", - "excpetion", "exception", - "exculding", "excluding", - "exculsion", "exclusion", - "exculsive", "exclusive", - "execising", "exercising", - "execption", "exception", - "exectuing", "executing", - "exectuion", "execution", - "exectuive", "executive", - "executabe", "executable", - "exepmtion", "exemption", - "exerbated", "exacerbated", - "exercices", "exercise", - "exerciese", "exercises", - "exercizes", "exercise", - "exersices", "exercises", - "exhasuted", "exhausted", - "exhaustin", "exhaustion", - "exhibites", "exhibits", - "exhibitin", "exhibition", - "exhibtion", "exhibition", - "exhuasted", "exhausted", - "exibition", "exhibition", - "existance", "existence", - "existenta", "existential", - "existince", "existence", - "existnace", "existance", - "exlcuding", "excluding", - "exlcusion", "exclusion", - "exlcusive", "exclusive", - "exlpoding", "exploding", - "exlporers", "explorers", - "exlposion", "explosion", - "exonorate", "exonerate", - "expalined", "explained", - "expanisve", "expansive", - "expatriot", "expatriate", - "expectany", "expectancy", - "expection", "exception", - "expemtion", "exemption", - "experimet", "experiments", - "explaines", "explains", - "explainig", "explaining", - "explaning", "explaining", - "expliciet", "explicit", - "explicity", "explicitly", - "explictly", "explicitly", - "explioted", "exploited", - "explodeds", "explodes", - "exploites", "exploits", - "explorare", "explorer", - "explotied", "exploited", - "expolding", "exploding", - "expolited", "exploited", - "expolsion", "explosion", - "expolsive", "explosive", - "expressie", "expressive", - "expressin", "expression", - "exsitance", "existance", - "extention", "extension", - "exteriour", "exterior", - "extermely", "extremely", - "extermism", "extremism", - "extermist", "extremist", - "externaly", "externally", - "extractin", "extraction", - "extrapole", "extrapolate", - "extreemly", "extremely", - "extremers", "extremes", - "extremley", "extremely", - "extrotion", "extortion", - "eyeballls", "eyeballs", - "eyebrowes", "eyebrows", - "eyebrowns", "eyebrows", - "eyesahdow", "eyeshadow", - "eyeshdaow", "eyeshadow", - "eygptians", "egyptians", - "eytmology", "etymology", - "faceboook", "facebook", - "faciliate", "facilitate", - "facilites", "facilities", - "facilitiy", "facility", - "facinated", "fascinated", - "facutally", "factually", - "familiair", "familiar", - "familiare", "familiarize", - "familiary", "familiarity", - "familliar", "familiar", - "fanaticas", "fanatics", - "fanaticos", "fanatics", - "fanaticus", "fanatics", - "fanatsies", "fantasies", - "fanatsize", "fantasize", - "fandation", "foundation", - "fanservie", "fanservice", - "fantazise", "fantasize", - "farenheit", "fahrenheit", - "fascistes", "fascists", - "fashoined", "fashioned", - "favorties", "favorites", - "favoruite", "favourite", - "favourits", "favourites", - "favourtie", "favourite", - "fedreally", "federally", - "feminisim", "feminism", - "feminsits", "feminists", - "femminist", "feminist", - "fesitvals", "festivals", - "fetishers", "fetishes", - "fightings", "fighting", - "filetimes", "lifetimes", - "filiament", "filament", - "filmmakes", "filmmakers", - "fingernal", "fingernails", - "flashligt", "flashlight", - "flavorade", "flavored", - "flavoures", "flavours", - "flavourus", "flavours", - "flawlessy", "flawlessly", - "flexibily", "flexibility", - "fluctaute", "fluctuate", - "flucutate", "fluctuate", - "fluttersy", "fluttershy", - "follwoing", "following", - "foootball", "football", - "forcefuly", "forcefully", - "forcibley", "forcibly", - "forciblly", "forcibly", - "forearmes", "forearms", - "foreginer", "foreigner", - "foregroud", "foreground", - "foreinger", "foreigner", - "forgeiner", "foreigner", - "forgiener", "foreigner", - "forgivens", "forgiveness", - "foriegner", "foreigner", - "forigener", "foreigner", - "formerlly", "formerly", - "formualte", "formulate", - "formulaes", "formulas", - "formulars", "formulas", - "forntline", "frontline", - "forntpage", "frontpage", - "fortuante", "fortunate", - "forumlate", "formulate", - "foundatin", "foundations", - "fourteeen", "fourteen", - "fractales", "fractals", - "fractalis", "fractals", - "fractalus", "fractals", - "fragement", "fragment", - "fragmenot", "fragment", - "franchies", "franchise", - "francsico", "francisco", - "franscico", "francisco", - "frecklers", "freckles", - "freedomes", "freedoms", - "freestlye", "freestyle", - "freesytle", "freestyle", - "fremented", "fermented", - "freqeuncy", "frequency", - "frequence", "frequencies", - "friendlis", "friendlies", - "frightend", "frightened", - "fromation", "formation", - "frontapge", "frontpage", - "frontilne", "frontline", - "frustrato", "frustration", - "frustrats", "frustrates", - "fucntions", "functions", - "fullscren", "fullscreen", - "funcitons", "functions", - "functiong", "functioning", - "functtion", "function", - "furiosuly", "furiously", - "furiuosly", "furiously", - "futuristc", "futuristic", - "gagnsters", "gangsters", - "galations", "galatians", - "galdiator", "gladiator", - "gallaxies", "galaxies", - "garanteed", "guaranteed", - "garantees", "guarantees", - "garuantee", "guarantee", - "gatherins", "gatherings", - "gauntelts", "gauntlets", - "gauntlent", "gauntlet", - "gaurantee", "guarantee", - "gaurentee", "guarantee", - "genatilia", "genitalia", - "geneology", "genealogy", - "generalbs", "generals", - "generalis", "generals", - "generaste", "generates", - "generatie", "generate", - "generatin", "generations", - "generatos", "generators", - "genitaila", "genitalia", - "genitales", "genitals", - "genitalis", "genitals", - "geniunely", "genuinely", - "gentailia", "genitalia", - "gentelmen", "gentlemen", - "gentialia", "genitalia", - "genuienly", "genuinely", - "genuinley", "genuinely", - "geogrpahy", "geography", - "germaniac", "germanic", - "geurrilla", "guerrilla", - "gimmickey", "gimmicky", - "gimmickly", "gimmicky", - "girlfried", "girlfriend", - "goalkeepr", "goalkeeper", - "godafther", "godfather", - "godspeeed", "godspeed", - "goegraphy", "geography", - "goldfisch", "goldfish", - "goosebums", "goosebumps", - "gorvement", "goverment", - "govemrent", "goverment", - "govenment", "government", - "goverance", "governance", - "goveremnt", "goverment", - "goverment", "government", - "govermetn", "goverment", - "govermnet", "goverment", - "governmet", "governments", - "govorment", "government", - "govrement", "goverment", - "gracefull", "graceful", - "gracefuly", "gracefully", - "graduaste", "graduates", - "graduatin", "graduation", - "grahpical", "graphical", - "grativate", "gravitate", - "graudally", "gradually", - "graudates", "graduates", - "greenalnd", "greenland", - "grenaders", "grenades", - "grpahical", "graphical", - "guadulupe", "guadalupe", - "guaranted", "guaranteed", - "guarantes", "guarantees", - "guardains", "guardians", - "guarentee", "guarantee", - "guaridans", "guardians", - "guatamala", "guatemala", - "guerrilas", "guerrillas", - "guradians", "guardians", - "guranteed", "guaranteed", - "gurantees", "guarantees", - "gutiarist", "guitarist", - "habsbourg", "habsburg", - "hairstlye", "hairstyle", - "hairsytle", "hairstyle", - "halarious", "hilarious", - "hambruger", "hamburger", - "hamburges", "hamburgers", - "hamphsire", "hampshire", - "hamsphire", "hampshire", - "handboook", "handbook", - "handedley", "handedly", - "handedlly", "handedly", - "handicape", "handicapped", - "hapmshire", "hampshire", - "happended", "happened", - "happenend", "happened", - "happenned", "happened", - "harasment", "harassment", - "hardenend", "hardened", - "hardwoord", "hardwood", - "haristyle", "hairstyle", - "harrasing", "harassing", - "harrassed", "harassed", - "harrasses", "harassed", - "hdinsight", "hindsight", - "headahces", "headaches", - "headhpone", "headphone", - "headshoot", "headshot", - "healither", "healthier", - "healtheir", "healthier", - "healthiet", "healthiest", - "healthire", "healthier", - "heapdhone", "headphone", - "hedgehoog", "hedgehog", - "hedgehorg", "hedgehog", - "heightend", "heightened", - "heirarchy", "hierarchy", - "herculase", "hercules", - "herculeas", "hercules", - "herculees", "hercules", - "herculeus", "hercules", - "heriarchy", "hierarchy", - "hesistant", "hesitant", - "hesistate", "hesitate", - "hesitatin", "hesitation", - "hieroglph", "hieroglyph", - "highschol", "highschool", - "hindisght", "hindsight", - "hindrence", "hindrance", - "hinduisim", "hinduism", - "hinduisum", "hinduism", - "hipsanics", "hispanics", - "hirearchy", "hierarchy", - "hirsohima", "hiroshima", - "hispancis", "hispanics", - "hitboxers", "hitboxes", - "hoepfully", "hopefully", - "holocasut", "holocaust", - "holocuast", "holocaust", - "homeonwer", "homeowner", - "homeopaty", "homeopathy", - "homewolrd", "homeworld", - "homewoner", "homeowner", - "homewrold", "homeworld", - "homogenes", "homogeneous", - "homosexul", "homosexuals", - "hopelessy", "hopelessly", - "hopsitals", "hospitals", - "horishima", "hiroshima", - "horizones", "horizons", - "horizonts", "horizons", - "horrendos", "horrendous", - "horribley", "horribly", - "horriblly", "horribly", - "horrifing", "horrifying", - "hositlity", "hostility", - "hospitaly", "hospitality", - "hosptials", "hospitals", - "hourgalss", "hourglass", - "hourlgass", "hourglass", - "househols", "households", - "humanitis", "humanities", - "humanoind", "humanoid", - "humiditiy", "humidity", - "hunagrian", "hungarian", - "hurriance", "hurricane", - "hurricans", "hurricanes", - "husbandos", "husbands", - "hydraluic", "hydraulic", - "hydropile", "hydrophile", - "hydropobe", "hydrophobe", - "hydrualic", "hydraulic", - "hyopcrite", "hypocrite", - "hypcorite", "hypocrite", - "hyperoble", "hyperbole", - "hypocracy", "hypocrisy", - "hypocrasy", "hypocrisy", - "hypocricy", "hypocrisy", - "hypocriet", "hypocrite", - "hypocrits", "hypocrites", - "hyporcite", "hypocrite", - "hypothess", "hypotheses", - "hyprocisy", "hypocrisy", - "hyprocite", "hypocrite", - "hyrdation", "hydration", - "hyrdaulic", "hydraulic", - "hysterica", "hysteria", - "hysteriia", "hysteria", - "iburpofen", "ibuprofen", - "icleandic", "icelandic", - "icongnito", "incognito", - "idealisim", "idealism", - "idealistc", "idealistic", - "identifiy", "identify", - "ideologis", "ideologies", - "ignornace", "ignorance", - "illegales", "illegals", - "illegalis", "illegals", - "illegalls", "illegals", - "illnesess", "illnesses", - "illsuions", "illusions", - "illuminai", "illuminati", - "imagenary", "imaginary", - "imaginery", "imaginary", - "imaptient", "impatient", - "imigrated", "emigrated", - "immensley", "immensely", - "immerisve", "immersive", - "immesnely", "immensely", - "immidiate", "immediate", - "immigrato", "immigration", - "immitated", "imitated", - "immitator", "imitator", - "immobilie", "immobile", - "immobille", "immobile", - "immobilze", "immobile", - "immortaly", "immortality", - "immserive", "immersive", - "impaitent", "impatient", - "imparital", "impartial", - "impedence", "impedance", - "implantes", "implants", - "implicati", "implicit", - "impliciet", "implicit", - "implicity", "implicitly", - "impliment", "implement", - "implusive", "impulsive", - "importamt", "important", - "importend", "imported", - "imporving", "improving", - "impossibe", "impossible", - "imprefect", "imperfect", - "impressin", "impressions", - "imprioned", "imprisoned", - "improbabe", "improbable", - "impulisve", "impulsive", - "impuslive", "impulsive", - "imrpoving", "improving", - "inadequet", "inadequate", - "inadquate", "inadequate", - "inaugures", "inaugurates", - "inbalance", "imbalance", - "inbeetwen", "inbetween", - "inbetween", "between", - "inbewteen", "inbetween", - "incarnato", "incarnation", - "incgonito", "incognito", - "inclinato", "inclination", - "includeds", "includes", - "incoginto", "incognito", - "incongito", "incognito", - "incorpore", "incorporate", - "incpetion", "inception", - "incredibe", "incredible", - "incrediby", "incredibly", - "inculding", "including", - "incunabla", "incunabula", - "indicaste", "indicates", - "indicatie", "indicative", - "indicence", "incidence", - "indicents", "incidents", - "indigenos", "indigenous", - "indirecty", "indirectly", - "indisious", "insidious", - "individul", "individual", - "individus", "individuals", - "indoensia", "indonesia", - "indoneisa", "indonesia", - "indutrial", "industrial", - "inersting", "inserting", - "inexpense", "inexpensive", - "infallibe", "infallible", - "inferioir", "inferior", - "inferiour", "inferior", - "infestato", "infestation", - "infiltrar", "infiltrator", - "infinitey", "infinity", - "infinitie", "infinite", - "infinitiy", "infinity", - "infinitly", "infinity", - "inflatabe", "inflatable", - "influense", "influences", - "influenta", "influential", - "informate", "informative", - "infraread", "infrared", - "ingeniuty", "ingenuity", - "ingeunity", "ingenuity", - "ingocnito", "incognito", - "ingorance", "ignorance", - "inguenity", "ingenuity", - "inhabitat", "inhabitants", - "inheirted", "inherited", - "inhertied", "inherited", - "initailly", "initially", - "initalese", "initialese", - "initaling", "initialing", - "initalise", "initialise", - "initalism", "initialism", - "initalize", "initialize", - "initalled", "initialled", - "initation", "initiation", - "initiales", "initials", - "initiatie", "initiatives", - "initiatin", "initiation", - "initiatve", "initiate", - "injustics", "injustices", - "inlcuding", "including", - "inmigrant", "immigrant", - "innoucous", "innocuous", - "innovatin", "innovations", - "innovatve", "innovate", - "inpection", "inception", - "inpending", "impending", - "inproving", "improving", - "inpsector", "inspector", - "inpsiring", "inspiring", - "inquisito", "inquisition", - "inquisitr", "inquisitor", - "inresting", "inserting", - "insanelly", "insanely", - "insepctor", "inspector", - "insidiuos", "insidious", - "insipring", "inspiring", - "insluated", "insulated", - "inspectin", "inspection", - "instabilt", "instability", - "installes", "installs", - "installus", "installs", - "instering", "inserting", - "insticnts", "instincts", - "institude", "instituted", - "instituto", "institution", - "insualted", "insulated", - "insurence", "insurance", - "insurgeny", "insurgency", - "integirty", "integrity", - "integraal", "integral", - "integrade", "integrated", - "integrato", "integration", - "intenisty", "intensity", - "intensley", "intensely", - "interacte", "interactive", - "interents", "internets", - "interesat", "interest", - "interesst", "interests", - "interewbs", "interwebs", - "interfase", "interfaces", - "interfeer", "interfere", - "interfers", "interferes", - "intergate", "integrate", - "intergity", "integrity", - "interiour", "interior", - "internest", "internets", - "interpert", "interpret", - "interprut", "interrupt", - "interrups", "interrupts", - "interstae", "interstate", - "interveen", "intervene", - "intervied", "interviewed", - "intervier", "interviewer", - "intervies", "interviews", - "intesnely", "intensely", - "intesnity", "intensity", - "intestins", "intestines", - "inticrate", "intricate", - "intimidad", "intimidated", - "intircate", "intricate", - "intiution", "intuition", - "intiutive", "intuitive", - "intorduce", "introduce", - "intorvert", "introvert", - "intracite", "intricate", - "intrduced", "introduced", - "intregity", "integrity", - "intrenets", "internets", - "intrepret", "interpret", - "intrerupt", "interrupt", - "intrewebs", "interwebs", - "intrinisc", "intrinsic", - "intrisinc", "intrinsic", - "intrisnic", "intrinsic", - "intriuged", "intrigued", - "introdued", "introduced", - "introduse", "introduces", - "introvers", "introverts", - "intruiged", "intrigued", - "intrument", "instrument", - "inutition", "intuition", - "inutitive", "intuitive", - "invaderas", "invaders", - "invalidas", "invalidates", - "inventios", "inventions", - "investige", "investigate", - "investmet", "investments", - "invincibe", "invincible", - "invloving", "involving", - "invovling", "involving", - "ipubrofen", "ibuprofen", - "iranianos", "iranians", - "irelevent", "irrelevant", - "ironicaly", "ironically", - "irritatie", "irritate", - "irritatin", "irritation", - "isalmists", "islamists", - "isalnders", "islanders", - "islamiskt", "islamist", - "islamsits", "islamists", - "islmaists", "islamists", - "isntaller", "installer", - "isntances", "instances", - "isntantly", "instantly", - "israelies", "israelis", - "israelits", "israelis", - "italianas", "italians", - "italianos", "italians", - "jailbrake", "jailbreak", - "jalibreak", "jailbreak", - "jamaicain", "jamaican", - "jersualem", "jerusalem", - "jeruselam", "jerusalem", - "jeruslaem", "jerusalem", - "journalis", "journals", - "judegment", "judgement", - "judgemant", "judgemental", - "judisuary", "judiciary", - "jugdement", "judgement", - "juggernat", "juggernaut", - "juvenille", "juvenile", - "keneysian", "keynesian", - "kentuckey", "kentucky", - "kenyesian", "keynesian", - "keybaords", "keyboards", - "keyensian", "keynesian", - "keyesnian", "keynesian", - "keynseian", "keynesian", - "keysenian", "keynesian", - "kilometes", "kilometers", - "kindapped", "kidnapped", - "kncokback", "knockback", - "knoweldge", "knowledge", - "knowlegde", "knowledge", - "konckback", "knockback", - "kryptonie", "kryptonite", - "labirynth", "labyrinth", - "laboratoy", "laboratory", - "laboreres", "laborers", - "labratory", "laboratory", - "labriynth", "labyrinth", - "labryinth", "labyrinth", - "labyrnith", "labyrinth", - "landscaps", "landscapes", - "landscspe", "landscapes", - "langauges", "languages", - "languague", "language", - "lanuchers", "launchers", - "lanugages", "languages", - "larington", "arlington", - "latitudie", "latitude", - "lattitude", "latitude", - "laucnhers", "launchers", - "laucnhing", "launching", - "launchign", "launching", - "laybrinth", "labyrinth", - "lebanesse", "lebanese", - "leceister", "leicester", - "leciester", "leicester", - "legitmate", "legitimate", - "legnedary", "legendary", - "lesbianas", "lesbians", - "lesbianus", "lesbians", - "letivicus", "leviticus", - "leutenant", "lieutenant", - "levaithan", "leviathan", - "levellign", "levelling", - "levetated", "levitated", - "levetates", "levitates", - "levicitus", "leviticus", - "levleling", "levelling", - "lfiesteal", "lifesteal", - "liberales", "liberals", - "liberalim", "liberalism", - "liberalis", "liberals", - "liberatin", "liberation", - "libraires", "libraries", - "liecester", "leicester", - "lieuenant", "lieutenant", - "lieutenat", "lieutenant", - "lifespawn", "lifespan", - "lifestlye", "lifestyle", - "lighnting", "lightning", - "lightnign", "lightning", - "ligthning", "lightning", - "ligthroom", "lightroom", - "lingerine", "lingerie", - "lispticks", "lipsticks", - "listenend", "listened", - "literarly", "literary", - "literarry", "literary", - "literatre", "literate", - "literatue", "literate", - "literture", "literature", - "lithaunia", "lithuania", - "lithuaina", "lithuania", - "lithuiana", "lithuania", - "lithunaia", "lithuania", - "litigatin", "litigation", - "lituhania", "lithuania", - "liveprool", "liverpool", - "livestrem", "livestream", - "lobbysits", "lobbyists", - "lockscren", "lockscreen", - "logisitcs", "logistics", - "logsitics", "logistics", - "loiusiana", "louisiana", - "lollipoop", "lollipop", - "louisvile", "louisville", - "luanchers", "launchers", - "luanching", "launching", - "lubicrant", "lubricant", - "lubircant", "lubricant", - "ludcrious", "ludicrous", - "ludricous", "ludicrous", - "lunaticos", "lunatics", - "lunaticus", "lunatics", - "macaronni", "macaroni", - "maestries", "masteries", - "magainzes", "magazines", - "magensium", "magnesium", - "magincian", "magician", - "magintude", "magnitude", - "magneisum", "magnesium", - "magnesuim", "magnesium", - "magnifine", "magnificent", - "mainfesto", "manifesto", - "mainfests", "manifests", - "mainstrem", "mainstream", - "maintaing", "maintaining", - "maintance", "maintenance", - "maintians", "maintains", - "mairjuana", "marijuana", - "malasyian", "malaysian", - "malayisan", "malaysian", - "malaysain", "malaysian", - "maletonin", "melatonin", - "maltesian", "maltese", - "malyasian", "malaysian", - "managable", "manageable", - "managment", "management", - "mandarian", "mandarin", - "mandarijn", "mandarin", - "mandarion", "mandarin", - "maneouvre", "manoeuvre", - "maneuveur", "maneuver", - "maneveurs", "maneuvers", - "manfiesto", "manifesto", - "manfiests", "manifests", - "mangesium", "magnesium", - "mangitude", "magnitude", - "manouvers", "maneuvers", - "mantained", "maintained", - "manuevers", "maneuvers", - "maraudeur", "marauder", - "marevlous", "marvelous", - "margarent", "margaret", - "margarite", "margaret", - "marginaal", "marginal", - "marginaly", "marginally", - "marijauna", "marijuana", - "marineras", "mariners", - "marineris", "mariners", - "marineros", "mariners", - "marjiuana", "marijuana", - "marjority", "majority", - "marmelade", "marmalade", - "marrtyred", "martyred", - "massagens", "massages", - "massivley", "massively", - "masteires", "masteries", - "mastereis", "masteries", - "masterise", "masteries", - "mastermid", "mastermind", - "mastieres", "masteries", - "masturbae", "masturbated", - "materiaal", "material", - "matierals", "materials", - "mattreses", "mattress", - "mayalsian", "malaysian", - "maylasian", "malaysian", - "mccarthey", "mccarthy", - "mecahnics", "mechanics", - "mecernary", "mercenary", - "mechancis", "mechanics", - "mechanims", "mechanism", - "mechaninc", "mechanic", - "mechansim", "mechanism", - "medicince", "medicine", - "mediciney", "mediciny", - "meditatie", "meditate", - "meditatin", "meditation", - "megathred", "megathread", - "melanotin", "melatonin", - "melborune", "melbourne", - "melbounre", "melbourne", - "membrance", "membrane", - "menstraul", "menstrual", - "menstural", "menstrual", - "mensutral", "menstrual", - "mentiones", "mentions", - "mercanery", "mercenary", - "merhcants", "merchants", - "messagers", "messages", - "messanger", "messenger", - "metabloic", "metabolic", - "metalurgy", "metallurgy", - "methaphor", "metaphor", - "methapors", "metaphors", - "methodoly", "methodology", - "metropols", "metropolis", - "mexicanas", "mexicans", - "mexicants", "mexicans", - "mexicanus", "mexicans", - "michellle", "michelle", - "micorwave", "microwave", - "micoscopy", "microscopy", - "microphen", "microphone", - "migrantes", "migrants", - "migrianes", "migraines", - "milawukee", "milwaukee", - "milennium", "millennium", - "milestons", "milestones", - "militians", "militias", - "millenial", "millennial", - "millenian", "millennia", - "millenium", "millennium", - "millionar", "millionaire", - "millitary", "military", - "miluwakee", "milwaukee", - "milwakuee", "milwaukee", - "milwuakee", "milwaukee", - "mindcarck", "mindcrack", - "mindlessy", "mindlessly", - "minerales", "minerals", - "minisclue", "miniscule", - "miniscuel", "miniscule", - "ministery", "ministry", - "minisucle", "miniscule", - "minitaure", "miniature", - "minituare", "miniature", - "minneosta", "minnesota", - "minnestoa", "minnesota", - "minsicule", "miniscule", - "minsiters", "ministers", - "minstries", "ministries", - "miraculos", "miraculous", - "mircowave", "microwave", - "mirrorred", "mirrored", - "miserabel", "miserable", - "mispelled", "misspelled", - "misreable", "miserable", - "misreably", "miserably", - "missisipi", "mississippi", - "missonary", "missionary", - "missourri", "missouri", - "misspelld", "misspelled", - "mobilitiy", "mobility", - "moderatey", "moderately", - "moderatin", "moderation", - "modifires", "modifiers", - "moelcules", "molecules", - "moleclues", "molecules", - "molestare", "molester", - "molestato", "molestation", - "molesterd", "molested", - "monestary", "monastery", - "monitores", "monitors", - "monolgoue", "monologue", - "monolight", "moonlight", - "monolouge", "monologue", - "monopolis", "monopolies", - "monopolly", "monopoly", - "monopoloy", "monopoly", - "monserrat", "montserrat", - "monstorus", "monstrous", - "monstruos", "monstrous", - "montanous", "mountainous", - "monumnets", "monuments", - "moratlity", "mortality", - "morbidley", "morbidly", - "morgatges", "mortgages", - "morgtages", "mortgages", - "morisette", "morissette", - "mormonsim", "mormonism", - "morroccan", "moroccan", - "mortailty", "mortality", - "mosquitto", "mosquito", - "motivatie", "motivate", - "motivatin", "motivations", - "motorcyce", "motorcycles", - "motorolja", "motorola", - "motoroloa", "motorola", - "moustahce", "moustache", - "movepseed", "movespeed", - "mozzarela", "mozzarella", - "mucisians", "musicians", - "mulitated", "mutilated", - "mulitples", "multiples", - "multipled", "multiplied", - "multplies", "multiples", - "murdererd", "murdered", - "muscially", "musically", - "muscician", "musician", - "musculair", "muscular", - "mushrooom", "mushroom", - "musicains", "musicians", - "mutatiohn", "mutation", - "mutialted", "mutilated", - "mutilatin", "mutilation", - "mutliated", "mutilated", - "mutliples", "multiples", - "mutlitude", "multitude", - "mysterise", "mysteries", - "mysterous", "mysterious", - "nacrotics", "narcotics", - "naferious", "nefarious", - "nahsville", "nashville", - "narcissim", "narcissism", - "narcissit", "narcissist", - "narcissts", "narcissist", - "narctoics", "narcotics", - "nasvhille", "nashville", - "nationaal", "national", - "nationaly", "nationally", - "nativelly", "natively", - "natrually", "naturally", - "navigatie", "navigate", - "navigatin", "navigation", - "neccesary", "necessary", - "necessite", "necessities", - "neckbears", "neckbeards", - "neckbread", "neckbeard", - "nedlessly", "endlessly", - "needlessy", "needlessly", - "negiotate", "negotiate", - "negociate", "negotiate", - "negoitate", "negotiate", - "neigbhour", "neighbour", - "neigbours", "neighbours", - "neighboor", "neighbor", - "nessecary", "necessary", - "newcaslte", "newcastle", - "newcastel", "newcastle", - "nieghbour", "neighbour", - "nightfa;;", "nightfall", - "nightlcub", "nightclub", - "nigthclub", "nightclub", - "nigthlife", "nightlife", - "nigthmare", "nightmare", - "nihilisim", "nihilism", - "ninteenth", "nineteenth", - "nominatie", "nominate", - "nominatin", "nomination", - "noninital", "noninitial", - "norhteast", "northeast", - "norhtwest", "northwest", - "normanday", "normandy", - "northeren", "northern", - "norwegain", "norwegian", - "norwiegan", "norwegian", - "nostaglia", "nostalgia", - "nostaglic", "nostalgic", - "nostaliga", "nostalgia", - "nostaligc", "nostalgic", - "nostlagia", "nostalgia", - "nostlagic", "nostalgic", - "nostriles", "nostrils", - "nostrills", "nostrils", - "notacible", "noticable", - "notciable", "noticable", - "noteboook", "notebook", - "noteriety", "notoriety", - "noteworty", "noteworthy", - "noticable", "noticeable", - "noticably", "noticeably", - "noticalbe", "noticable", - "noticeing", "noticing", - "noticible", "noticeable", - "notoroius", "notorious", - "novermber", "november", - "nullabour", "nullarbor", - "numberous", "numerous", - "numercial", "numerical", - "numerious", "numerous", - "nuremburg", "nuremberg", - "nurtients", "nutrients", - "nutirents", "nutrients", - "nutreints", "nutrients", - "nutritent", "nutrient", - "nutritian", "nutritional", - "nutritios", "nutritious", - "obediance", "obedience", - "obeidence", "obedience", - "obersvant", "observant", - "obersvers", "observers", - "obesssion", "obsession", - "obiedence", "obedience", - "obivously", "obviously", - "objectivs", "objectives", - "objectivy", "objectivity", - "obscruity", "obscurity", - "obscuirty", "obscurity", - "observare", "observer", - "observerd", "observed", - "obssesion", "obsession", - "obssesive", "obsessive", - "obssessed", "obsessed", - "obstruced", "obstructed", - "obsucrity", "obscurity", - "obtainabe", "obtainable", - "obviosuly", "obviously", - "obvioulsy", "obviously", - "obvisouly", "obviously", - "obvoiusly", "obviously", - "ocasional", "occasional", - "ocasioned", "occasioned", - "ocassions", "occasions", - "occaisons", "occasions", - "occassion", "occasion", - "occurance", "occurrence", - "occurence", "occurrence", - "octohedra", "octahedra", - "ocuntries", "countries", - "ocurrance", "occurrence", - "ocurrence", "occurrence", - "offcially", "officially", - "offically", "officially", - "officialy", "officially", - "offpsring", "offspring", - "offspirng", "offspring", - "offsrping", "offspring", - "ogliarchy", "oligarchy", - "oilgarchy", "oligarchy", - "oligrachy", "oligarchy", - "ommitting", "omitting", - "onlsaught", "onslaught", - "onsalught", "onslaught", - "onslaugth", "onslaught", - "onsluaght", "onslaught", - "onwership", "ownership", - "opiniones", "opinions", - "oposition", "opposition", - "opponenet", "opponent", - "opposiste", "opposites", - "opposties", "opposites", - "oppressin", "oppression", - "opression", "oppression", - "opressive", "oppressive", - "opthalmic", "ophthalmic", - "optimisim", "optimism", - "optimistc", "optimistic", - "optinally", "optimally", - "oragnered", "orangered", - "oragnised", "organised", - "oragnizer", "organizer", - "orcehstra", "orchestra", - "ordinarly", "ordinary", - "orgainsed", "organised", - "orgainzer", "organizer", - "organered", "orangered", - "organices", "organise", - "organisim", "organism", - "organiske", "organise", - "organiste", "organise", - "organites", "organise", - "organizms", "organism", - "organsied", "organised", - "organsims", "organisms", - "organzier", "organizer", - "orginally", "originally", - "orgnaised", "organised", - "orhcestra", "orchestra", - "orientato", "orientation", - "origanaly", "originally", - "originall", "original", - "originalt", "originality", - "originaly", "originally", - "origintea", "originate", - "origional", "original", - "orignally", "originally", - "orignials", "originals", - "oublisher", "publisher", - "oursleves", "ourselves", - "oustiders", "outsiders", - "oustpoken", "outspoken", - "outisders", "outsiders", - "outnumbed", "outnumbered", - "outpalyed", "outplayed", - "outperfom", "outperform", - "outpsoken", "outspoken", - "outrageos", "outrageous", - "outskirst", "outskirts", - "outskrits", "outskirts", - "outwieghs", "outweighs", - "overbaord", "overboard", - "overclcok", "overclock", - "overdirve", "overdrive", - "overhpyed", "overhyped", - "overhwelm", "overwhelm", - "overlcock", "overclock", - "overloard", "overload", - "overpaied", "overpaid", - "overpowed", "overpowered", - "overriden", "overridden", - "overwhlem", "overwhelm", - "overwirte", "overwrite", - "overwtach", "overwatch", - "overyhped", "overhyped", - "owernship", "ownership", - "pacificts", "pacifist", - "packageid", "packaged", - "pactivity", "captivity", - "painkills", "painkillers", - "paitently", "patiently", - "paitience", "patience", - "pakistain", "pakistani", - "pakistian", "pakistani", - "pakistnai", "pakistani", - "paksitani", "pakistani", - "paladines", "paladins", - "paladinos", "paladins", - "palestein", "palestine", - "palestina", "palestinian", - "palistian", "palestinian", - "paltforms", "platforms", - "palystyle", "playstyle", - "pancakers", "pancakes", - "pantomine", "pantomime", - "paradimes", "paradise", - "paragraps", "paragraphs", - "paragrpah", "paragraph", - "paralells", "parallels", - "paralelly", "parallelly", - "paralisys", "paralysis", - "parallely", "parallelly", - "paralzyed", "paralyzed", - "paramedis", "paramedics", - "paramters", "parameters", - "paranoica", "paranoia", - "paranoida", "paranoia", - "parasties", "parasites", - "paraylsis", "paralysis", - "paraylzed", "paralyzed", - "parellels", "parallels", - "paricular", "particular", - "parisitic", "parasitic", - "paritally", "partially", - "parliment", "parliament", - "parmesaen", "parmesan", - "parntered", "partnered", - "parrallel", "parallel", - "partchett", "pratchett", - "parterned", "partnered", - "participe", "participate", - "partiotic", "patriotic", - "partisain", "partisan", - "pasengers", "passengers", - "passagens", "passages", - "passagers", "passages", - "passerbys", "passersby", - "passiones", "passions", - "passivley", "passively", - "passowrds", "passwords", - "pateintly", "patiently", - "paticular", "particular", - "patinetly", "patiently", - "patriarca", "patriarchal", - "patriarcy", "patriarchy", - "patriotas", "patriots", - "patriotes", "patriots", - "patroitic", "patriotic", - "pattented", "patented", - "pavillion", "pavilion", - "pbulisher", "publisher", - "peacefuly", "peacefully", - "pedohpile", "pedophile", - "pedophila", "pedophilia", - "pedophils", "pedophiles", - "peircings", "piercings", - "penalites", "penalties", - "penatlies", "penalties", - "penduluum", "pendulum", - "penerator", "penetrator", - "penguines", "penguins", - "penguings", "penguins", - "penguinos", "penguins", - "peninsual", "peninsula", - "peninusla", "peninsula", - "penisnula", "peninsula", - "penisular", "peninsular", - "pennisula", "peninsula", - "pensinula", "peninsula", - "pentagoon", "pentagon", - "peodphile", "pedophile", - "pepperino", "pepperoni", - "peppermit", "peppermint", - "percepted", "perceived", - "percevied", "perceived", - "percieved", "perceived", - "percisely", "precisely", - "percision", "precision", - "percursor", "precursor", - "perdators", "predators", - "peremiter", "perimeter", - "perfeclty", "perfectly", - "perfomers", "performers", - "performas", "performs", - "perfromer", "performer", - "pericings", "piercings", - "perimetre", "perimeter", - "peristent", "persistent", - "periwinke", "periwinkle", - "permanant", "permanent", - "permature", "premature", - "permenant", "permanent", - "permieter", "perimeter", - "permissie", "permissible", - "permissin", "permissions", - "permisson", "permission", - "pernament", "permanent", - "perorders", "preorders", - "perpetrar", "perpetrator", - "perpetuae", "perpetuate", - "perpetuas", "perpetuates", - "persauded", "persuaded", - "perscribe", "prescribe", - "perserved", "preserved", - "persistes", "persists", - "personaes", "personas", - "personaly", "personally", - "personell", "personnel", - "personhod", "personhood", - "persuated", "persuade", - "pertended", "pretended", - "pertoleum", "petroleum", - "perusaded", "persuaded", - "pervertes", "perverse", - "pesticids", "pesticides", - "petroluem", "petroleum", - "phemonena", "phenomena", - "phenemona", "phenomena", - "phenonema", "phenomena", - "phillipse", "phillies", - "philosopy", "philosophy", - "philosphy", "philosophy", - "phonecian", "phoenecian", - "phonemena", "phenomena", - "phongraph", "phonograph", - "photograh", "photograph", - "phsyician", "physician", - "phsyicist", "physicist", - "phycisian", "physician", - "phycisist", "physicist", - "physicaly", "physically", - "physicits", "physicist", - "physisict", "physicist", - "piblisher", "publisher", - "picthfork", "pitchfork", - "pinetrest", "pinterest", - "placeheld", "placeholder", - "placemens", "placements", - "plaestine", "palestine", - "plagarism", "plagiarism", - "planatery", "planetary", - "planation", "plantation", - "planteary", "planetary", - "plasticas", "plastics", - "plasticos", "plastics", - "plasticus", "plastics", - "platfroms", "platforms", - "platofrms", "platforms", - "plausable", "plausible", - "plausbile", "plausible", - "plausibel", "plausible", - "playgroud", "playground", - "playright", "playwright", - "playstlye", "playstyle", - "playwrite", "playwright", - "plebicite", "plebiscite", - "plethoria", "plethora", - "ploarized", "polarized", - "pointeres", "pointers", - "polinator", "pollinator", - "polishees", "polishes", - "politelly", "politely", - "politican", "politician", - "politicas", "politics", - "politicin", "politician", - "politicus", "politics", - "polygammy", "polygamy", - "populatin", "populations", - "poralized", "polarized", - "porcelian", "porcelain", - "porcelina", "porcelain", - "poreclain", "porcelain", - "porftolio", "portfolio", - "porgramme", "programme", - "portfoilo", "portfolio", - "portoflio", "portfolio", - "portraing", "portraying", - "portrayes", "portrays", - "portrayls", "portrays", - "portriats", "portraits", - "portugese", "portuguese", - "portugues", "portuguese", - "posessing", "possessing", - "posession", "possession", - "positiond", "positioned", - "positiong", "positioning", - "positionl", "positional", - "positiviy", "positivity", - "possesess", "possesses", - "possesing", "possessing", - "possesion", "possession", - "possessin", "possessions", - "possibile", "possible", - "possibily", "possibility", - "possibley", "possibly", - "possiblly", "possibly", - "possition", "position", - "powderade", "powdered", - "powerfull", "powerful", - "pracitcal", "practical", - "practhett", "pratchett", - "practicly", "practically", - "practives", "practise", - "pragamtic", "pragmatic", - "preadtors", "predators", - "precedeed", "preceded", - "preceeded", "preceded", - "preceived", "perceived", - "preciesly", "precisely", - "precisley", "precisely", - "precurors", "precursor", - "precurosr", "precursor", - "precurser", "precursor", - "predatobr", "predator", - "predictie", "predictive", - "predictin", "prediction", - "predjuice", "prejudice", - "predujice", "prejudice", - "prefectly", "perfectly", - "preferens", "preferences", - "prefering", "preferring", - "preformer", "performer", - "pregnance", "pregnancies", - "preimeter", "perimeter", - "prejiduce", "prejudice", - "prejucide", "prejudice", - "premanent", "permanent", - "premeired", "premiered", - "preorderd", "preordered", - "preparato", "preparation", - "prepatory", "preparatory", - "presentas", "presents", - "presentes", "presents", - "presicely", "precisely", - "presicion", "precision", - "presideny", "presidency", - "prestigiu", "prestigious", - "prestigue", "prestige", - "presuaded", "persuaded", - "pretendas", "pretends", - "pretensje", "pretense", - "pretinent", "pertinent", - "prevelant", "prevalent", - "preventin", "prevention", - "previvous", "previous", - "priesthod", "priesthood", - "priestood", "priesthood", - "primaires", "primaries", - "primairly", "primarily", - "primarliy", "primarily", - "primative", "primitive", - "primordal", "primordial", - "princesas", "princess", - "princeses", "princess", - "princesss", "princesses", - "principas", "principals", - "principly", "principally", - "prinicple", "principle", - "prioritie", "prioritize", - "prioritse", "priorities", - "privalege", "privilege", - "privelege", "privilege", - "privelige", "privilege", - "privilage", "privilege", - "privilegs", "privileges", - "privledge", "privilege", - "probabily", "probability", - "probablly", "probably", - "problemas", "problems", - "procative", "proactive", - "procedger", "procedure", - "proceding", "proceeding", - "proceedes", "proceeds", - "procelain", "porcelain", - "procesess", "processes", - "processer", "processor", - "processos", "processors", - "proclamed", "proclaimed", - "procotols", "protocols", - "prodecure", "procedure", - "productie", "productive", - "productin", "productions", - "productos", "products", - "profesion", "profusion", - "professer", "professor", - "professin", "professions", - "proffesed", "professed", - "proffesor", "professor", - "progessed", "progressed", - "programas", "programs", - "programem", "programme", - "programes", "programs", - "programms", "programs", - "progresso", "progression", - "progresss", "progresses", - "projectie", "projectile", - "projectin", "projection", - "prominant", "prominent", - "promiscus", "promiscuous", - "promotted", "promoted", - "pronomial", "pronominal", - "pronouced", "pronounced", - "pronounds", "pronouns", - "pronounes", "pronouns", - "propagana", "propaganda", - "properies", "properties", - "propertly", "property", - "propeties", "properties", - "prophesie", "prophecies", - "prophetes", "prophets", - "propogate", "propagate", - "proposels", "proposes", - "proposito", "proposition", - "propperly", "properly", - "propsects", "prospects", - "prosperos", "prosperous", - "prostitue", "prostitute", - "protectes", "protects", - "protectie", "protective", - "protectos", "protectors", - "proteinas", "proteins", - "proteines", "proteins", - "protestas", "protests", - "protestat", "protestant", - "protestes", "protests", - "protestos", "protests", - "protfolio", "portfolio", - "protocool", "protocol", - "prototpye", "prototype", - "prototyps", "prototypes", - "protraits", "portraits", - "protrayal", "portrayal", - "protrayed", "portrayed", - "provicial", "provincial", - "provincie", "province", - "provisios", "provisions", - "pruchased", "purchased", - "pruchases", "purchases", - "prugatory", "purgatory", - "pruposely", "purposely", - "pscyhotic", "psychotic", - "pseudonyn", "pseudonym", - "pshycosis", "psychosis", - "pshycotic", "psychotic", - "psycology", "psychology", - "psycothic", "psychotic", - "ptichfork", "pitchfork", - "pubilsher", "publisher", - "publiaher", "publisher", - "publicaly", "publicly", - "publicani", "publication", - "publicher", "publisher", - "publiclly", "publicly", - "publihser", "publisher", - "publisehr", "publisher", - "publisger", "publisher", - "publishor", "publisher", - "publishre", "publisher", - "publsiher", "publisher", - "publusher", "publisher", - "puchasing", "purchasing", - "punishmet", "punishments", - "puplisher", "publisher", - "puragtory", "purgatory", - "purcahsed", "purchased", - "purcahses", "purchases", - "purhcased", "purchased", - "purposley", "purposely", - "pursuaded", "persuaded", - "pursuades", "persuades", - "pyramidas", "pyramids", - "pyramides", "pyramids", - "pyschosis", "psychosis", - "pyschotic", "psychotic", - "qaulifies", "qualifies", - "quantifiy", "quantify", - "quantitiy", "quantity", - "quantitty", "quantity", - "quartlery", "quarterly", - "queations", "equations", - "queenland", "queensland", - "questiond", "questioned", - "questiong", "questioning", - "questionn", "questioning", - "radicalis", "radicals", - "rapsberry", "raspberry", - "rasbperry", "raspberry", - "rationaly", "rationally", - "reactiony", "reactionary", - "realisitc", "realistic", - "realoding", "reloading", - "realsitic", "realistic", - "realtable", "relatable", - "realtions", "relations", - "realtives", "relatives", - "reamining", "remaining", - "reaplying", "replaying", - "reasearch", "research", - "reaveling", "revealing", - "rebellios", "rebellious", - "rebllions", "rebellions", - "recations", "creations", - "reccomend", "recommend", - "reccuring", "recurring", - "receeding", "receding", - "recepient", "recipient", - "recgonise", "recognise", - "recgonize", "recognize", - "recidents", "residents", - "recievers", "receivers", - "recieving", "receiving", - "recipiant", "recipient", - "reciproce", "reciprocate", - "reclutant", "reluctant", - "recoginse", "recognise", - "recoginze", "recognize", - "recomends", "recommends", - "recommens", "recommends", - "reconenct", "reconnect", - "recongise", "recognise", - "recongize", "recognize", - "reconicle", "reconcile", - "reconized", "recognized", - "recordare", "recorder", - "recoveres", "recovers", - "recoverys", "recovers", - "recpetive", "receptive", - "recpetors", "receptors", - "recquired", "required", - "recreatie", "recreate", - "recruitcs", "recruits", - "recruites", "recruits", - "recrusion", "recursion", - "recrutied", "recruited", - "recrutier", "recruiter", - "rectangel", "rectangle", - "rectanlge", "rectangle", - "recuiting", "recruiting", - "recurison", "recursion", - "recurited", "recruited", - "recuriter", "recruiter", - "recusrion", "recursion", - "redeemeed", "redeemed", - "redundany", "redundancy", - "redundent", "redundant", - "reedeming", "redeeming", - "refelcted", "reflected", - "refereces", "references", - "refereees", "referees", - "refereers", "referees", - "referemce", "reference", - "referencs", "references", - "referense", "references", - "referiang", "referring", - "referinng", "refering", - "refernces", "references", - "refernece", "reference", - "refershed", "refreshed", - "refersher", "refresher", - "reffering", "referring", - "reflectie", "reflective", - "refrehser", "refresher", - "refrences", "references", - "refromist", "reformist", - "regionaal", "regional", - "registerd", "registered", - "registery", "registry", - "regualrly", "regularly", - "regualtor", "regulator", - "regulaion", "regulation", - "regulalry", "regularly", - "regulares", "regulars", - "regularis", "regulars", - "regulatin", "regulations", - "regurally", "regularly", - "reigining", "reigning", - "reinstale", "reinstalled", - "reisntall", "reinstall", - "reknowned", "renowned", - "relaoding", "reloading", - "relatiate", "retaliate", - "relativiy", "relativity", - "relativly", "relatively", - "relativno", "relation", - "relavence", "relevance", - "relcutant", "reluctant", - "relevence", "relevance", - "relfected", "reflected", - "reliabily", "reliability", - "reliabley", "reliably", - "religeous", "religious", - "remasterd", "remastered", - "rememberd", "remembered", - "rememebrs", "remembers", - "remianing", "remaining", - "remignton", "remington", - "remingotn", "remington", - "remmebers", "remembers", - "remotelly", "remotely", - "rendevous", "rendezvous", - "rendezous", "rendezvous", - "renedered", "rende", - "renegated", "renegade", - "rennovate", "renovate", - "repalying", "replaying", - "repblican", "republican", - "repeatedy", "repeatedly", - "repective", "receptive", - "repeition", "repetition", - "repentent", "repentant", - "rephrasse", "rephrase", - "replusive", "repulsive", - "reportedy", "reportedly", - "represend", "represented", - "repressin", "repression", - "reprtoire", "repertoire", - "repsonded", "responded", - "reptition", "repetition", - "reptuable", "reputable", - "repubican", "republican", - "republian", "republican", - "repulican", "republican", - "repulisve", "repulsive", - "repuslive", "repulsive", - "resaurant", "restaurant", - "researchs", "researchers", - "resembels", "resembles", - "reserverd", "reserved", - "resintall", "reinstall", - "resistane", "resistances", - "resistans", "resistances", - "resistend", "resisted", - "resistent", "resistant", - "resmebles", "resembles", - "resolutin", "resolutions", - "resoruces", "resources", - "respectes", "respects", - "respectos", "respects", - "responces", "response", - "respondas", "responds", - "respondis", "responds", - "respondus", "responds", - "respoting", "reposting", - "ressemble", "resemble", - "ressurect", "resurrect", - "restarant", "restaurant", - "resticted", "restricted", - "restircts", "restricts", - "restorani", "restoration", - "restraind", "restrained", - "restraing", "restraining", - "restraunt", "restraint", - "restriant", "restraint", - "restricte", "restrictive", - "resturant", "restaurant", - "retailate", "retaliate", - "retalaite", "retaliate", - "retaliers", "retailers", - "reteriver", "retriever", - "retirever", "retriever", - "retrevier", "retriever", - "reuptable", "reputable", - "reveiwers", "reviewers", - "revelaing", "revealing", - "revelance", "relevance", - "revolutin", "revolutions", - "rewachted", "rewatched", - "rewatchig", "rewatching", - "rferences", "references", - "ridiculos", "ridiculous", - "ridiculue", "ridicule", - "ridiculus", "ridiculous", - "righetous", "righteous", - "rightfuly", "rightfully", - "rightoues", "righteous", - "rigourous", "rigorous", - "rigtheous", "righteous", - "rilvaries", "rivalries", - "rininging", "ringing", - "rivarlies", "rivalries", - "rivlaries", "rivalries", - "roaylties", "royalties", - "roboticus", "robotics", - "roganisms", "organisms", - "royalites", "royalties", - "roylaties", "royalties", - "ruleboook", "rulebook", - "sacarstic", "sarcastic", - "sacntuary", "sanctuary", - "sacrafice", "sacrifice", - "sacrastic", "sarcastic", - "sacrifise", "sacrifices", - "salughter", "slaughter", - "samckdown", "smackdown", - "sanctiond", "sanctioned", - "sancturay", "sanctuary", - "sancutary", "sanctuary", - "sandstrom", "sandstorm", - "sandwhich", "sandwich", - "sanhedrim", "sanhedrin", - "santcuary", "sanctuary", - "santioned", "sanctioned", - "sapphirre", "sapphire", - "sastified", "satisfied", - "sastifies", "satisfies", - "satelites", "satellites", - "saterdays", "saturdays", - "satisifed", "satisfied", - "satisifes", "satisfies", - "satrudays", "saturdays", - "satsified", "satisfied", - "satsifies", "satisfies", - "sattelite", "satellite", - "saxaphone", "saxophone", - "scaepgoat", "scapegoat", - "scaleable", "scalable", - "scandales", "scandals", - "scandalos", "scandals", - "scantuary", "sanctuary", - "scaricity", "scarcity", - "scarifice", "sacrifice", - "scarmbled", "scrambled", - "scartched", "scratched", - "scartches", "scratches", - "scavanged", "scavenged", - "sceintist", "scientist", - "scholalry", "scholarly", - "sciencers", "sciences", - "scientfic", "scientific", - "scientifc", "scientific", - "scientits", "scientist", - "sclupture", "sculpture", - "scnearios", "scenarios", - "scoreboad", "scoreboard", - "scottisch", "scottish", - "scracthed", "scratched", - "scracthes", "scratches", - "scrambeld", "scrambled", - "scrathces", "scratches", - "scrollade", "scrolled", - "scrutiney", "scrutiny", - "scrutinty", "scrutiny", - "sculpteur", "sculpture", - "sculputre", "sculpture", - "scultpure", "sculpture", - "scuplture", "sculpture", - "scuptures", "sculptures", - "seamlessy", "seamlessly", - "searchign", "searching", - "sebasitan", "sebastian", - "sebastain", "sebastian", - "sebsatian", "sebastian", - "secceeded", "seceded", - "secertary", "secretary", - "secratary", "secretary", - "secratery", "secretary", - "secretery", "secretary", - "secretley", "secretly", - "sednetary", "sedentary", - "seduciton", "seduction", - "semanitcs", "semantics", - "semestres", "semesters", - "semnatics", "semantics", - "semseters", "semesters", - "senatores", "senators", - "sendetary", "sedentary", - "sensitivy", "sensitivity", - "sentimant", "sentimental", - "sepcially", "specially", - "seperated", "separated", - "seperates", "separates", - "seperator", "separator", - "septmeber", "september", - "seraching", "searching", - "seriosuly", "seriously", - "serioulsy", "seriously", - "seriuosly", "seriously", - "servantes", "servants", - "settlment", "settlement", - "sexualizd", "sexualized", - "sexuallly", "sexually", - "shadasloo", "shadaloo", - "shaprness", "sharpness", - "sharpenss", "sharpness", - "shawhsank", "shawshank", - "sheilding", "shielding", - "shephered", "shepherd", - "shileding", "shielding", - "shitstrom", "shitstorm", - "shletered", "sheltered", - "shoudlers", "shoulders", - "shouldnot", "shouldnt", - "shperical", "spherical", - "shwashank", "shawshank", - "sidebaord", "sideboard", - "siganture", "signature", - "signapore", "singapore", - "signitory", "signatory", - "silhouete", "silhouette", - "similiair", "similiar", - "simliarly", "similarly", - "simluated", "simulated", - "simluator", "simulator", - "simplifiy", "simplify", - "simualted", "simulated", - "simualtor", "simulator", - "simulatie", "simulate", - "simulatin", "simulation", - "sinagpore", "singapore", - "sincerley", "sincerely", - "singature", "signature", - "singpaore", "singapore", - "singulair", "singular", - "singulary", "singularity", - "skateboad", "skateboard", - "skeletaal", "skeletal", - "skepitcal", "skeptical", - "skepticim", "skepticism", - "sketpical", "skeptical", - "slaughted", "slaughtered", - "slaugther", "slaughter", - "slipperly", "slippery", - "sluaghter", "slaughter", - "smackdwon", "smackdown", - "smealting", "smelting", - "smeesters", "semesters", - "snadstorm", "sandstorm", - "snippetts", "snippets", - "snowfalke", "snowflake", - "snowflaek", "snowflake", - "snowlfake", "snowflake", - "snwoballs", "snowballs", - "snythesis", "synthesis", - "snythetic", "synthetic", - "socailism", "socialism", - "socailist", "socialist", - "socailize", "socialize", - "soceities", "societies", - "socialini", "socializing", - "socialiss", "socialists", - "socialsim", "socialism", - "socieites", "societies", - "socilaism", "socialism", - "socilaist", "socialist", - "sociopati", "sociopathic", - "sociopats", "sociopaths", - "socratees", "socrates", - "socrateks", "socrates", - "soemthing", "something", - "sohpomore", "sophomore", - "soliliquy", "soliloquy", - "somehting", "something", - "someoneis", "someones", - "somethign", "something", - "somethins", "somethings", - "sopohmore", "sophomore", - "sotryline", "storyline", - "soundtrak", "soundtrack", - "sountrack", "soundtrack", - "sourthern", "southern", - "souvenier", "souvenir", - "soveregin", "sovereign", - "sovereing", "sovereign", - "soveriegn", "sovereign", - "spacegoat", "scapegoat", - "spagehtti", "spaghetti", - "spahgetti", "spaghetti", - "sparlking", "sparkling", - "spartants", "spartans", - "specailly", "specially", - "specailty", "specialty", - "specality", "specialty", - "speciales", "specials", - "specialis", "specials", - "speciatly", "specialty", - "specifing", "specifying", - "specimine", "specimen", - "spectrail", "spectral", - "specualte", "speculate", - "speechers", "speeches", - "spehrical", "spherical", - "speically", "specially", - "spetember", "september", - "sphagetti", "spaghetti", - "splatooon", "splatoon", - "sponosred", "sponsored", - "sponsered", "sponsored", - "sponsores", "sponsors", - "spontanes", "spontaneous", - "sponzored", "sponsored", - "sprakling", "sparkling", - "sprinkeld", "sprinkled", - "squadroon", "squadron", - "squirrles", "squirrels", - "squirrtle", "squirrel", - "squrriels", "squirrels", - "srirachia", "sriracha", - "srirachra", "sriracha", - "stabliize", "stabilize", - "stainlees", "stainless", - "startegic", "strategic", - "startlxde", "startled", - "statisitc", "statistic", - "staurdays", "saturdays", - "steadilly", "steadily", - "stealthly", "stealthy", - "stichting", "stitching", - "sticthing", "stitching", - "stimulans", "stimulants", - "stockplie", "stockpile", - "stornegst", "strongest", - "stragetic", "strategic", - "straightn", "straighten", - "strangets", "strangest", - "strategis", "strategies", - "strawbery", "strawberry", - "streamade", "streamed", - "streamare", "streamer", - "streamear", "streamer", - "strechted", "stretched", - "strechtes", "stretches", - "strecthed", "stretched", - "strecthes", "stretches", - "stregnths", "strengths", - "strenghen", "strengthen", - "strengthn", "strengthen", - "strentghs", "strengths", - "stressade", "stressed", - "stressers", "stresses", - "strictist", "strictest", - "stringnet", "stringent", - "stroyline", "storyline", - "structual", "structural", - "structurs", "structures", - "strucutre", "structure", - "struggeld", "struggled", - "struggels", "struggles", - "stryofoam", "styrofoam", - "stuctured", "structured", - "stuggling", "struggling", - "stupitidy", "stupidity", - "sturcture", "structure", - "sturggled", "struggled", - "sturggles", "struggles", - "styrofaom", "styrofoam", - "subarmine", "submarine", - "subculter", "subculture", - "submachne", "submachine", - "subpecies", "subspecies", - "subscirbe", "subscribe", - "subsidary", "subsidiary", - "subsizide", "subsidize", - "subsquent", "subsequent", - "subsrcibe", "subscribe", - "substanse", "substances", - "substanta", "substantial", - "substante", "substantive", - "substarte", "substrate", - "substitue", "substitute", - "substract", "subtract", - "subtances", "substances", - "subtiltes", "subtitles", - "subtitels", "subtitles", - "subtletly", "subtlety", - "subtlties", "subtitles", - "succedded", "succeeded", - "succeedes", "succeeds", - "succesful", "successful", - "succesion", "succession", - "succesive", "successive", - "suceeding", "succeeding", - "sucesfuly", "successfully", - "sucessful", "successful", - "sucession", "succession", - "sucessive", "successive", - "sufferage", "suffrage", - "sufferred", "suffered", - "sufficent", "sufficient", - "suggestes", "suggests", - "suggestie", "suggestive", - "sumbarine", "submarine", - "sumberged", "submerged", - "summenors", "summoners", - "summoenrs", "summoners", - "sunderlad", "sunderland", - "sunglases", "sunglasses", - "superfluu", "superfluous", - "superiour", "superior", - "superisor", "superiors", - "supermare", "supermarket", - "superviso", "supervision", - "suposedly", "supposedly", - "supportes", "supports", - "suppreses", "suppress", - "supressed", "suppressed", - "supresses", "suppresses", - "suprising", "surprising", - "suprizing", "surprising", - "supsicion", "suspicion", - "surounded", "surrounded", - "surprized", "surprised", - "surronded", "surrounded", - "surrouded", "surrounded", - "surrouned", "surround", - "survivers", "survivors", - "survivied", "survived", - "survivour", "survivor", - "susbcribe", "subscribe", - "susbtrate", "substrate", - "susncreen", "sunscreen", - "suspectes", "suspects", - "suspendes", "suspense", - "suspensie", "suspense", - "swastikka", "swastika", - "sweatshit", "sweatshirt", - "sweetheat", "sweetheart", - "switchign", "switching", - "swithcing", "switching", - "swtiching", "switching", - "sydnicate", "syndicate", - "sykwalker", "skywalker", - "sylablles", "syllables", - "syllabels", "syllables", - "symbolsim", "symbolism", - "symettric", "symmetric", - "symmetral", "symmetric", - "symmetria", "symmetrical", - "symoblism", "symbolism", - "sympathie", "sympathize", - "symphoney", "symphony", - "symptomes", "symptoms", - "symptomps", "symptoms", - "synagouge", "synagogue", - "syndacite", "syndicate", - "syndiacte", "syndicate", - "synidcate", "syndicate", - "synonymes", "synonyms", - "synonymis", "synonyms", - "synonymns", "synonyms", - "synonymos", "synonymous", - "synonymus", "synonyms", - "synopsies", "synopsis", - "syntehsis", "synthesis", - "syntehtic", "synthetic", - "syntethic", "synthetic", - "syphyllis", "syphilis", - "syracusae", "syracuse", - "sytrofoam", "styrofoam", - "tablespon", "tablespoon", - "tacticaly", "tactically", - "tanenhill", "tannehill", - "tannheill", "tannehill", - "targetted", "targeted", - "tawainese", "taiwanese", - "tawianese", "taiwanese", - "taxanomic", "taxonomic", - "teamfighs", "teamfights", - "teamfigth", "teamfight", - "teamifght", "teamfight", - "teampseak", "teamspeak", - "teaspooon", "teaspoon", - "techician", "technician", - "techinque", "technique", - "technolgy", "technology", - "teeangers", "teenagers", - "tehtering", "tethering", - "telegrpah", "telegraph", - "televsion", "television", - "temafight", "teamfight", - "tempaltes", "templates", - "temparate", "temperate", - "templaras", "templars", - "templares", "templars", - "temporali", "temporarily", - "tenacitiy", "tenacity", - "tensiones", "tensions", - "tentacels", "tentacles", - "tentacuel", "tentacle", - "tentalces", "tentacles", - "termianls", "terminals", - "terminato", "termination", - "terorrism", "terrorism", - "terorrist", "terrorist", - "terrabyte", "terabyte", - "terribley", "terribly", - "terriblly", "terribly", - "terriroty", "territory", - "terrorits", "terrorist", - "terrorsim", "terrorism", - "tesitcles", "testicles", - "tesitmony", "testimony", - "testicels", "testicles", - "testomony", "testimony", - "texturers", "textures", - "thankfuly", "thankfully", - "thankyoou", "thankyou", - "themselfs", "themselves", - "themselvs", "themselves", - "themslves", "themselves", - "theologia", "theological", - "therafter", "thereafter", - "therefoer", "therefor", - "therefour", "therefor", - "theroists", "theorists", - "thetering", "tethering", - "thirlling", "thrilling", - "thirteeen", "thirteen", - "thoecracy", "theocracy", - "thoerists", "theorists", - "thoroughy", "thoroughly", - "thoughout", "throughout", - "threatend", "threatened", - "throrough", "thorough", - "throughly", "thoroughly", - "througout", "throughout", - "thrusdays", "thursdays", - "thurdsays", "thursdays", - "thursdsay", "thursdays", - "thursters", "thrusters", - "tiawanese", "taiwanese", - "timestmap", "timestamp", - "tirangles", "triangles", - "tocuhdown", "touchdown", - "toghether", "together", - "tolerence", "tolerance", - "tommorrow", "tomorrow", - "torandoes", "tornadoes", - "torchligt", "torchlight", - "torelable", "tolerable", - "toritllas", "tortillas", - "tornaodes", "tornadoes", - "torpeados", "torpedoes", - "torrentas", "torrents", - "torrentes", "torrents", - "tortialls", "tortillas", - "tortillia", "tortilla", - "tortillla", "tortilla", - "tottehnam", "tottenham", - "tottenahm", "tottenham", - "tottneham", "tottenham", - "toturials", "tutorials", - "touchdwon", "touchdown", - "touristas", "tourists", - "touristes", "tourists", - "touristey", "touristy", - "touristly", "touristy", - "touristsy", "touristy", - "tournamet", "tournament", - "toxicitiy", "toxicity", - "trafficed", "trafficked", - "tragicaly", "tragically", - "traileras", "trailers", - "traingles", "triangles", - "trainwrek", "trainwreck", - "traitoris", "traitors", - "traitorus", "traitors", - "tramautic", "traumatic", - "tranlsate", "translate", - "transalte", "translate", - "transcris", "transcripts", - "transcrit", "transcript", - "transferd", "transferred", - "transfere", "transferred", - "transfors", "transforms", - "transfrom", "transform", - "transiten", "transient", - "transitin", "transitions", - "transofrm", "transform", - "transplat", "transplant", - "trasnfers", "transfers", - "trasnform", "transform", - "trasnport", "transport", - "traversie", "traverse", - "travestry", "travesty", - "treasuers", "treasures", - "treasurey", "treasury", - "treatmens", "treatments", - "treausres", "treasures", - "tremendos", "tremendous", - "trhilling", "thrilling", - "trhusters", "thrusters", - "triangels", "triangles", - "trianlges", "triangles", - "tribunaal", "tribunal", - "triguered", "triggered", - "trinagles", "triangles", - "truamatic", "traumatic", - "truthfuly", "truthfully", - "tunrtable", "turntable", - "turnaroud", "turnaround", - "turntabel", "turntable", - "typcially", "typically", - "tyrranies", "tyrannies", - "ubiquitos", "ubiquitous", - "ugprading", "upgrading", - "ukrainain", "ukrainian", - "ukrainias", "ukrainians", - "ukrainina", "ukrainian", - "ukrainisn", "ukrainians", - "ukrianian", "ukrainian", - "ulitmatum", "ultimatum", - "ulteriour", "ulterior", - "umbrellla", "umbrella", - "unaminous", "unanimous", - "unanmious", "unanimous", - "unanswerd", "unanswered", - "unanymous", "unanimous", - "unbannend", "unbanned", - "uncensord", "uncensored", - "uncomited", "uncommitted", - "undercunt", "undercut", - "underdong", "underdog", - "undergard", "undergrad", - "underming", "undermining", - "understad", "understands", - "underwaer", "underwear", - "underware", "underwear", - "undescore", "underscore", - "unforseen", "unforeseen", - "unfortune", "unfortunate", - "unfriendy", "unfriendly", - "unhealhty", "unhealthy", - "unheathly", "unhealthy", - "unhelathy", "unhealthy", - "unicornis", "unicorns", - "unicornus", "unicorns", - "uniformes", "uniforms", - "uninamous", "unanimous", - "unintuive", "unintuitive", - "uniquelly", "uniquely", - "unisntall", "uninstall", - "univerity", "university", - "universse", "universes", - "univesity", "university", - "unnistall", "uninstall", - "unoffical", "unofficial", - "unopenend", "unopened", - "unplayabe", "unplayable", - "unplesant", "unpleasant", - "unpopluar", "unpopular", - "unrankend", "unranked", - "unreliabe", "unreliable", - "unrwitten", "unwritten", - "untrianed", "untrained", - "unusaully", "unusually", - "unuseable", "unusable", - "unusuable", "unusable", - "unvierses", "universes", - "unweildly", "unwieldy", - "unwieldly", "unwieldy", - "unwirtten", "unwritten", - "unworthly", "unworthy", - "upcomming", "upcoming", - "upgarding", "upgrading", - "upgradded", "upgraded", - "uplfiting", "uplifting", - "uplifitng", "uplifting", - "urkainian", "ukrainian", - "utlimatum", "ultimatum", - "vacciante", "vaccinate", - "vaccinato", "vaccination", - "vacciners", "vaccines", - "vacestomy", "vasectomy", - "vaguaries", "vagaries", - "vaibility", "viability", - "vaildated", "validated", - "vairables", "variables", - "valdiated", "validated", - "valentein", "valentine", - "valentien", "valentine", - "valentins", "valentines", - "validitiy", "validity", - "valueable", "valuable", - "vanadlism", "vandalism", - "vandalsim", "vandalism", - "varaibles", "variables", - "varations", "variations", - "variantes", "variants", - "vascetomy", "vasectomy", - "vastecomy", "vasectomy", - "veganisim", "veganism", - "vegetarin", "vegetarians", - "vegitable", "vegetable", - "vehementy", "vehemently", - "veiwpoint", "viewpoint", - "velantine", "valentine", - "vendettta", "vendetta", - "venegance", "vengeance", - "veneuzela", "venezuela", - "venezeula", "venezuela", - "venezulea", "venezuela", - "vengaence", "vengeance", - "vengenace", "vengeance", - "ventilato", "ventilation", - "verbatium", "verbatim", - "verfiying", "verifying", - "verifiyng", "verifying", - "verisions", "revisions", - "versalite", "versatile", - "versatily", "versatility", - "versiones", "versions", - "versitale", "versatile", - "verstaile", "versatile", - "verticaly", "vertically", - "veryifing", "verifying", - "vicotrian", "victorian", - "vicotries", "victories", - "victoires", "victories", - "victorain", "victorian", - "victorina", "victorian", - "victorios", "victorious", - "videogaem", "videogame", - "videogams", "videogames", - "vidoegame", "videogame", - "viewpiont", "viewpoint", - "vigilence", "vigilance", - "vigliante", "vigilante", - "vigourous", "vigorous", - "viligante", "vigilante", - "viloently", "violently", - "vincinity", "vicinity", - "vioalting", "violating", - "violentce", "violence", - "virbation", "vibration", - "virgintiy", "virginity", - "virignity", "virginity", - "virutally", "virtually", - "visibiliy", "visibility", - "vitaminas", "vitamins", - "vitamines", "vitamins", - "vitrually", "virtually", - "vociemail", "voicemail", - "voilating", "violating", - "voilation", "violation", - "voilently", "violently", - "volatiliy", "volatility", - "voleyball", "volleyball", - "volontary", "voluntary", - "volonteer", "volunteer", - "volunatry", "voluntary", - "volunteed", "volunteered", - "vriginity", "virginity", - "wallpapes", "wallpapers", - "warrantly", "warranty", - "warrriors", "warriors", - "wavelengh", "wavelength", - "weakenend", "weakened", - "weakneses", "weakness", - "weaknesss", "weaknesses", - "wealtheir", "wealthier", - "weaponary", "weaponry", - "wedensday", "wednesday", - "wednesdsy", "wednesdays", - "wednessay", "wednesdays", - "wednseday", "wednesday", - "welathier", "wealthier", - "wendesday", "wednesday", - "wesbtrook", "westbrook", - "westernes", "westerners", - "westrbook", "westbrook", - "whereever", "wherever", - "whietlist", "whitelist", - "whilrwind", "whirlwind", - "whilsting", "whistling", - "whipsered", "whispered", - "whislting", "whistling", - "whisperes", "whispers", - "whitelsit", "whitelist", - "whitleist", "whitelist", - "whitsling", "whistling", - "whrilwind", "whirlwind", - "whsipered", "whispered", - "whtielist", "whitelist", - "widespred", "widespread", - "widesread", "widespread", - "windshied", "windshield", - "wintesses", "witnesses", - "wisconisn", "wisconsin", - "wishlisht", "wishlist", - "wishpered", "whispered", - "withdrawl", "withdrawal", - "withelist", "whitelist", - "witnesess", "witnesses", - "wolrdview", "worldview", - "wolrdwide", "worldwide", - "wonderlad", "wonderland", - "wordlview", "worldview", - "wordlwide", "worldwide", - "worhtless", "worthless", - "workfroce", "workforce", - "worldivew", "worldview", - "worldveiw", "worldview", - "worstened", "worsened", - "worthelss", "worthless", - "xenbolade", "xenoblade", - "xenobalde", "xenoblade", - "xenophoby", "xenophobia", - "xeonblade", "xenoblade", - "yementite", "yemenite", - "yorkshrie", "yorkshire", - "yorskhire", "yorkshire", - "yosemitie", "yosemite", - "youngents", "youngest", - "yourselvs", "yourselves", - "zimbabwae", "zimbabwe", - "zionistas", "zionists", - "zionistes", "zionists", - "abandond", "abandoned", - "abdomine", "abdomen", - "abilitiy", "ability", - "abilties", "abilities", - "abondons", "abandons", - "aboslute", "absolute", - "abosrbed", "absorbed", - "abruplty", "abruptly", - "abrutply", "abruptly", - "abscence", "absence", - "absestos", "asbestos", - "absoluts", "absolutes", - "absolvte", "absolve", - "absorbes", "absorbs", - "absoulte", "absolute", - "abstante", "bastante", - "abudance", "abundance", - "abudcted", "abducted", - "abundunt", "abundant", - "aburptly", "abruptly", - "abuseres", "abusers", - "abusrdly", "absurdly", - "academis", "academics", - "accademy", "academy", - "acccused", "accused", - "acceptes", "accepts", - "accidens", "accidents", - "accideny", "accidently", - "accoring", "according", - "accountt", "accountant", - "accpeted", "accepted", - "accuarcy", "accuracy", - "accumule", "accumulate", - "accusato", "accusation", - "accussed", "accused", - "acedamia", "academia", - "acedemic", "academic", - "acheived", "achieved", - "acheives", "achieves", - "achieval", "achievable", - "acnedote", "anecdote", - "acording", "according", - "acornyms", "acronyms", - "acousitc", "acoustic", - "acoutsic", "acoustic", - "acovados", "avocados", - "acquifer", "acquire", - "acquited", "acquitted", - "acquried", "acquired", - "acronmys", "acronyms", - "acronysm", "acronyms", - "acroynms", "acronyms", - "acrynoms", "acronyms", - "acsended", "ascended", - "actaully", "actually", - "activite", "activities", - "activits", "activities", - "activley", "actively", - "actresss", "actresses", - "actualey", "actualy", - "actualiy", "actuality", - "actualky", "actualy", - "actualmy", "actualy", - "actualoy", "actualy", - "actualpy", "actualy", - "actualty", "actualy", - "acutally", "actually", - "acutions", "auctions", - "adaptare", "adapter", - "adbandon", "abandon", - "adbucted", "abducted", - "addictes", "addicts", - "addictin", "addictions", - "addictis", "addictions", - "addional", "additional", - "addopted", "adopted", - "addresed", "addressed", - "adealide", "adelaide", - "adecuate", "adequate", - "adeilade", "adelaide", - "adeladie", "adelaide", - "adeliade", "adelaide", - "adeqaute", "adequate", - "adheisve", "adhesive", - "adhevise", "adhesive", - "adivsors", "advisors", - "admiraal", "admiral", - "adolence", "adolescent", - "adorbale", "adorable", - "adovcacy", "advocacy", - "adpaters", "adapters", - "adquired", "acquired", - "adquires", "acquires", - "adresing", "addressing", - "adressed", "addressed", - "adroable", "adorable", - "adultrey", "adultery", - "adventue", "adventures", - "adventus", "adventures", - "advertis", "adverts", - "advesary", "adversary", - "adviseer", "adviser", - "adviseur", "adviser", - "advocade", "advocated", - "advocats", "advocates", - "advsiors", "advisors", - "aethists", "atheists", - "affaires", "affairs", - "affilate", "affiliate", - "affintiy", "affinity", - "affleunt", "affluent", - "affulent", "affluent", - "afircans", "africans", - "africain", "african", - "afternon", "afternoon", - "againnst", "against", - "agnositc", "agnostic", - "agonstic", "agnostic", - "agravate", "aggravate", - "agreemnt", "agreement", - "agregate", "aggregate", - "agressie", "agressive", - "agressor", "aggressor", - "agrieved", "aggrieved", - "agruable", "arguable", - "agruably", "arguably", - "agrument", "argument", - "ahtletes", "athletes", - "aincents", "ancients", - "airboner", "airborne", - "airbrone", "airborne", - "aircarft", "aircraft", - "airplans", "airplanes", - "airporta", "airports", - "airpsace", "airspace", - "airscape", "airspace", - "akransas", "arkansas", - "alchemey", "alchemy", - "alchohol", "alcohol", - "alcholic", "alcoholic", - "alcoholc", "alcoholics", - "aldutery", "adultery", - "aleniate", "alienate", - "algoritm", "algorithm", - "alimoney", "alimony", - "alirghty", "alrighty", - "allaince", "alliance", - "alledged", "alleged", - "alledges", "alleges", - "allegedy", "allegedly", - "allegely", "allegedly", - "allegric", "allergic", - "allergey", "allergy", - "allianse", "alliances", - "alligned", "aligned", - "allinace", "alliance", - "allopone", "allophone", - "allready", "already", - "almigthy", "almighty", - "alpahbet", "alphabet", - "alrigthy", "alrighty", - "altantic", "atlantic", - "alterato", "alteration", - "alternar", "alternator", - "althetes", "athletes", - "althetic", "athletic", - "altriusm", "altruism", - "altrusim", "altruism", - "alturism", "altruism", - "aluminim", "aluminium", - "alumnium", "aluminum", - "alunimum", "aluminum", - "amatersu", "amateurs", - "amaterus", "amateurs", - "amendmet", "amendments", - "amercian", "american", - "amercias", "americas", - "amernian", "armenian", - "amethsyt", "amethyst", - "ameythst", "amethyst", - "ammended", "amended", - "amnestry", "amnesty", - "amoungst", "amongst", - "amplifiy", "amplify", - "amplifly", "amplify", - "amrchair", "armchair", - "amrenian", "armenian", - "amtheyst", "amethyst", - "analgoue", "analogue", - "analisys", "analysis", - "analitic", "analytic", - "analouge", "analogue", - "analysie", "analyse", - "analysit", "analyst", - "analyste", "analyse", - "analysze", "analyse", - "analzyed", "analyzed", - "anaolgue", "analogue", - "anarchim", "anarchism", - "anaylses", "analyses", - "anaylsis", "analysis", - "anaylsts", "analysts", - "anaylzed", "analyzed", - "ancedote", "anecdote", - "anceints", "ancients", - "ancinets", "ancients", - "andoirds", "androids", - "andorids", "androids", - "andriods", "androids", - "anecdots", "anecdotes", - "anectode", "anecdote", - "anedocte", "anecdote", - "aneroxia", "anorexia", - "aneroxic", "anorexic", - "angostic", "agnostic", - "angrilly", "angrily", - "anicents", "ancients", - "animatie", "animate", - "animatte", "animate", - "anlayses", "analyses", - "annoints", "anoints", - "annouced", "announced", - "annoucne", "announce", - "anntenas", "antennas", - "anoerxia", "anorexia", - "anoerxic", "anorexic", - "anonymos", "anonymous", - "anoreixa", "anorexia", - "anounced", "announced", - "anoxeria", "anorexia", - "anoxeric", "anorexic", - "answeres", "answers", - "antartic", "antarctic", - "antennea", "antenna", - "antennna", "antenna", - "anticipe", "anticipate", - "antiquae", "antique", - "antivirs", "antivirus", - "anwsered", "answered", - "anyhting", "anything", - "anyhwere", "anywhere", - "anyoneis", "anyones", - "anythign", "anything", - "anytying", "anything", - "aparment", "apartment", - "apartmet", "apartments", - "apenines", "apennines", - "aperutre", "aperture", - "aplhabet", "alphabet", - "apologes", "apologise", - "aposltes", "apostles", - "apostels", "apostles", - "appaluse", "applause", - "apparant", "apparent", - "appareal", "apparel", - "appareil", "apparel", - "apperead", "appeared", - "applaued", "applaud", - "appluase", "applause", - "appology", "apology", - "apporach", "approach", - "appraoch", "approach", - "apreture", "aperture", - "apsotles", "apostles", - "aqaurium", "aquarium", - "aqcuired", "acquired", - "aquaduct", "aqueduct", - "aquairum", "aquarium", - "aquaruim", "aquarium", - "aquiring", "acquiring", - "aquitted", "acquitted", - "arbitary", "arbitrary", - "arbitray", "arbitrary", - "arbiture", "arbiter", - "architet", "architect", - "archtype", "archetype", - "aremnian", "armenian", - "argentia", "argentina", - "argubaly", "arguably", - "arguemet", "arguement", - "arguemtn", "arguement", - "ariborne", "airborne", - "aricraft", "aircraft", - "ariplane", "airplane", - "ariports", "airports", - "arispace", "airspace", - "aristote", "aristotle", - "aritfact", "artifact", - "arizonia", "arizona", - "arkasnas", "arkansas", - "arlighty", "alrighty", - "armamant", "armament", - "armenain", "armenian", - "armenina", "armenian", - "armpitts", "armpits", - "armstrog", "armstrong", - "arpanoid", "paranoid", - "arpeture", "aperture", - "arragned", "arranged", - "arrestes", "arrests", - "arrestos", "arrests", - "arsenaal", "arsenal", - "artemios", "artemis", - "artemius", "artemis", - "arthrits", "arthritis", - "articule", "articulate", - "artifacs", "artifacts", - "artifcat", "artifact", - "artilley", "artillery", - "artisitc", "artistic", - "artistas", "artists", - "arugable", "arguable", - "arugably", "arguably", - "arugment", "argument", - "asborbed", "absorbed", - "asburdly", "absurdly", - "ascneded", "ascended", - "asissted", "assisted", - "askreddt", "askreddit", - "asnwered", "answered", - "aspectos", "aspects", - "asperges", "aspergers", - "assasins", "assassins", - "assemple", "assemble", - "assertin", "assertions", - "asshates", "asshats", - "asshatts", "asshats", - "assimile", "assimilate", - "assistat", "assistants", - "assitant", "assistant", - "assmeble", "assemble", - "assmebly", "assembly", - "asssasin", "assassin", - "assualts", "assaults", - "asteorid", "asteroid", - "asteriks", "asterisk", - "asteriod", "asteroid", - "asterois", "asteroids", - "astersik", "asterisk", - "asthetic", "aesthetic", - "astronat", "astronaut", - "asutrian", "austrian", - "atheisim", "atheism", - "atheistc", "atheistic", - "atheltes", "athletes", - "atheltic", "athletic", - "athenean", "athenian", - "athesits", "atheists", - "athetlic", "athletic", - "athients", "athiest", - "atittude", "attitude", - "atlantia", "atlanta", - "atmoizer", "atomizer", - "atomzier", "atomizer", - "atribute", "attribute", - "atrifact", "artifact", - "attackes", "attackers", - "attemped", "attempted", - "attemted", "attempted", - "attemtps", "attempts", - "attidute", "attitude", - "attitide", "attitude", - "attribue", "attribute", - "aucitons", "auctions", - "audactiy", "audacity", - "audcaity", "audacity", - "audeince", "audience", - "audiobok", "audiobook", - "austeriy", "austerity", - "austiran", "austrian", - "austitic", "autistic", - "austrain", "austrian", - "australa", "australian", - "austrija", "austria", - "austrila", "austria", - "autisitc", "autistic", - "autoattk", "autoattack", - "autograh", "autograph", - "automato", "automation", - "automony", "autonomy", - "autority", "authority", - "autsitic", "autistic", - "auxilary", "auxiliary", - "avacodos", "avocados", - "avaiable", "available", - "availabe", "available", - "availble", "available", - "avaition", "aviation", - "avalable", "available", - "avalance", "avalanche", - "avataras", "avatars", - "avatards", "avatars", - "avatares", "avatars", - "averadge", "averaged", - "avergaed", "averaged", - "avergaes", "averages", - "aviaiton", "aviation", - "avilable", "available", - "avnegers", "avengers", - "avodacos", "avocados", - "awekened", "weakened", - "awesomey", "awesomely", - "awfullly", "awfully", - "awkwardy", "awkwardly", - "awnsered", "answered", - "babysite", "babysitter", - "baceause", "because", - "bacehlor", "bachelor", - "bachleor", "bachelor", - "bacholer", "bachelor", - "backeast", "backseat", - "backerds", "backers", - "backfied", "backfield", - "backpacs", "backpacks", - "balcanes", "balances", - "balconey", "balcony", - "balconny", "balcony", - "ballistc", "ballistic", - "balnaced", "balanced", - "banannas", "bananas", - "banditas", "bandits", - "bandwith", "bandwidth", - "bangkock", "bangkok", - "baptisim", "baptism", - "barabric", "barbaric", - "barbarin", "barbarian", - "barbaris", "barbarians", - "bardford", "bradford", - "bargaing", "bargaining", - "baristia", "barista", - "barrakcs", "barracks", - "barrells", "barrels", - "basicaly", "basically", - "basiclay", "basicly", - "basicley", "basicly", - "basicliy", "basicly", - "batistia", "batista", - "battalin", "battalion", - "bayonent", "bayonet", - "beachead", "beachhead", - "beacuoup", "beaucoup", - "beardude", "bearded", - "beastley", "beastly", - "beatiful", "beautiful", - "beccause", "because", - "becuasse", "becuase", - "befirend", "befriend", - "befreind", "befriend", - "begginer", "beginner", - "begginig", "begging", - "begginng", "begging", - "begining", "beginning", - "beginnig", "beginning", - "behaivor", "behavior", - "behavios", "behaviours", - "behavoir", "behavior", - "behavour", "behavior", - "behngazi", "benghazi", - "behtesda", "bethesda", - "beleived", "believed", - "beleiver", "believer", - "beleives", "believes", - "beliefes", "beliefs", - "benefica", "beneficial", - "bengahzi", "benghazi", - "bengalas", "bengals", - "bengalos", "bengals", - "bengazhi", "benghazi", - "benghzai", "benghazi", - "bengzhai", "benghazi", - "benhgazi", "benghazi", - "benidect", "benedict", - "benifits", "benefits", - "berekley", "berkeley", - "berserkr", "berserker", - "beseiged", "besieged", - "betehsda", "bethesda", - "beteshda", "bethesda", - "bethdesa", "bethesda", - "bethedsa", "bethesda", - "bethseda", "bethesda", - "beyoncye", "beyonce", - "bibilcal", "biblical", - "bicylces", "bicycles", - "bigfooot", "bigfoot", - "bigining", "beginning", - "bilbical", "biblical", - "billboad", "billboard", - "bilsters", "blisters", - "bilzzard", "blizzard", - "bilzzcon", "blizzcon", - "biologia", "biological", - "birhtday", "birthday", - "birsbane", "brisbane", - "birthdsy", "birthdays", - "biseuxal", "bisexual", - "bisexaul", "bisexual", - "bitcions", "bitcoins", - "bitocins", "bitcoins", - "blackade", "blacked", - "blackend", "blacked", - "blackjak", "blackjack", - "blacklit", "blacklist", - "blatanty", "blatantly", - "blessins", "blessings", - "blessure", "blessing", - "bloggare", "blogger", - "bloggeur", "blogger", - "bluebery", "blueberry", - "bluetooh", "bluetooth", - "blugaria", "bulgaria", - "boardway", "broadway", - "bollcoks", "bollocks", - "bomberos", "bombers", - "bookmars", "bookmarks", - "boradway", "broadway", - "boredoom", "boredom", - "bouldore", "boulder", - "bounites", "bounties", - "boutnies", "bounties", - "boutqiue", "boutique", - "bouyancy", "buoyancy", - "boyfried", "boyfriend", - "bradcast", "broadcast", - "bradfrod", "bradford", - "brakeout", "breakout", - "braodway", "broadway", - "braverly", "bravery", - "breathis", "breaths", - "breathos", "breaths", - "brekaout", "breakout", - "brendamn", "brendan", - "breweres", "brewers", - "brewerey", "brewery", - "brewerks", "brewers", - "brewerys", "brewers", - "brigaged", "brigade", - "brigated", "brigade", - "brigthen", "brighten", - "briliant", "brilliant", - "brillant", "brilliant", - "bristool", "bristol", - "brithday", "birthday", - "brittish", "british", - "briusers", "bruisers", - "broadbad", "broadband", - "broadcat", "broadcasts", - "broadley", "broadly", - "brocolli", "broccoli", - "brodaway", "broadway", - "broncoes", "broncos", - "broswing", "browsing", - "browines", "brownies", - "browisng", "browsing", - "brtually", "brutally", - "brugundy", "burgundy", - "bruisend", "bruised", - "brussles", "brussels", - "brusting", "bursting", - "bubblews", "bubbles", - "buddhits", "buddhist", - "buddhsim", "buddhism", - "buddishm", "buddhism", - "buddisht", "buddhist", - "buglaria", "bulgaria", - "buhddism", "buddhism", - "buhddist", "buddhist", - "buidlers", "builders", - "buidling", "building", - "buildins", "buildings", - "buisness", "business", - "bulagria", "bulgaria", - "bulgaira", "bulgaria", - "buliders", "builders", - "buliding", "building", - "bulletts", "bullets", - "burisers", "bruisers", - "burriots", "burritos", - "burritio", "burrito", - "burritto", "burrito", - "burrtios", "burritos", - "burssels", "brussels", - "burtally", "brutally", - "burtsing", "bursting", - "busrting", "bursting", - "butcherd", "butchered", - "butterey", "buttery", - "butterfy", "butterfly", - "butterry", "buttery", - "butthoel", "butthole", - "bycicles", "bicycles", - "cabbagge", "cabbage", - "cabients", "cabinets", - "cabinate", "cabinet", - "cabinent", "cabinet", - "cabniets", "cabinets", - "caclulus", "calculus", - "cafetera", "cafeteria", - "caffinee", "caffeine", - "cahsiers", "cashiers", - "cainster", "canister", - "calander", "calendar", - "calcular", "calculator", - "calgarry", "calgary", - "calibler", "calibre", - "caloires", "calories", - "calrkson", "clarkson", - "calroies", "calories", - "calssify", "classify", - "calulate", "calculate", - "calymore", "claymore", - "camapign", "campaign", - "cambodai", "cambodia", - "camboida", "cambodia", - "cambpell", "campbell", - "cambride", "cambridge", - "cambrige", "cambridge", - "camoufle", "camouflage", - "campagin", "campaign", - "campaing", "campaign", - "campains", "campaigns", - "camperas", "campers", - "camperos", "campers", - "canadias", "canadians", - "cananbis", "cannabis", - "cancelas", "cancels", - "canceles", "cancels", - "cancells", "cancels", - "canceres", "cancers", - "cancerns", "cancers", - "cancerus", "cancers", - "candiate", "candidate", - "candiens", "candies", - "canistre", "canister", - "cannabil", "cannibal", - "cannbial", "cannibal", - "cannibas", "cannabis", - "cansiter", "canister", - "capitans", "captains", - "capitola", "capital", - "capitulo", "capitol", - "capmbell", "campbell", - "capsuels", "capsules", - "capsulse", "capsules", - "capsumel", "capsule", - "capteurs", "captures", - "captials", "capitals", - "captians", "captains", - "capusles", "capsules", - "caputres", "captures", - "cardboad", "cardboard", - "cardianl", "cardinal", - "cardnial", "cardinal", - "careflly", "carefully", - "carefull", "careful", - "carefuly", "carefully", - "caricate", "caricature", - "caridgan", "cardigan", - "caridnal", "cardinal", - "carinval", "carnival", - "carloina", "carolina", - "carnagie", "carnegie", - "carnigie", "carnegie", - "carnvial", "carnival", - "carrotts", "carrots", - "carrotus", "carrots", - "cartells", "cartels", - "cartmaan", "cartman", - "cartride", "cartridge", - "cartrige", "cartridge", - "carvinal", "carnival", - "casaulty", "casualty", - "casheirs", "cashiers", - "cashieer", "cashier", - "cashires", "cashiers", - "castleos", "castles", - "castlers", "castles", - "casulaty", "casualty", - "cataclym", "cataclysm", - "catagory", "category", - "cataline", "catiline", - "cataloge", "catalogue", - "catalsyt", "catalyst", - "cataylst", "catalyst", - "cathloic", "catholic", - "catlayst", "catalyst", - "caucasin", "caucasian", - "causalty", "casualty", - "cellural", "cellular", - "celullar", "cellular", - "celverly", "cleverly", - "cemetary", "cemetery", - "centeres", "centers", - "centerns", "centers", - "centrase", "centres", - "centrers", "centres", - "ceratine", "creatine", - "cerberal", "cerebral", - "cerbreus", "cerberus", - "cerbures", "cerberus", - "ceremone", "ceremonies", - "cerimony", "ceremony", - "ceromony", "ceremony", - "certainy", "certainty", - "challege", "challenge", - "chambear", "chamber", - "chambres", "chambers", - "champage", "champagne", - "chanisaw", "chainsaw", - "chanlder", "chandler", - "charcaol", "charcoal", - "chargehr", "charger", - "chargeur", "charger", - "chariman", "chairman", - "charimsa", "charisma", - "charmisa", "charisma", - "charocal", "charcoal", - "charsima", "charisma", - "chasiers", "cashiers", - "chassids", "chassis", - "chassies", "chassis", - "chatolic", "catholic", - "chcukles", "chuckles", - "checkare", "checker", - "checkear", "checker", - "cheesees", "cheeses", - "cheeseus", "cheeses", - "cheetoos", "cheetos", - "chemcial", "chemical", - "chemisty", "chemistry", - "chernobl", "chernobyl", - "chiansaw", "chainsaw", - "chidlish", "childish", - "chihuaha", "chihuahua", - "childres", "childrens", - "chillade", "chilled", - "chillead", "chilled", - "chillend", "chilled", - "chilvary", "chivalry", - "chinesse", "chinese", - "chivarly", "chivalry", - "chivlary", "chivalry", - "chlidish", "childish", - "chlroine", "chlorine", - "chmabers", "chambers", - "chocolae", "chocolates", - "chocolet", "chocolates", - "choesive", "cohesive", - "choicers", "choices", - "cholrine", "chlorine", - "chorline", "chlorine", - "chracter", "character", - "christin", "christian", - "chroline", "chlorine", - "chromose", "chromosome", - "chronice", "chronicles", - "chruches", "churches", - "chuckels", "chuckles", - "cielings", "ceilings", - "cigarete", "cigarettes", - "cigarets", "cigarettes", - "cilmbers", "climbers", - "cilnatro", "cilantro", - "ciltoris", "clitoris", - "circiuts", "circuits", - "circkets", "crickets", - "circlebs", "circles", - "circluar", "circular", - "ciricuit", "circuit", - "cirlcing", "circling", - "ciruclar", "circular", - "clannand", "clannad", - "clarifiy", "clarify", - "clarskon", "clarkson", - "clasical", "classical", - "classrom", "classroom", - "classsic", "classics", - "clausens", "clauses", - "cleanies", "cleanse", - "cleasner", "cleanser", - "clenaser", "cleanser", - "clevelry", "cleverly", - "clhorine", "chlorine", - "cliamtes", "climates", - "cliantro", "cilantro", - "clickare", "clicker", - "clickbat", "clickbait", - "clickear", "clicker", - "clientes", "clients", - "clincial", "clinical", - "clinicas", "clinics", - "clinicos", "clinics", - "clipboad", "clipboard", - "clitiros", "clitoris", - "closeing", "closing", - "closeley", "closely", - "clyamore", "claymore", - "clyinder", "cylinder", - "cmoputer", "computer", - "coindice", "coincide", - "collapes", "collapse", - "collares", "collars", - "collaris", "collars", - "collaros", "collars", - "collaspe", "collapse", - "colleage", "colleagues", - "collecte", "collective", - "collegue", "colleague", - "collisin", "collisions", - "collosal", "colossal", - "collpase", "collapse", - "coloardo", "colorado", - "colordao", "colorado", - "colubmia", "columbia", - "columnas", "columns", - "comadres", "comrades", - "comander", "commander", - "comandos", "commandos", - "comapany", "company", - "comapres", "compares", - "combiens", "combines", - "combinig", "combining", - "comediac", "comedic", - "comedias", "comedians", - "comestic", "cosmetic", - "comision", "commission", - "comiting", "committing", - "comitted", "committed", - "comittee", "committee", - "commandd", "commanded", - "commecen", "commence", - "commedic", "comedic", - "commense", "commenters", - "commenty", "commentary", - "commiest", "commits", - "commited", "committed", - "commitee", "committee", - "commites", "commits", - "committe", "committee", - "committs", "commits", - "commitus", "commits", - "commmand", "command", - "communit", "communist", - "companis", "companions", - "comparse", "compares", - "comparte", "compare", - "compasso", "compassion", - "compelte", "complete", - "compense", "compensate", - "complais", "complains", - "complane", "complacent", - "complate", "complacent", - "compleet", "complete", - "completi", "complexity", - "complets", "completes", - "complety", "completely", - "complexs", "complexes", - "complext", "complexity", - "complexy", "complexity", - "complict", "complicit", - "complier", "compiler", - "compones", "compose", - "componet", "components", - "componts", "compost", - "composet", "compost", - "composit", "compost", - "composte", "compose", - "comprese", "compressed", - "compreso", "compressor", - "compsers", "compress", - "comptown", "compton", - "compunet", "compute", - "computre", "compute", - "comradre", "comrade", - "comsetic", "cosmetic", - "conatins", "contains", - "conceald", "concealed", - "conceide", "conceived", - "conceled", "concede", - "concened", "concede", - "concepta", "conceptual", - "concered", "concede", - "concernt", "concert", - "concerte", "concrete", - "concesso", "concession", - "conceted", "concede", - "conceved", "concede", - "concibes", "concise", - "concider", "consider", - "concides", "concise", - "concious", "conscious", - "conclued", "conclude", - "concluse", "conclusive", - "concluso", "conclusion", - "concreet", "concrete", - "concrets", "concerts", - "condemnd", "condemned", - "conditon", "condition", - "condomes", "condoms", - "condomns", "condoms", - "conduict", "conduit", - "conected", "connected", - "conencts", "connects", - "confeses", "confess", - "confesos", "confess", - "confesso", "confession", - "configue", "configure", - "confilct", "conflict", - "confirmd", "confirmed", - "conflcit", "conflict", - "conflics", "conflicts", - "confrims", "confirms", - "conicide", "coincide", - "conlcude", "conclude", - "conqueor", "conquer", - "conquerd", "conquered", - "conqured", "conquered", - "conscent", "consent", - "consious", "conscious", - "constans", "constants", - "constast", "constants", - "constatn", "constant", - "constrat", "constraint", - "construt", "constructs", - "containd", "contained", - "containg", "containing", - "contaire", "containers", - "contanti", "contacting", - "contense", "contenders", - "contenst", "contents", - "contexta", "contextual", - "contextl", "contextual", - "contians", "contains", - "contined", "continued", - "contines", "continents", - "continum", "continuum", - "continus", "continues", - "continut", "continuity", - "continuu", "continuous", - "contracr", "contractor", - "contracs", "contracts", - "controll", "control", - "convenit", "convenient", - "convento", "convention", - "converst", "converts", - "convertr", "converter", - "conviced", "convinced", - "convicto", "conviction", - "convingi", "convincing", - "convinse", "convinces", - "cooldows", "cooldowns", - "coordine", "coordinate", - "coralina", "carolina", - "corollla", "corolla", - "corolloa", "corolla", - "corosion", "corrosion", - "corpsers", "corpses", - "corrdior", "corridor", - "correcty", "correctly", - "correnti", "correcting", - "corretly", "correctly", - "corrupto", "corruption", - "cosemtic", "cosmetic", - "cosutmes", "costumes", - "couldnot", "couldnt", - "coulored", "coloured", - "counries", "countries", - "counseil", "counsel", - "counsole", "counsel", - "counterd", "countered", - "countert", "counteract", - "countres", "counters", - "courtrom", "courtroom", - "courtsey", "courtesy", - "cousines", "cousins", - "cousings", "cousins", - "coutners", "counters", - "covanent", "covenant", - "coverted", "converted", - "coyotees", "coyotes", - "cpatains", "captains", - "cranbery", "cranberry", - "crayones", "crayons", - "creaeted", "created", - "createin", "creatine", - "createur", "creature", - "creatien", "creatine", - "creepgin", "creeping", - "cricling", "circling", - "cringely", "cringey", - "cringery", "cringey", - "criticas", "critics", - "critices", "critics", - "criticie", "criticise", - "criticim", "criticisms", - "criticis", "critics", - "criticms", "critics", - "criticos", "critics", - "criticts", "critics", - "criticus", "critics", - "critiera", "criteria", - "critized", "criticized", - "croatioa", "croatia", - "crossfie", "crossfire", - "crosshar", "crosshair", - "crosspot", "crosspost", - "crowbahr", "crowbar", - "cruasder", "crusader", - "cruciaal", "crucial", - "crucibel", "crucible", - "cruicble", "crucible", - "crusdaer", "crusader", - "crusiers", "cruisers", - "crusiing", "cruising", - "cruthces", "crutches", - "cthulhlu", "cthulhu", - "cthulluh", "cthulhu", - "cubpoard", "cupboard", - "cuddleys", "cuddles", - "culprint", "culprit", - "cultrual", "cultural", - "culutral", "cultural", - "cupbaord", "cupboard", - "cupborad", "cupboard", - "curcible", "crucible", - "curisers", "cruisers", - "curising", "cruising", - "currecny", "currency", - "currence", "currencies", - "currenly", "currently", - "currenty", "currently", - "cursader", "crusader", - "custcene", "cutscene", - "cutsceen", "cutscene", - "cutscens", "cutscenes", - "cutsence", "cutscene", - "cylcists", "cyclists", - "cylidner", "cylinder", - "cylindre", "cylinder", - "cynisicm", "cynicism", - "cyrstals", "crystals", - "dacquiri", "daiquiri", - "daimonds", "diamonds", - "dangeros", "dangers", - "dangerus", "dangers", - "darkenss", "darkness", - "darnkess", "darkness", - "dashboad", "dashboard", - "daugther", "daughter", - "deadlfit", "deadlift", - "deadlifs", "deadlifts", - "deafeted", "defeated", - "deafults", "defaults", - "dealying", "delaying", - "deamenor", "demeanor", - "deathcat", "deathmatch", - "debuffes", "debuffs", - "debufffs", "debuffs", - "decalred", "declared", - "decalres", "declares", - "decembre", "december", - "decidely", "decidedly", - "decieved", "deceived", - "decifits", "deficits", - "decipted", "depicted", - "declears", "declares", - "declinig", "declining", - "decmeber", "december", - "decribed", "described", - "decribes", "describes", - "dedicato", "dedication", - "deductie", "deductible", - "defautls", "defaults", - "defectos", "defects", - "defectus", "defects", - "defendas", "defends", - "defendes", "defenders", - "defendis", "defends", - "defendre", "defender", - "defendrs", "defends", - "defensea", "defenseman", - "defensen", "defenseman", - "defensie", "defensive", - "defetead", "defeated", - "deffined", "defined", - "deficiet", "deficient", - "definate", "definite", - "definaty", "definately", - "definety", "definetly", - "definito", "definition", - "definitv", "definitive", - "deflatin", "deflation", - "deflecto", "deflection", - "defualts", "defaults", - "degarded", "degraded", - "degenere", "degenerate", - "degraged", "degrade", - "degrated", "degrade", - "deisgned", "designed", - "deisgner", "designer", - "dekstops", "desktops", - "delcared", "declared", - "delcares", "declares", - "delepted", "depleted", - "delivere", "deliveries", - "delpeted", "depleted", - "delpoyed", "deployed", - "delyaing", "delaying", - "demandas", "demands", - "demandes", "demands", - "demenaor", "demeanor", - "democray", "democracy", - "demolito", "demolition", - "denseley", "densely", - "densitiy", "density", - "deomcrat", "democrat", - "deovtion", "devotion", - "departer", "departure", - "departue", "departure", - "depcited", "depicted", - "depelted", "depleted", - "dependat", "dependant", - "depictes", "depicts", - "depictin", "depictions", - "depolyed", "deployed", - "depositd", "deposited", - "depostis", "deposits", - "depresse", "depressive", - "depresso", "depression", - "derivate", "derivative", - "descened", "descend", - "descibed", "described", - "descirbe", "describe", - "descrise", "describes", - "desgined", "designed", - "desginer", "designer", - "desicive", "decisive", - "designad", "designated", - "designes", "designs", - "designet", "designated", - "desinged", "designed", - "desinger", "designer", - "desitned", "destined", - "desktiop", "desktop", - "desorder", "disorder", - "despides", "despised", - "despiste", "despise", - "destiney", "destiny", - "destinty", "destiny", - "destkops", "desktops", - "destorys", "destroys", - "destrose", "destroyers", - "destroyd", "destroyed", - "destroyr", "destroyers", - "detalied", "detailed", - "detectas", "detects", - "detectes", "detects", - "detectie", "detectives", - "determen", "determines", - "devasted", "devastated", - "develope", "develop", - "devialet", "deviate", - "deviatie", "deviate", - "devilers", "delivers", - "devloved", "devolved", - "devovled", "devolved", - "diaganol", "diagonal", - "diagnoal", "diagonal", - "diagnoes", "diagnose", - "diagnosi", "diagnostic", - "diagonse", "diagnose", - "diahrrea", "diarrhea", - "dialetcs", "dialects", - "dialgoue", "dialogue", - "dialouge", "dialogue", - "diarreah", "diarrhea", - "diarreha", "diarrhea", - "dichtomy", "dichotomy", - "dickisch", "dickish", - "dicovers", "discovers", - "dicovery", "discovery", - "dicussed", "discussed", - "diferent", "different", - "differnt", "different", - "difficut", "difficulty", - "diffrent", "different", - "diganose", "diagnose", - "dignitiy", "dignity", - "dimaonds", "diamonds", - "dinasour", "dinosaur", - "dinosaus", "dinosaurs", - "dinosuar", "dinosaur", - "dinsoaur", "dinosaur", - "dionsaur", "dinosaur", - "diphtong", "diphthong", - "diplomma", "diploma", - "dipthong", "diphthong", - "direclty", "directly", - "directin", "directions", - "directix", "directx", - "directos", "directors", - "directoy", "directory", - "directrx", "directx", - "dirfting", "drifting", - "disabeld", "disabled", - "disabels", "disables", - "disagred", "disagreed", - "disagres", "disagrees", - "disbaled", "disabled", - "disbales", "disables", - "disbelif", "disbelief", - "dischard", "discharged", - "dischare", "discharged", - "discound", "discounted", - "discoure", "discourse", - "discoved", "discovered", - "discreto", "discretion", - "discribe", "describe", - "disentry", "dysentery", - "disgiuse", "disguise", - "dishoner", "dishonored", - "dishonet", "dishonesty", - "dislikse", "dislikes", - "dismante", "dismantle", - "dismisse", "dismissive", - "disolved", "dissolved", - "dispacth", "dispatch", - "dispalys", "displays", - "dispence", "dispense", - "dispersa", "dispensary", - "displayd", "displayed", - "disposle", "dispose", - "disposte", "dispose", - "dispoves", "dispose", - "disptach", "dispatch", - "disricts", "districts", - "dissovle", "dissolve", - "distates", "distaste", - "distatse", "distaste", - "disticnt", "distinct", - "distorto", "distortion", - "distrcit", "district", - "districs", "districts", - "disturbd", "disturbed", - "disupted", "disputed", - "disuptes", "disputes", - "diversed", "diverse", - "diversiy", "diversify", - "dividens", "dividends", - "divintiy", "divinity", - "divisons", "divisions", - "doapmine", "dopamine", - "docrines", "doctrines", - "docrtine", "doctrine", - "doctines", "doctrines", - "doctirne", "doctrine", - "doctrins", "doctrines", - "dogamtic", "dogmatic", - "dolhpins", "dolphins", - "domapine", "dopamine", - "domecrat", "democrat", - "domiante", "dominate", - "dominato", "domination", - "dominats", "dominates", - "dominent", "dominant", - "dominoin", "dominion", - "donwload", "download", - "donwvote", "downvote", - "doomdsay", "doomsday", - "doosmday", "doomsday", - "doplhins", "dolphins", - "dopmaine", "dopamine", - "dormtund", "dortmund", - "dortumnd", "dortmund", - "dotrmund", "dortmund", - "douchely", "douchey", - "doucheus", "douches", - "dowloads", "downloads", - "downlaod", "download", - "downloas", "downloads", - "downstar", "downstairs", - "downvore", "downvoters", - "downvotr", "downvoters", - "downvots", "downvotes", - "draculea", "dracula", - "draculla", "dracula", - "dragones", "dragons", - "dragonus", "dragons", - "drfiting", "drifting", - "driectly", "directly", - "drifitng", "drifting", - "driveris", "drivers", - "drotmund", "dortmund", - "duaghter", "daughter", - "dumbbels", "dumbbells", - "dumptser", "dumpster", - "dumspter", "dumpster", - "dunegons", "dungeons", - "dungeoun", "dungeon", - "dungoens", "dungeons", - "dupicate", "duplicate", - "duplicas", "duplicates", - "dwarvens", "dwarves", - "dyanmics", "dynamics", - "dyanmite", "dynamite", - "dymanics", "dynamics", - "dymanite", "dynamite", - "dynastry", "dynasty", - "dysentry", "dysentery", - "dysphora", "dysphoria", - "earilest", "earliest", - "eatswood", "eastwood", - "eceonomy", "economy", - "ecidious", "deciduous", - "ecologia", "ecological", - "ecomonic", "economic", - "ecstacys", "ecstasy", - "ecstascy", "ecstasy", - "ecstasty", "ecstasy", - "ectastic", "ecstatic", - "editoras", "editors", - "editores", "editors", - "efficent", "efficient", - "egpytian", "egyptian", - "egyptain", "egyptian", - "egytpian", "egyptian", - "ehtereal", "ethereal", - "ehternet", "ethernet", - "eigtheen", "eighteen", - "electhor", "electro", - "electorn", "electron", - "elementy", "elementary", - "elephans", "elephants", - "elevatin", "elevation", - "elicided", "elicited", - "eligable", "eligible", - "elimiate", "eliminate", - "eliminas", "eliminates", - "elitisim", "elitism", - "elitistm", "elitism", - "ellected", "elected", - "embarass", "embarrass", - "embargos", "embargoes", - "embarras", "embarrass", - "embassay", "embassy", - "embassey", "embassy", - "embasssy", "embassy", - "emergend", "emerged", - "emergerd", "emerged", - "eminated", "emanated", - "emminent", "eminent", - "emmisary", "emissary", - "emmision", "emission", - "emmiting", "emitting", - "emmitted", "emitted", - "empathie", "empathize", - "empirial", "empirical", - "emulatin", "emulation", - "enahnces", "enhances", - "enchanct", "enchant", - "encolsed", "enclosed", - "endanged", "endangered", - "endevors", "endeavors", - "endevour", "endeavour", - "endlessy", "endlessly", - "endorces", "endorse", - "engeneer", "engineer", - "engeries", "energies", - "engineed", "engineered", - "engrames", "engrams", - "engramms", "engrams", - "enigneer", "engineer", - "enitrely", "entirely", - "enlcosed", "enclosed", - "enlsaved", "enslaved", - "ensalved", "enslaved", - "enterity", "entirety", - "entierly", "entirely", - "entierty", "entirety", - "entilted", "entitled", - "entirley", "entirely", - "entiteld", "entitled", - "entitity", "entity", - "entropay", "entropy", - "entrophy", "entropy", - "ephipany", "epiphany", - "epihpany", "epiphany", - "epilespy", "epilepsy", - "epilgoue", "epilogue", - "episdoes", "episodes", - "epitomie", "epitome", - "epliepsy", "epilepsy", - "epliogue", "epilogue", - "epsiodes", "episodes", - "epsresso", "espresso", - "eqaulity", "equality", - "eqaution", "equation", - "equailty", "equality", - "eraticly", "erratically", - "erroneos", "erroneous", - "errupted", "erupted", - "escalato", "escalation", - "esctatic", "ecstatic", - "esential", "essential", - "esitmate", "estimate", - "esperate", "seperate", - "esportes", "esports", - "estiamte", "estimate", - "estoeric", "esoteric", - "estonija", "estonia", - "estoniya", "estonia", - "etherael", "ethereal", - "etherent", "ethernet", - "ethicaly", "ethically", - "etiquete", "etiquette", - "etrailer", "retailer", - "eugencis", "eugenics", - "eugneics", "eugenics", - "euhporia", "euphoria", - "euhporic", "euphoric", - "euorpean", "european", - "euphoira", "euphoria", - "euphroia", "euphoria", - "euphroic", "euphoric", - "europian", "european", - "eurpoean", "european", - "evangers", "avengers", - "everyons", "everyones", - "evidencd", "evidenced", - "evidende", "evidenced", - "evloving", "evolving", - "evolveds", "evolves", - "evolveos", "evolves", - "evovling", "evolving", - "excecute", "execute", - "excedded", "exceeded", - "excelent", "excellent", - "exceptin", "exceptions", - "excerise", "exercise", - "excisted", "existed", - "exclusie", "exclusives", - "exculded", "excluded", - "exculdes", "excludes", - "exection", "execution", - "exectued", "executed", - "executie", "executive", - "executin", "execution", - "exellent", "excellent", - "exerbate", "exacerbate", - "exercide", "exercised", - "exercies", "exercise", - "exersice", "exercise", - "exersize", "exercise", - "exhalted", "exalted", - "exhaustn", "exhaustion", - "exhausto", "exhaustion", - "exicting", "exciting", - "exisitng", "existing", - "existane", "existance", - "existant", "existent", - "existend", "existed", - "exlcuded", "excluded", - "exlcudes", "excludes", - "exlporer", "explorer", - "exoticas", "exotics", - "exoticos", "exotics", - "expalins", "explains", - "expandas", "expands", - "expandes", "expands", - "expansie", "expansive", - "expectes", "expects", - "expectus", "expects", - "expedito", "expedition", - "expences", "expense", - "expensie", "expense", - "expensve", "expense", - "expertas", "experts", - "expertis", "experts", - "expertos", "experts", - "expireds", "expires", - "explaind", "explained", - "explaing", "explaining", - "expliots", "exploits", - "explodie", "explode", - "exploint", "exploit", - "explosie", "explosive", - "explosin", "explosions", - "exploted", "explode", - "expoldes", "explodes", - "expolits", "exploits", - "exportas", "exports", - "exportes", "exports", - "exportfs", "exports", - "exposees", "exposes", - "exposito", "exposition", - "expresse", "expressive", - "expresss", "expresses", - "expressy", "expressly", - "exressed", "expressed", - "exsitent", "existent", - "exsiting", "existing", - "extactly", "exactly", - "extemely", "extremely", - "extendes", "extends", - "extendos", "extends", - "extenion", "extension", - "extensie", "extensive", - "extensis", "extensions", - "extortin", "extortion", - "extracto", "extraction", - "extreems", "extremes", - "extremly", "extremely", - "eygptian", "egyptian", - "faboulus", "fabulous", - "fabricas", "fabrics", - "fabrices", "fabrics", - "fabricus", "fabrics", - "faceplam", "facepalm", - "facilisi", "facilities", - "faciltiy", "facility", - "facsists", "fascists", - "factores", "factors", - "factorys", "factors", - "factualy", "factually", - "faggotts", "faggots", - "faggotus", "faggots", - "falcones", "falcons", - "falgship", "flagship", - "faliures", "failures", - "falseley", "falsely", - "falshing", "flashing", - "falvored", "flavored", - "falvours", "flavours", - "familair", "familiar", - "famoulsy", "famously", - "fanatism", "fanaticism", - "fanatsic", "fanatics", - "fanserve", "fanservice", - "fantasty", "fantasy", - "farcking", "fracking", - "fascisim", "fascism", - "fashiond", "fashioned", - "fasicsts", "fascists", - "fatigure", "fatigue", - "favorits", "favorites", - "favourie", "favourites", - "feasable", "feasible", - "feasbile", "feasible", - "febraury", "february", - "februray", "february", - "feburary", "february", - "fedility", "fidelity", - "fedorahs", "fedoras", - "fedorans", "fedoras", - "feilding", "fielding", - "feisable", "feasible", - "feitshes", "fetishes", - "feltcher", "fletcher", - "felxible", "flexible", - "feminint", "femininity", - "feminsim", "feminism", - "feromone", "pheromone", - "fesiable", "feasible", - "festivas", "festivals", - "festivle", "festive", - "fictious", "fictitious", - "fideling", "fielding", - "fideltiy", "fidelity", - "fiedling", "fielding", - "fiedlity", "fidelity", - "fighitng", "fighting", - "figthing", "fighting", - "fileding", "fielding", - "fimilies", "families", - "finacial", "financial", - "fineshes", "finesse", - "fingersi", "fingertips", - "finnisch", "finnish", - "finsihes", "finishes", - "firebals", "fireballs", - "firendly", "friendly", - "firmwear", "firmware", - "firwmare", "firmware", - "flaghsip", "flagship", - "flamable", "flammable", - "flasghip", "flagship", - "flatterd", "flattered", - "flatteur", "flatter", - "flattire", "flatter", - "flavores", "flavors", - "flechter", "fletcher", - "flecther", "fletcher", - "flemmish", "flemish", - "flethcer", "fletcher", - "flexbile", "flexible", - "flexibel", "flexible", - "flippade", "flipped", - "flitered", "filtered", - "florecen", "florence", - "floridia", "florida", - "floruide", "fluoride", - "floruish", "flourish", - "flourine", "fluorine", - "floursih", "flourish", - "fluorish", "flourish", - "fluroide", "fluoride", - "folowing", "following", - "fontrier", "fontier", - "forasken", "forsaken", - "forbiden", "forbidden", - "foreamrs", "forearms", - "foreksin", "foreskin", - "forenics", "forensic", - "forenisc", "forensic", - "foresnic", "forensic", - "foreward", "foreword", - "foricbly", "forcibly", - "forigven", "forgiven", - "formatin", "formation", - "formelly", "formerly", - "formuals", "formulas", - "fornesic", "forensic", - "forresst", "forrest", - "forsekan", "forsaken", - "forsekin", "foreskin", - "forsenic", "forensic", - "forskaen", "forsaken", - "forsting", "frosting", - "fortitue", "fortitude", - "fortunae", "fortune", - "fortunte", "fortune", - "forumlas", "formulas", - "forunner", "forerunner", - "fossiles", "fossils", - "fossilis", "fossils", - "foundary", "foundry", - "fountian", "fountain", - "fourties", "forties", - "fowrards", "forwards", - "frackign", "fracking", - "framgent", "fragment", - "franches", "franchise", - "franchie", "franchises", - "franciso", "francisco", - "frankiln", "franklin", - "franlkin", "franklin", - "freckels", "freckles", - "freindly", "friendly", - "frequeny", "frequency", - "friendle", "friendlies", - "friendsi", "friendlies", - "frimware", "firmware", - "frogiven", "forgiven", - "frointer", "frontier", - "fromerly", "formerly", - "froniter", "frontier", - "fronteir", "frontier", - "frosaken", "forsaken", - "frutcose", "fructose", - "fucntion", "function", - "fufilled", "fulfilled", - "fulfiled", "fulfilled", - "fullfill", "fulfill", - "funciton", "function", - "fundirse", "fundies", - "funniliy", "funnily", - "funnilly", "funnily", - "furctose", "fructose", - "furition", "fruition", - "furuther", "further", - "futurers", "futures", - "futureus", "futures", - "gamemdoe", "gamemode", - "gamepaly", "gameplay", - "gamergat", "gamertag", - "gammeode", "gamemode", - "ganerate", "generate", - "garantee", "guarantee", - "gardient", "gradient", - "garfeild", "garfield", - "garfiled", "garfield", - "garflied", "garfield", - "garnison", "garrison", - "garrions", "garrison", - "garriosn", "garrison", - "garrsion", "garrison", - "gatherig", "gatherings", - "gauarana", "guaraná", - "gauntelt", "gauntlet", - "gauntles", "gauntlets", - "gaurdian", "guardian", - "gaurding", "guarding", - "gautnlet", "gauntlet", - "gemoetry", "geometry", - "generaly", "generally", - "generase", "generates", - "generats", "generates", - "genialia", "genitalia", - "genisues", "geniuses", - "genitala", "genitalia", - "genrates", "generates", - "gentials", "genitals", - "gentlemn", "gentlemen", - "genuises", "geniuses", - "geograpy", "geography", - "geomerty", "geometry", - "geomtery", "geometry", - "germanos", "germans", - "germanus", "germans", - "gernades", "grenades", - "giagbyte", "gigabyte", - "gigabtye", "gigabyte", - "gigaybte", "gigabyte", - "gigbayte", "gigabyte", - "gignatic", "gigantic", - "giltched", "glitched", - "giltches", "glitches", - "girafffe", "giraffe", - "girefing", "griefing", - "girlling", "grilling", - "gladiatr", "gladiator", - "glichted", "glitched", - "glichtes", "glitches", - "glicthed", "glitched", - "glicthes", "glitches", - "glitchey", "glitchy", - "glitchly", "glitchy", - "glitchty", "glitchy", - "glithced", "glitched", - "glithces", "glitches", - "gloablly", "globally", - "glodberg", "goldberg", - "glodfish", "goldfish", - "gloriuos", "glorious", - "gltiched", "glitched", - "gltiches", "glitches", - "gmaertag", "gamertag", - "goblings", "goblins", - "goddammn", "goddamn", - "goddammt", "goddammit", - "godesses", "goddesses", - "godlberg", "goldberg", - "godlfish", "goldfish", - "godounov", "godunov", - "godpseed", "godspeed", - "godspede", "godspeed", - "goldifsh", "goldfish", - "gonewidl", "gonewild", - "goodlcuk", "goodluck", - "goregous", "gorgeous", - "gorgoeus", "gorgeous", - "gorillia", "gorilla", - "gorillla", "gorilla", - "gospells", "gospels", - "gottleib", "gottlieb", - "gourmelt", "gourmet", - "gourment", "gourmet", - "gouvener", "governor", - "govement", "government", - "goverend", "governed", - "govermet", "goverment", - "governer", "governor", - "gradualy", "gradually", - "grafield", "garfield", - "grafitti", "graffiti", - "grahpics", "graphics", - "grahpite", "graphite", - "graident", "gradient", - "granolla", "granola", - "graphcis", "graphics", - "grapichs", "graphics", - "grappnel", "grapple", - "greandes", "grenades", - "greatful", "grateful", - "greeneer", "greener", - "greenhoe", "greenhouse", - "greenlad", "greenland", - "greenore", "greener", - "greusome", "gruesome", - "grieifng", "griefing", - "grifeing", "griefing", - "grizzlay", "grizzly", - "grizzley", "grizzly", - "grpahics", "graphics", - "grpahite", "graphite", - "gruseome", "gruesome", - "guantano", "guantanamo", - "guardain", "guardian", - "guardias", "guardians", - "guaridan", "guardian", - "guerrila", "guerrilla", - "guidence", "guidance", - "guiseppe", "giuseppe", - "guitards", "guitars", - "guitares", "guitars", - "guitarit", "guitarist", - "gullbile", "gullible", - "gunanine", "guanine", - "guniness", "guinness", - "gunniess", "guinness", - "guradian", "guardian", - "gurading", "guarding", - "gurantee", "guarantee", - "guresome", "gruesome", - "guttaral", "guttural", - "gutteral", "guttural", - "hacthing", "hatching", - "hafltime", "halftime", - "haircuit", "haircut", - "halfitme", "halftime", - "hallowen", "halloween", - "hamburgr", "hamburgers", - "hamitlon", "hamilton", - "hamliton", "hamilton", - "handcufs", "handcuffs", - "handeldy", "handedly", - "handlade", "handled", - "handlare", "handler", - "handledy", "handedly", - "hannbial", "hannibal", - "haording", "hoarding", - "hapening", "happening", - "happends", "happens", - "happenes", "happens", - "happilly", "happily", - "harldine", "hardline", - "harrased", "harassed", - "harrases", "harasses", - "hatchign", "hatching", - "hatesink", "heatsink", - "hathcing", "hatching", - "headachs", "headaches", - "headests", "headsets", - "headhsot", "headshot", - "headseat", "headset", - "healthit", "healthiest", - "heastink", "heatsink", - "heathern", "heathen", - "heatskin", "heatsink", - "heaviliy", "heavily", - "heavilly", "heavily", - "heavnely", "heavenly", - "hedeghog", "hedgehog", - "hegdehog", "hedgehog", - "heighest", "heights", - "heighted", "heightened", - "heirachy", "hierarchy", - "heistant", "hesitant", - "heistate", "hesitate", - "hellifre", "hellfire", - "helluvva", "helluva", - "helpfull", "helpful", - "heratige", "heritage", - "herclues", "hercules", - "heridity", "heredity", - "heroicas", "heroics", - "heroices", "heroics", - "heroicos", "heroics", - "heroicus", "heroics", - "hertiage", "heritage", - "herucles", "hercules", - "hestiant", "hesitant", - "hestiate", "hesitate", - "heveanly", "heavenly", - "hierachy", "hierarchy", - "hierarcy", "hierarchy", - "highlane", "highlander", - "hindiusm", "hinduism", - "hindusim", "hinduism", - "hinudism", "hinduism", - "hiptsers", "hipsters", - "hispanis", "hispanics", - "hispters", "hipsters", - "histroic", "historic", - "hodlings", "holdings", - "hoenstly", "honestly", - "hoildays", "holidays", - "holdiays", "holidays", - "hollywod", "hollywood", - "homeword", "homeworld", - "homineim", "hominem", - "homineum", "hominem", - "honeslty", "honestly", - "honeymon", "honeymoon", - "honsetly", "honestly", - "hopefuly", "hopefully", - "hopkings", "hopkins", - "hopsital", "hospital", - "horading", "hoarding", - "horzions", "horizons", - "hosptial", "hospital", - "hosteles", "hostels", - "hostiliy", "hostility", - "hotshoot", "hotshot", - "hotsport", "hotspot", - "hsyteria", "hysteria", - "htaching", "hatching", - "htiboxes", "hitboxes", - "huanting", "haunting", - "humaniod", "humanoid", - "humanite", "humanities", - "humantiy", "humanity", - "humerous", "humorous", - "huminoid", "humanoid", - "humitidy", "humidity", - "humoural", "humoral", - "humouros", "humorous", - "humurous", "humorous", - "hunderds", "hundreds", - "hundread", "hundred", - "hungarin", "hungarian", - "huntmsan", "huntsman", - "hutnsman", "huntsman", - "hybrides", "hybrids", - "hybridus", "hybrids", - "hydorgen", "hydrogen", - "hydratin", "hydration", - "hydregon", "hydrogen", - "hygience", "hygiene", - "hygienne", "hygiene", - "hyperbel", "hyperbole", - "hypocrit", "hypocrite", - "hyponsis", "hypnosis", - "hyrdogen", "hydrogen", - "icefrong", "icefrog", - "icelings", "ceilings", - "idaeidae", "idea", - "idealogy", "ideology", - "idealsim", "idealism", - "idenfity", "identify", - "idenitfy", "identify", - "identite", "identities", - "ideologe", "ideologies", - "illiegal", "illegal", - "illinios", "illinois", - "illionis", "illinois", - "illnesss", "illnesses", - "illumini", "illuminati", - "illustre", "illustrate", - "illution", "illusion", - "ilogical", "illogical", - "ilterate", "literate", - "imapired", "impaired", - "imgrants", "migrants", - "imigrant", "emigrant", - "immboile", "immobile", - "immenint", "imminent", - "immersie", "immerse", - "immersve", "immerse", - "immitate", "imitate", - "immoblie", "immobile", - "immortas", "immortals", - "impactes", "impacts", - "impactos", "impacts", - "imparied", "impaired", - "imperavi", "imperative", - "imperfet", "imperfect", - "implemet", "implements", - "implosed", "implode", - "impluses", "impulses", - "imporper", "improper", - "importas", "imports", - "importen", "importance", - "importes", "imports", - "imporved", "improved", - "imporves", "improves", - "impropre", "improper", - "improted", "imported", - "improvie", "improvised", - "impusles", "impulses", - "imrpoved", "improved", - "imrpoves", "improves", - "inbetwen", "inbetween", - "inclince", "incline", - "inclinde", "incline", - "includng", "including", - "incorect", "incorrect", - "incuding", "including", - "inculded", "included", - "indianas", "indians", - "indiands", "indians", - "indiania", "indiana", - "indianna", "indiana", - "indianos", "indians", - "indicato", "indication", - "indicats", "indicators", - "indonesa", "indonesia", - "indulgue", "indulge", - "infantis", "infants", - "infantus", "infants", - "infarred", "infrared", - "infectin", "infections", - "infermon", "inferno", - "infiltre", "infiltrate", - "infintie", "infinite", - "infintiy", "infinity", - "inflatie", "inflate", - "influens", "influences", - "informas", "informs", - "informis", "informs", - "infromal", "informal", - "infromed", "informed", - "ingenius", "ingenious", - "ingition", "ignition", - "ingorant", "ignorant", - "inheriet", "inherit", - "inherint", "inherit", - "inhumaan", "inhuman", - "inhumain", "inhuman", - "inifnite", "infinite", - "inifnity", "infinity", - "inisghts", "insights", - "initails", "initials", - "initaite", "initiate", - "initaled", "initialed", - "initally", "initially", - "initialy", "initially", - "initmacy", "intimacy", - "initmate", "intimate", - "injustie", "injustices", - "inlcuded", "included", - "inlcudes", "includes", - "innocens", "innocents", - "innocuos", "innocuous", - "innvoate", "innovate", - "inocence", "innocence", - "inpolite", "impolite", - "inpsired", "inspired", - "inquirey", "inquiry", - "inquirie", "inquire", - "inquiriy", "inquiry", - "inrested", "inserted", - "insanley", "insanely", - "insectes", "insects", - "insectos", "insects", - "insertas", "inserts", - "insertes", "inserts", - "insertos", "inserts", - "insidios", "insidious", - "insigths", "insights", - "insipred", "inspired", - "insipres", "inspires", - "insistas", "insists", - "insistes", "insists", - "insistis", "insists", - "insmonia", "insomnia", - "insomina", "insomnia", - "insonmia", "insomnia", - "inspried", "inspired", - "inspries", "inspires", - "instanse", "instances", - "instanty", "instantly", - "instered", "inserted", - "insticnt", "instinct", - "instincs", "instincts", - "institue", "institute", - "insultas", "insults", - "insultes", "insults", - "insultos", "insults", - "intamicy", "intimacy", - "intamite", "intimate", - "intendes", "intends", - "intendos", "intends", - "intentas", "intents", - "intented", "intended", - "interace", "interacted", - "interacs", "interacts", - "interect", "interacted", - "interent", "internet", - "interese", "interested", - "interfce", "interface", - "intergal", "integral", - "internts", "interns", - "internus", "interns", - "interpet", "interpret", - "interrim", "interim", - "interste", "interstate", - "interupt", "interrupt", - "intevene", "intervene", - "intially", "initially", - "intiials", "initials", - "intimaty", "intimately", - "intimide", "intimidate", - "intregal", "integral", - "intriuge", "intrigue", - "introdue", "introduces", - "introdus", "introduces", - "introvet", "introvert", - "intruige", "intrigue", - "intutive", "intuitive", - "inudstry", "industry", - "inventer", "inventor", - "invertes", "inverse", - "invincil", "invincible", - "invitato", "invitation", - "invloved", "involved", - "invloves", "involves", - "invovled", "involved", - "invovles", "involves", - "iranains", "iranians", - "iraninas", "iranians", - "iritable", "irritable", - "iritated", "irritated", - "ironicly", "ironically", - "irritato", "irritation", - "isalmist", "islamist", - "isarelis", "israelis", - "islamits", "islamist", - "islamsit", "islamist", - "islandes", "islanders", - "ismalist", "islamist", - "isntalls", "installs", - "isolatie", "isolate", - "israelli", "israeli", - "israleis", "israelis", - "isralies", "israelis", - "isrealis", "israelis", - "issueing", "issuing", - "italains", "italians", - "jaguards", "jaguars", - "jaguares", "jaguars", - "jailbrek", "jailbreak", - "jaimacan", "jamaican", - "jamacain", "jamaican", - "jamaicia", "jamaica", - "jamiacan", "jamaican", - "januaray", "january", - "janurary", "january", - "jeapardy", "jeopardy", - "jefferry", "jeffery", - "jefferty", "jeffery", - "jennigns", "jennings", - "jeoprady", "jeopardy", - "jepoardy", "jeopardy", - "jerusalm", "jerusalem", - "jewelrey", "jewelry", - "jewllery", "jewellery", - "joanthan", "jonathan", - "joepardy", "jeopardy", - "johanine", "johannine", - "jonatahn", "jonathan", - "journaal", "journal", - "journied", "journeyed", - "journies", "journeys", - "joysitck", "joystick", - "juadaism", "judaism", - "judaisim", "judaism", - "judgemet", "judgements", - "juducial", "judicial", - "jugnling", "jungling", - "junglign", "jungling", - "junlging", "jungling", - "justifiy", "justify", - "juveline", "juvenile", - "juvenlie", "juvenile", - "katemine", "ketamine", - "kennedey", "kennedy", - "ketmaine", "ketamine", - "keybaord", "keyboard", - "keyboars", "keyboards", - "keyborad", "keyboard", - "keychian", "keychain", - "kicthens", "kitchens", - "kindgoms", "kingdoms", - "kittiens", "kitties", - "knockbak", "knockback", - "knowlege", "knowledge", - "knuckels", "knuckles", - "koreanos", "koreans", - "kunckles", "knuckles", - "kurdisch", "kurdish", - "labatory", "lavatory", - "labenese", "lebanese", - "laboraty", "laboratory", - "laguages", "languages", - "landscae", "landscapes", - "langauge", "language", - "lanucher", "launcher", - "lanuches", "launches", - "laodouts", "loadouts", - "larwence", "lawrence", - "lasagnea", "lasagna", - "lasagnia", "lasagna", - "laucnhed", "launched", - "laucnher", "launcher", - "laucnhes", "launches", - "laundrey", "laundry", - "lawernce", "lawrence", - "lazyness", "laziness", - "leaglize", "legalize", - "lecteurs", "lectures", - "lecutres", "lectures", - "lefitsts", "leftists", - "leftsits", "leftists", - "legenday", "legendary", - "legionis", "legions", - "legitimt", "legitimate", - "lengthes", "lengths", - "lengthly", "lengthy", - "lentiles", "lentils", - "lentills", "lentils", - "lesbains", "lesbians", - "lesibans", "lesbians", - "levander", "lavender", - "levelign", "leveling", - "levetate", "levitate", - "leviathn", "leviathan", - "levleing", "leveling", - "liberato", "liberation", - "libertae", "liberate", - "libertea", "liberate", - "librarse", "libraries", - "licencie", "licence", - "licencse", "licence", - "liebrals", "liberals", - "liekable", "likeable", - "lifepsan", "lifespan", - "lifestel", "lifesteal", - "lifestye", "lifestyle", - "lighitng", "lighting", - "lightnig", "lightning", - "lightres", "lighters", - "lightrom", "lightroom", - "ligthers", "lighters", - "ligthing", "lighting", - "likebale", "likeable", - "limitant", "militant", - "limitato", "limitation", - "lincolin", "lincoln", - "lincolon", "lincoln", - "lineupes", "lineups", - "lingeire", "lingerie", - "lingiere", "lingerie", - "linnaena", "linnaean", - "lipstics", "lipsticks", - "liquidas", "liquids", - "liquides", "liquids", - "liquidos", "liquids", - "liscense", "license", - "lisenced", "silenced", - "listenes", "listens", - "listents", "listens", - "listners", "listeners", - "litature", "literature", - "litecion", "litecoin", - "liteicon", "litecoin", - "literaly", "literally", - "lithuana", "lithuania", - "litigato", "litigation", - "liverpol", "liverpool", - "logtiech", "logitech", - "longitme", "longtime", - "longtiem", "longtime", - "looseley", "loosely", - "loreplay", "roleplay", - "luanched", "launched", - "luancher", "launcher", - "luanches", "launches", - "lubricat", "lubricant", - "lucifear", "lucifer", - "luckilly", "luckily", - "macarino", "macaroni", - "machiens", "machines", - "mackeral", "mackerel", - "macthups", "matchups", - "magasine", "magazine", - "magazins", "magazines", - "magentic", "magnetic", - "magicain", "magician", - "magisine", "magazine", - "magizine", "magazine", - "magnetis", "magnets", - "magnited", "magnitude", - "magnitue", "magnitude", - "mainfest", "manifest", - "maintian", "maintain", - "majoroty", "majority", - "makrsman", "marksman", - "malariya", "malaria", - "malasiya", "malaysia", - "malasyia", "malaysia", - "malayisa", "malaysia", - "malyasia", "malaysia", - "mamalian", "mammalian", - "manadrin", "mandarin", - "manaully", "manually", - "mandaste", "mandates", - "mandrain", "mandarin", - "mandrian", "mandarin", - "maneveur", "maneuver", - "manevuer", "maneuver", - "manfiest", "manifest", - "mangetic", "magnetic", - "manglade", "mangled", - "manifeso", "manifesto", - "manipule", "manipulate", - "manouver", "maneuver", - "manuales", "manuals", - "manuever", "maneuver", - "maraconi", "macaroni", - "maradeur", "marauder", - "maraduer", "marauder", - "maragret", "margaret", - "marbleds", "marbles", - "margerat", "margaret", - "margines", "margins", - "margings", "margins", - "marginis", "margins", - "marignal", "marginal", - "marilyin", "marilyn", - "marinens", "marines", - "markedet", "marketed", - "markeras", "markers", - "markerts", "markers", - "marniers", "mariners", - "marraige", "marriage", - "marryied", "married", - "marskman", "marksman", - "maruader", "marauder", - "marvelos", "marvelous", - "marxisim", "marxism", - "mascarra", "mascara", - "massacer", "massacre", - "massarce", "massacre", - "massasge", "massages", - "masscare", "massacre", - "masteris", "masteries", - "masturbe", "masturbate", - "materias", "materials", - "mathcups", "matchups", - "mathewes", "mathews", - "matieral", "material", - "matterss", "mattress", - "mauarder", "marauder", - "maximini", "maximizing", - "mayalsia", "malaysia", - "maybelle", "maybelline", - "maylasia", "malaysia", - "mccarhty", "mccarthy", - "mcgergor", "mcgregor", - "mchanics", "mechanics", - "mclarean", "mclaren", - "mcreggor", "mcgregor", - "meagtron", "megatron", - "meancing", "menacing", - "meaninng", "meaning", - "meatbals", "meatballs", - "mecahnic", "mechanic", - "mechanim", "mechanism", - "mechanis", "mechanics", - "medacine", "medicine", - "medatite", "meditate", - "medeival", "medieval", - "medevial", "medieval", - "mediavel", "medieval", - "medicaly", "medically", - "mediciad", "medicaid", - "medicins", "medicines", - "medicore", "mediocre", - "medievel", "medieval", - "mediocer", "mediocre", - "mediocry", "mediocrity", - "mediorce", "mediocre", - "meditato", "meditation", - "mediveal", "medieval", - "medoicre", "mediocre", - "meerkrat", "meerkat", - "megatorn", "megatron", - "meidcare", "medicare", - "meixcans", "mexicans", - "melboure", "melbourne", - "meltodwn", "meltdown", - "memoriez", "memorize", - "mencaing", "menacing", - "menstrul", "menstrual", - "mentiong", "mentioning", - "meoldies", "melodies", - "merchans", "merchants", - "mercurcy", "mercury", - "mercurey", "mercury", - "merficul", "merciful", - "merhcant", "merchant", - "mericful", "merciful", - "messgaed", "messaged", - "messiach", "messiah", - "metagaem", "metagame", - "metahpor", "metaphor", - "metamage", "metagame", - "methapor", "metaphor", - "metldown", "meltdown", - "metricas", "metrics", - "metrices", "metrics", - "metropos", "metropolis", - "mexcians", "mexicans", - "mexicain", "mexican", - "mhytical", "mythical", - "michagan", "michigan", - "michgian", "michigan", - "microtax", "microatx", - "microwae", "microwaves", - "midfeild", "midfield", - "midfiled", "midfield", - "midifeld", "midfield", - "migrains", "migraines", - "migriane", "migraine", - "milennia", "millennia", - "miligram", "milligram", - "miliitas", "militias", - "miliraty", "military", - "militais", "militias", - "millenia", "millennia", - "millenna", "millennia", - "miltiant", "militant", - "minature", "miniature", - "mindcrak", "mindcrack", - "minerial", "mineral", - "mingiame", "minigame", - "minimage", "minigame", - "minimals", "minimalist", - "minimalt", "minimalist", - "minimini", "minimizing", - "minimium", "minimum", - "miniscue", "miniscule", - "minsiter", "minister", - "minsitry", "ministry", - "miraculu", "miraculous", - "miralces", "miracles", - "mircales", "miracles", - "mircoatx", "microatx", - "mirgaine", "migraine", - "mirorred", "mirrored", - "misnadry", "misandry", - "misogynt", "misogynist", - "missigno", "mission", - "missiony", "missionary", - "misslies", "missiles", - "missorui", "missouri", - "misspeld", "misspelled", - "mistakey", "mistakenly", - "mistread", "mistreated", - "mobiltiy", "mobility", - "moderats", "moderates", - "modulair", "modular", - "moleculs", "molecules", - "momentos", "moments", - "momentus", "moments", - "monagomy", "monogamy", - "mongoles", "mongols", - "mongolos", "mongols", - "monitord", "monitored", - "monogmay", "monogamy", - "monolite", "monolithic", - "monologe", "monologue", - "monolopy", "monopoly", - "monoploy", "monopoly", - "monopols", "monopolies", - "monrachy", "monarchy", - "monstros", "monstrous", - "montaban", "montana", - "montains", "mountains", - "montanha", "montana", - "montania", "montana", - "montanna", "montana", - "montanta", "montana", - "montanya", "montana", - "montaran", "montana", - "monteize", "monetize", - "monteral", "montreal", - "montiors", "monitors", - "montnana", "montana", - "montypic", "monotypic", - "monumnet", "monument", - "moonligt", "moonlight", - "moprhine", "morphine", - "morbildy", "morbidly", - "mordibly", "morbidly", - "morevoer", "moreover", - "morhpine", "morphine", - "moribdly", "morbidly", - "mormones", "mormons", - "mormonts", "mormons", - "moroever", "moreover", - "morotola", "motorola", - "morphein", "morphine", - "morriosn", "morrison", - "morrocco", "morocco", - "morrsion", "morrison", - "mortards", "mortars", - "mortarts", "mortars", - "moruning", "mourning", - "mosnters", "monsters", - "mosqueto", "mosquitoes", - "mosquite", "mosquitoes", - "mosqutio", "mosquito", - "motoroal", "motorola", - "mounment", "monument", - "mounring", "mourning", - "mountian", "mountain", - "moustace", "moustache", - "movesped", "movespeed", - "mozillia", "mozilla", - "mozillla", "mozilla", - "msytical", "mystical", - "mucnhies", "munchies", - "mudering", "murdering", - "muffings", "muffins", - "muffinus", "muffins", - "mulitple", "multiple", - "mulitply", "multiply", - "multiplr", "multiplier", - "multipls", "multiples", - "mundance", "mundane", - "mundande", "mundane", - "muniches", "munchies", - "murderes", "murders", - "murderus", "murders", - "muscluar", "muscular", - "muscualr", "muscular", - "musicaly", "musically", - "musuclar", "muscular", - "mutliple", "multiple", - "mutliply", "multiply", - "myhtical", "mythical", - "mysitcal", "mystical", - "mysogyny", "misogyny", - "mysteris", "mysteries", - "mythraic", "mithraic", - "nagivate", "navigate", - "naopleon", "napoleon", - "napcakes", "pancakes", - "naploeon", "napoleon", - "napoelon", "napoleon", - "napolean", "napoleon", - "napoloen", "napoleon", - "narcissm", "narcissism", - "narcisst", "narcissist", - "narcotis", "narcotics", - "narwharl", "narwhal", - "naseuous", "nauseous", - "nashvile", "nashville", - "nasueous", "nauseous", - "natievly", "natively", - "nationas", "nationals", - "nationsl", "nationals", - "nativley", "natively", - "natuilus", "nautilus", - "naturaly", "naturally", - "naturels", "natures", - "naturely", "naturally", - "naturens", "natures", - "naturual", "natural", - "nauesous", "nauseous", - "naughtly", "naughty", - "nauitlus", "nautilus", - "nauseuos", "nauseous", - "nautiuls", "nautilus", - "nautlius", "nautilus", - "nautulis", "nautilus", - "naviagte", "navigate", - "navigato", "navigation", - "nazereth", "nazareth", - "necesary", "necessary", - "neckbead", "neckbeard", - "needlees", "needles", - "nefarios", "nefarious", - "negativy", "negativity", - "neglectn", "neglecting", - "neglible", "negligible", - "neigbour", "neighbour", - "neolitic", "neolithic", - "netboook", "netbook", - "neuronas", "neurons", - "neutraal", "neutral", - "neutralt", "neutrality", - "neutraly", "neutrality", - "newcaste", "newcastle", - "nickanme", "nickname", - "nickmane", "nickname", - "nieghbor", "neighbor", - "nightime", "nighttime", - "nightley", "nightly", - "nightlie", "nightlife", - "nihilsim", "nihilism", - "nilihism", "nihilism", - "nirtogen", "nitrogen", - "nirvanna", "nirvana", - "nitorgen", "nitrogen", - "niusance", "nuisance", - "noctrune", "nocturne", - "noctunre", "nocturne", - "nocturen", "nocturne", - "nominato", "nomination", - "nonsence", "nonsense", - "nonsesne", "nonsense", - "noramlly", "normally", - "norhtern", "northern", - "normalis", "normals", - "normalls", "normals", - "normalos", "normals", - "northeat", "northeast", - "northren", "northern", - "northwet", "northwest", - "norwegin", "norwegian", - "nostalga", "nostalgia", - "nostirls", "nostrils", - "notabley", "notably", - "notablly", "notably", - "noteable", "notable", - "noteably", "notably", - "noticabe", "noticable", - "notorios", "notorious", - "novmeber", "november", - "nromandy", "normandy", - "nuatilus", "nautilus", - "nuculear", "nuclear", - "nuetered", "neutered", - "nuisanse", "nuisance", - "nullifiy", "nullify", - "nurtient", "nutrient", - "nusaince", "nuisance", - "nusiance", "nuisance", - "nutirent", "nutrient", - "nutriens", "nutrients", - "nuturing", "nurturing", - "obdisian", "obsidian", - "obediant", "obedient", - "obession", "obsession", - "obilvion", "oblivion", - "obisdian", "obsidian", - "obsessie", "obsessive", - "obsessin", "obsession", - "obsidain", "obsidian", - "obstacal", "obstacle", - "obvilion", "oblivion", - "ocasions", "occasions", - "ocassion", "occasion", - "occaison", "occasion", - "occupato", "occupation", - "occuring", "occurring", - "octobear", "october", - "octopuns", "octopus", - "ofcoruse", "ofcourse", - "ofcoures", "ofcourse", - "ofcousre", "ofcourse", - "ofcrouse", "ofcourse", - "officals", "officials", - "officaly", "officially", - "offsited", "offside", - "ofocurse", "ofcourse", - "oligarcy", "oligarchy", - "olmypics", "olympics", - "olymipcs", "olympics", - "olypmics", "olympics", - "ommision", "omission", - "ommiting", "omitting", - "ommitted", "omitted", - "ongewild", "gonewild", - "onslaugt", "onslaught", - "operatie", "operative", - "opinoins", "opinions", - "oppinion", "opinion", - "opponant", "opponent", - "opposits", "opposites", - "oppossed", "opposed", - "oppresso", "oppression", - "optimaal", "optimal", - "optomism", "optimism", - "oragnise", "organise", - "orangerd", "orangered", - "orangers", "oranges", - "orangism", "organism", - "orchesta", "orchestra", - "ordianry", "ordinary", - "oreintal", "oriental", - "orgainse", "organise", - "orgainze", "organize", - "organims", "organism", - "organsie", "organise", - "organsim", "organism", - "organzie", "organize", - "orgasmes", "orgasms", - "orgasmos", "orgasms", - "orgasmus", "orgasms", - "orginize", "organise", - "orhtodox", "orthodox", - "oridnary", "ordinary", - "originas", "origins", - "origines", "origins", - "originsl", "originals", - "orphanes", "orphans", - "osbidian", "obsidian", - "othrodox", "orthodox", - "ourselvs", "ourselves", - "oustider", "outsider", - "outfeild", "outfield", - "outfidel", "outfield", - "outfiled", "outfield", - "outisder", "outsider", - "outplayd", "outplayed", - "outputed", "outputted", - "outsoure", "outsourced", - "overboad", "overboard", - "overclok", "overclock", - "overdrev", "overdrive", - "overhual", "overhaul", - "overlaod", "overload", - "overpiad", "overpaid", - "overules", "overuse", - "overwath", "overwatch", - "overwhem", "overwhelm", - "oximoron", "oxymoron", - "oylmpics", "olympics", - "pacakged", "packaged", - "packadge", "packaged", - "paficist", "pacifist", - "painfuly", "painfully", - "paitence", "patience", - "paitents", "patients", - "palidans", "paladins", - "palstics", "plastics", - "paltform", "platform", - "paltinum", "platinum", - "palyable", "playable", - "palyoffs", "playoffs", - "pancaeks", "pancakes", - "panckaes", "pancakes", - "pandoria", "pandora", - "pandorra", "pandora", - "panedmic", "pandemic", - "panethon", "pantheon", - "pankaces", "pancakes", - "panmedic", "pandemic", - "pantehon", "pantheon", - "panthoen", "pantheon", - "paradies", "paradise", - "paradyse", "parades", - "paragrah", "paragraph", - "paraiste", "parasite", - "paralell", "parallel", - "paralely", "parallelly", - "paralles", "parallels", - "parameds", "paramedics", - "paramter", "parameter", - "paranioa", "paranoia", - "paraniod", "paranoid", - "paraside", "paradise", - "parasits", "parasites", - "parastie", "parasite", - "parctise", "practise", - "paremsan", "parmesan", - "paristan", "partisan", - "parmasen", "parmesan", - "parmenas", "parmesan", - "parmsean", "parmesan", - "parnters", "partners", - "parralel", "parallel", - "parterns", "partners", - "partialy", "partially", - "partians", "partisan", - "partical", "particular", - "particel", "particle", - "partiets", "parties", - "partiots", "patriots", - "partnerd", "partnered", - "partsian", "partisan", - "passabel", "passable", - "passione", "passionate", - "passisve", "passives", - "passpost", "passports", - "passvies", "passives", - "passwors", "passwords", - "pasttime", "pastime", - "pastural", "pastoral", - "pateince", "patience", - "pateints", "patients", - "patethic", "pathetic", - "patheitc", "pathetic", - "patienty", "patiently", - "patirots", "patriots", - "patriarh", "patriarchy", - "patroits", "patriots", - "patrolls", "patrols", - "patronas", "patrons", - "patrones", "patrons", - "patronis", "patrons", - "patronos", "patrons", - "pattened", "patented", - "patterno", "patterson", - "pattersn", "patterson", - "pblisher", "publisher", - "peageant", "pageant", - "pebbleos", "pebbles", - "pebblers", "pebbles", - "pebblets", "pebbles", - "peciluar", "peculiar", - "pecuilar", "peculiar", - "peculair", "peculiar", - "peculure", "peculiar", - "peformed", "performed", - "peircing", "piercing", - "penaltis", "penalties", - "penatgon", "pentagon", - "penciles", "pencils", - "pendatic", "pedantic", - "pengiuns", "penguins", - "penisula", "peninsula", - "pensioen", "pension", - "pepperin", "pepperoni", - "perceded", "preceded", - "percente", "percentile", - "percieve", "perceive", - "percious", "precious", - "perclude", "preclude", - "perfecty", "perfectly", - "perfroms", "performs", - "perheaps", "perhaps", - "pericing", "piercing", - "peridoic", "periodic", - "perimetr", "perimeter", - "periodes", "periods", - "periodos", "periods", - "permanet", "permanent", - "permiere", "premiere", - "permises", "premises", - "permitas", "permits", - "permites", "permits", - "permitis", "permits", - "permitts", "permits", - "permiums", "premiums", - "peroidic", "periodic", - "perosnas", "personas", - "perpetue", "perpetuate", - "persaude", "persuade", - "perserve", "preserve", - "persisit", "persist", - "personel", "personnel", - "persones", "persons", - "personis", "persons", - "personsa", "personas", - "perstige", "prestige", - "persuaso", "persuasion", - "persuded", "persuaded", - "persuing", "pursuing", - "persuits", "pursuits", - "persumed", "presumed", - "pertaing", "pertaining", - "pertians", "pertains", - "pertinet", "pertinent", - "pervents", "prevents", - "perverst", "pervert", - "perviews", "previews", - "pervious", "previous", - "perxoide", "peroxide", - "pessiary", "pessary", - "petetion", "petition", - "petrolem", "petroleum", - "phantoom", "phantom", - "pharamcy", "pharmacy", - "pharmacs", "pharmacist", - "pharmsci", "pharmacist", - "phenomon", "phenomenon", - "phramacy", "pharmacy", - "phsyical", "physical", - "phsyique", "physique", - "phyiscal", "physical", - "phyisque", "physique", - "physcial", "physical", - "physicis", "physicians", - "physicks", "physics", - "physicts", "physicist", - "physqiue", "physique", - "picthers", "pitchers", - "pillards", "pillars", - "pillaris", "pillars", - "pinancle", "pinnacle", - "pinapple", "pineapple", - "pinnalce", "pinnacle", - "pinnaple", "pineapple", - "pinncale", "pinnacle", - "pinpiont", "pinpoint", - "pinteret", "pinterest", - "piolting", "piloting", - "pioneeer", "pioneer", - "pithcers", "pitchers", - "placebro", "placebo", - "placemet", "placements", - "planetas", "planets", - "planetos", "planets", - "plantiff", "plaintiff", - "plantium", "platinum", - "plasitcs", "plastics", - "platfrom", "platform", - "platimun", "platinum", - "platnium", "platinum", - "platnuim", "platinum", - "plausibe", "plausible", - "playbody", "playboy", - "playstye", "playstyle", - "pleasent", "pleasant", - "plehtora", "plethora", - "pleothra", "plethora", - "plethroa", "plethora", - "ploygamy", "polygamy", - "pnatheon", "pantheon", - "poeoples", "peoples", - "poingant", "poignant", - "pointeur", "pointer", - "pointure", "pointer", - "poisones", "poisons", - "poisonis", "poisons", - "poisonos", "poisons", - "poisonus", "poisons", - "polgyamy", "polygamy", - "polietly", "politely", - "politing", "piloting", - "politley", "politely", - "poltical", "political", - "poluting", "polluting", - "polution", "pollution", - "polygoon", "polygon", - "polymore", "polymer", - "pomotion", "promotion", - "popoulus", "populous", - "populair", "popular", - "populare", "popular", - "populary", "popularity", - "porcelan", "porcelain", - "porposes", "proposes", - "portabel", "portable", - "portalis", "portals", - "portalus", "portals", - "portayed", "portrayed", - "portgual", "portugal", - "portrais", "portraits", - "portrary", "portray", - "portrayl", "portrayal", - "portriat", "portrait", - "posessed", "possessed", - "posesses", "possesses", - "posioned", "poisoned", - "positivs", "positives", - "positivy", "positivity", - "possable", "possible", - "possably", "possibly", - "possbily", "possibly", - "posseses", "possesses", - "possesse", "possessive", - "possesss", "possesses", - "potrayed", "portrayed", - "poverful", "powerful", - "powerded", "powdered", - "powerpot", "powerpoint", - "pracitse", "practise", - "practial", "practical", - "practies", "practise", - "pratcise", "practise", - "praticle", "particle", - "prceeded", "preceded", - "preadtor", "predator", - "preample", "preamble", - "preceeds", "precedes", - "precisie", "precise", - "precisly", "precisely", - "precisou", "precious", - "preculde", "preclude", - "predicat", "predict", - "predicte", "predictive", - "preferas", "prefers", - "prefered", "preferred", - "preferes", "prefers", - "preferis", "prefers", - "preferrs", "prefers", - "preimere", "premiere", - "preimums", "premiums", - "preiodic", "periodic", - "preivews", "previews", - "prejudis", "prejudices", - "prelayed", "replayed", - "premeire", "premiere", - "premesis", "premises", - "premiare", "premier", - "premines", "premise", - "premuims", "premiums", - "preorded", "preordered", - "preordes", "preorders", - "preoxide", "peroxide", - "prepaird", "prepaid", - "preqeuls", "prequels", - "prequles", "prequels", - "prescrie", "prescribed", - "presense", "presence", - "presenst", "presets", - "presidet", "presidents", - "presists", "persists", - "presitge", "prestige", - "presonas", "personas", - "presuade", "persuade", - "pretador", "predator", - "pretains", "pertains", - "preveiws", "previews", - "preverse", "perverse", - "previwes", "previews", - "pricipal", "principal", - "priciple", "principle", - "priemere", "premiere", - "priestes", "priests", - "primaris", "primaries", - "primarly", "primarily", - "princila", "principals", - "principl", "principals", - "prisitne", "pristine", - "probelms", "problems", - "probleem", "problem", - "procalim", "proclaim", - "proccess", "process", - "proceded", "proceeded", - "proceder", "procedure", - "procedes", "proceeds", - "procedue", "procedure", - "proceeed", "proceed", - "procesed", "proceeds", - "processs", "processes", - "proclami", "proclaim", - "procliam", "proclaim", - "procotol", "protocol", - "prodcuts", "products", - "producto", "production", - "profesor", "professor", - "proficit", "proficient", - "profilic", "prolific", - "progroms", "pogroms", - "prohibis", "prohibits", - "prohpecy", "prophecy", - "prohpets", "prophets", - "projecte", "projectile", - "projecto", "projection", - "prolouge", "prologue", - "promplty", "promptly", - "promptes", "prompts", - "promptus", "prompts", - "promtply", "promptly", - "pronoune", "pronounced", - "propechy", "prophecy", - "propehcy", "prophecy", - "propehts", "prophets", - "prophacy", "prophecy", - "propmted", "prompted", - "propmtly", "promptly", - "proponet", "proponents", - "proposse", "proposes", - "proposte", "propose", - "proprety", "property", - "propsect", "prospect", - "prosepct", "prospect", - "prostite", "prostitute", - "protable", "portable", - "protecte", "protective", - "protiens", "proteins", - "protines", "proteins", - "protocal", "protocol", - "prototye", "prototype", - "protrait", "portrait", - "protrays", "portrays", - "protugal", "portugal", - "proverai", "proverbial", - "providee", "providence", - "proximty", "proximity", - "pruchase", "purchase", - "pryamids", "pyramids", - "ptichers", "pitchers", - "pubisher", "publisher", - "publiser", "publisher", - "puinsher", "punisher", - "pulisher", "publisher", - "pumkpins", "pumpkins", - "pumpinks", "pumpkins", - "pumpknis", "pumpkins", - "punshier", "punisher", - "punsiher", "punisher", - "punsihes", "punishes", - "purcahse", "purchase", - "pyramind", "pyramid", - "pyrimads", "pyramids", - "pyrmaids", "pyramids", - "qauntity", "quantity", - "qualifiy", "qualify", - "quanitfy", "quantify", - "quantaty", "quantity", - "quantite", "quantities", - "quantuum", "quantum", - "quarante", "quarantine", - "quartery", "quarterly", - "qucikest", "quickest", - "queation", "equation", - "quention", "quentin", - "quickets", "quickest", - "quicklyu", "quickly", - "rabbitos", "rabbits", - "rabbitts", "rabbits", - "racistas", "racists", - "racistes", "racists", - "radaince", "radiance", - "rahpsody", "rhapsody", - "raidance", "radiance", - "railraod", "railroad", - "randomes", "randoms", - "randomez", "randomized", - "randomns", "randoms", - "randomrs", "randoms", - "randomus", "randoms", - "raosting", "roasting", - "raphsody", "rhapsody", - "raptores", "raptors", - "raspbery", "raspberry", - "rationel", "rationale", - "realible", "reliable", - "realibly", "reliably", - "realiest", "earliest", - "realisim", "realism", - "realisme", "realise", - "realistc", "realistic", - "realiste", "realise", - "realoded", "reloaded", - "realsied", "realised", - "realtion", "relation", - "realtive", "relative", - "reamined", "remained", - "reapired", "repaired", - "reaplugs", "earplugs", - "reaserch", "research", - "reasonal", "reasonably", - "reatiler", "retailer", - "reaveled", "revealed", - "rebellis", "rebellious", - "reboudns", "rebounds", - "rebounce", "rebound", - "rebuildt", "rebuilt", - "rebuplic", "republic", - "receeded", "receded", - "recepits", "receipts", - "receptie", "receptive", - "receptos", "receptors", - "receving", "receiving", - "recident", "resident", - "reciding", "residing", - "recieved", "received", - "reciever", "receiver", - "recieves", "receives", - "recipees", "recipes", - "recipets", "recipes", - "recogise", "recognise", - "recogize", "recognize", - "recognie", "recognizes", - "recomend", "recommend", - "recommed", "recommend", - "reconnet", "reconnect", - "rectange", "rectangle", - "rectifiy", "rectify", - "recuring", "recurring", - "recurits", "recruits", - "redeisgn", "redesign", - "redemeed", "redeemed", - "redesgin", "redesign", - "redesing", "redesign", - "reedemed", "redeemed", - "refeeres", "referees", - "refelcts", "reflects", - "refelxes", "reflexes", - "referede", "referee", - "referene", "referee", - "referens", "references", - "referere", "referee", - "referign", "refering", - "refering", "referring", - "refernce", "references", - "reffered", "referred", - "refilles", "refills", - "refillls", "refills", - "reflecte", "reflective", - "reflecto", "reflection", - "reformes", "reforms", - "refreing", "refering", - "refrence", "reference", - "refreshd", "refreshed", - "refreshr", "refresher", - "refromed", "reformed", - "regardes", "regards", - "regenade", "renegade", - "regenere", "regenerate", - "regiones", "regions", - "regisrty", "registry", - "registed", "registered", - "regresas", "regress", - "regreses", "regress", - "regresos", "regress", - "regresse", "regressive", - "regresso", "regression", - "regrests", "regress", - "regretts", "regrets", - "regsitry", "registry", - "regualrs", "regulars", - "regualte", "regulate", - "reguarly", "regularly", - "regulary", "regularly", - "regulatr", "regulator", - "regulats", "regulators", - "rehersal", "rehearsal", - "rehtoric", "rhetoric", - "reiceved", "recieved", - "reigment", "regiment", - "reigonal", "regional", - "rekenton", "renekton", - "relaible", "reliable", - "relaibly", "reliably", - "relaised", "realised", - "relaoded", "reloaded", - "relasped", "relapsed", - "relatabe", "relatable", - "relateds", "relates", - "relativy", "relativity", - "relavent", "relevant", - "relected", "reelected", - "relegato", "relegation", - "releived", "relieved", - "releiver", "reliever", - "relevent", "relevant", - "relfects", "reflects", - "relfexes", "reflexes", - "reliased", "realised", - "religous", "religious", - "relpased", "relapsed", - "remainds", "remains", - "remainig", "remaining", - "remannts", "remnants", - "remarkes", "remarks", - "remembed", "remembered", - "remembee", "remembered", - "rememebr", "remember", - "remenant", "remnant", - "reminent", "remnant", - "remmeber", "remember", - "remotley", "remotely", - "renderes", "renders", - "reneagde", "renegade", - "renetkon", "renekton", - "renewabe", "renewables", - "renketon", "renekton", - "renmants", "remnants", - "renoylds", "reynolds", - "renteris", "renters", - "renyolds", "reynolds", - "reowrked", "reworked", - "repaires", "repairs", - "repalces", "replaces", - "reparied", "repaired", - "repblics", "republics", - "repbulic", "republic", - "repeatae", "repeatable", - "repeates", "repeats", - "repetion", "repetition", - "repharse", "rephrase", - "repitles", "reptiles", - "replased", "relapsed", - "replayes", "replays", - "replicae", "replicated", - "replubic", "republic", - "reportes", "reporters", - "reposity", "repository", - "repostas", "reposts", - "repostes", "reposts", - "repostig", "reposting", - "repostus", "reposts", - "represet", "represents", - "represso", "repression", - "reprhase", "rephrase", - "repsects", "respects", - "repsonds", "responds", - "repsonse", "response", - "repsoted", "reposted", - "repubics", "republics", - "republis", "republics", - "repulics", "republics", - "repulsie", "repulsive", - "requiers", "requires", - "requieum", "requiem", - "requilme", "requiem", - "requried", "required", - "requries", "requires", - "rescuecd", "rescued", - "researce", "researcher", - "resembes", "resembles", - "reserach", "research", - "resevoir", "reservoir", - "resgined", "resigned", - "residude", "residue", - "residule", "residue", - "resinged", "resigned", - "resistas", "resists", - "resisten", "resistance", - "resistes", "resists", - "resloved", "resolved", - "resloves", "resolves", - "resmeble", "resemble", - "resotred", "restored", - "resourse", "resources", - "resovled", "resolved", - "resovles", "resolves", - "respecte", "respective", - "respesct", "respects", - "responce", "response", - "responed", "respond", - "respones", "response", - "responsd", "responds", - "respoted", "reposted", - "restanti", "restarting", - "restrait", "restraint", - "restrics", "restricts", - "resuable", "reusable", - "retailes", "retailers", - "retalier", "retailer", - "rethoric", "rhetoric", - "retirase", "retires", - "retireds", "retires", - "retireus", "retires", - "retireve", "retrieve", - "retreive", "retrieve", - "retrived", "retrieved", - "retunred", "returned", - "reuasble", "reusable", - "reveales", "reveals", - "reveiwed", "reviewed", - "reveiwer", "reviewer", - "revelaed", "revealed", - "revelant", "relevant", - "revelead", "revealed", - "reverals", "reversal", - "reviewes", "reviewers", - "revlover", "revolver", - "revloves", "revolves", - "revovler", "revolver", - "revovles", "revolves", - "rewatchd", "rewatched", - "rewitten", "rewritten", - "rewritte", "rewrite", - "rewtched", "wretched", - "reynlods", "reynolds", - "reyonlds", "reynolds", - "rhaposdy", "rhapsody", - "rhaspody", "rhapsody", - "rheotric", "rhetoric", - "righteos", "righteous", - "rigntone", "ringtone", - "ringotne", "ringtone", - "ritalian", "ritalin", - "rivalrly", "rivalry", - "roachers", "roaches", - "robberts", "robbers", - "robberys", "robbers", - "robocoop", "robocop", - "robocorp", "robocop", - "robocoup", "robocop", - "roelplay", "roleplay", - "roganism", "organism", - "rolepaly", "roleplay", - "romaanin", "romanian", - "romainan", "romanian", - "romanain", "romanian", - "romanica", "romania", - "rosettta", "rosetta", - "rostaing", "roasting", - "routeros", "routers", - "rutgerus", "rutgers", - "ryenolds", "reynolds", - "sacrifie", "sacrifice", - "saddends", "saddens", - "saddenes", "saddens", - "sadisitc", "sadistic", - "salaires", "salaries", - "sandales", "sandals", - "sandalls", "sandals", - "sandstom", "sandstorm", - "sanotrum", "santorum", - "santourm", "santorum", - "santroum", "santorum", - "santurom", "santorum", - "sapcebar", "spacebar", - "sapphrie", "sapphire", - "sarcasam", "sarcasm", - "sarcasim", "sarcasm", - "sarcastc", "sarcastic", - "sargeant", "sergeant", - "sasauges", "sausages", - "sasuages", "sausages", - "satelite", "satellite", - "satellie", "satellites", - "saterday", "saturday", - "satifies", "satisfies", - "satisfiy", "satisfy", - "satrical", "satirical", - "satruday", "saturday", - "saturdsy", "saturdays", - "sawstika", "swastika", - "scandlas", "scandals", - "scannign", "scanning", - "scarmble", "scramble", - "scepture", "scepter", - "schedual", "schedule", - "schoalrs", "scholars", - "scholary", "scholarly", - "schoodle", "schooled", - "scientic", "scientific", - "scientis", "scientist", - "scoprion", "scorpion", - "scorates", "socrates", - "scoripon", "scorpion", - "scorpoin", "scorpion", - "scostman", "scotsman", - "scratchs", "scratches", - "scriptue", "scriptures", - "scriptus", "scripts", - "scritped", "scripted", - "scroates", "socrates", - "scropion", "scorpion", - "scrpited", "scripted", - "scruitny", "scrutiny", - "scrunity", "scrutiny", - "sctosman", "scotsman", - "sculpter", "sculpture", - "scurtiny", "scrutiny", - "seahakws", "seahawks", - "seahwaks", "seahawks", - "seantors", "senators", - "sebastin", "sebastian", - "seceeded", "succeeded", - "secertly", "secretly", - "secrelty", "secretly", - "secretas", "secrets", - "secretos", "secrets", - "secruity", "security", - "secuirty", "security", - "sedereal", "sidereal", - "seldomly", "seldom", - "selectie", "selective", - "selfiers", "selfies", - "semestre", "semester", - "semseter", "semester", - "senarios", "scenarios", - "senerity", "serenity", - "seniores", "seniors", - "senisble", "sensible", - "sensibel", "sensible", - "sensores", "sensors", - "senstive", "sensitive", - "sentaors", "senators", - "sentiers", "sentries", - "sentinet", "sentient", - "sentinte", "sentient", - "sentires", "sentries", - "sentreis", "sentries", - "separato", "separation", - "separete", "seperate", - "sepearte", "seperate", - "seperate", "separate", - "seplling", "spelling", - "sepreate", "seperate", - "sepulcre", "sepulchre", - "serached", "searched", - "seraches", "searches", - "serentiy", "serenity", - "sergaent", "sergeant", - "settigns", "settings", - "seventen", "seventeen", - "severeal", "several", - "severeid", "severed", - "severide", "severed", - "severley", "severely", - "sexaully", "sexually", - "seziures", "seizures", - "sezuires", "seizures", - "shadoloo", "shadaloo", - "shangahi", "shanghai", - "shanghia", "shanghai", - "sharplay", "sharply", - "sharpley", "sharply", - "shawshak", "shawshank", - "shcolars", "scholars", - "shcooled", "schooled", - "sheilded", "shielded", - "shelterd", "sheltered", - "shelvers", "shelves", - "shelveys", "shelves", - "sherlcok", "sherlock", - "shetlers", "shelters", - "shfiting", "shifting", - "shifitng", "shifting", - "shifteer", "shifter", - "shileded", "shielded", - "shineing", "shining", - "shitstom", "shitstorm", - "shittoon", "shitton", - "shittown", "shitton", - "shleters", "shelters", - "shnaghai", "shanghai", - "shortend", "shortened", - "shotuout", "shoutout", - "shoudlnt", "shouldnt", - "shouldes", "shoulders", - "shoulndt", "shouldnt", - "shrapenl", "shrapnel", - "shrelock", "sherlock", - "shrinked", "shrunk", - "shrpanel", "shrapnel", - "shtiless", "shitless", - "shuoldnt", "shouldnt", - "sideboad", "sideboard", - "sidleine", "sideline", - "siezable", "sizeable", - "siezures", "seizures", - "signatue", "signatures", - "signfies", "signifies", - "signifiy", "signify", - "signigns", "signings", - "signular", "singular", - "silbings", "siblings", - "silicoln", "silicon", - "silicoon", "silicon", - "silimiar", "similiar", - "simialir", "similiar", - "simiilar", "similiar", - "similair", "similar", - "similari", "similiar", - "similart", "similarity", - "similary", "similarly", - "similiar", "similar", - "simliiar", "similiar", - "simluate", "simulate", - "simmilar", "similar", - "simpelst", "simplest", - "simplets", "simplest", - "simplicy", "simplicity", - "simplier", "simpler", - "simulato", "simulation", - "singlers", "singles", - "singluar", "singular", - "sinistre", "sinister", - "sinsiter", "sinister", - "sitckers", "stickers", - "sitrring", "stirring", - "sizebale", "sizeable", - "skateing", "skating", - "skecthes", "sketches", - "skelatel", "skeletal", - "skeletos", "skeletons", - "sketchey", "sketchy", - "sketpics", "skeptics", - "skillsto", "skillshots", - "skimrish", "skirmish", - "skpetics", "skeptics", - "skrimish", "skirmish", - "skteches", "sketches", - "skywalkr", "skywalker", - "slaptoon", "splatoon", - "slaverly", "slavery", - "slienced", "silenced", - "sliently", "silently", - "slighlty", "slightly", - "sligthly", "slightly", - "smartare", "smarter", - "snetries", "sentries", - "snippent", "snippet", - "snippert", "snippet", - "snowbals", "snowballs", - "snugglie", "snuggle", - "snydrome", "syndrome", - "snyopsis", "synopsis", - "soberity", "sobriety", - "sobreity", "sobriety", - "socailly", "socially", - "socalism", "socialism", - "socartes", "socrates", - "socialim", "socialism", - "socities", "societies", - "socttish", "scottish", - "soemthin", "somethin", - "soilders", "soldiers", - "solatary", "solitary", - "soldeirs", "soldiers", - "soliders", "soldiers", - "soluable", "soluble", - "solutide", "solitude", - "somalija", "somalia", - "somehtin", "somethin", - "someoens", "someones", - "somethis", "somethings", - "sometihn", "somethin", - "sometinh", "somethin", - "somoenes", "someones", - "somtimes", "sometimes", - "somwhere", "somewhere", - "soparnos", "sopranos", - "sophmore", "sophomore", - "sorcercy", "sorcery", - "sorcerey", "sorcery", - "sorceror", "sorcerer", - "sorcerry", "sorcery", - "sorpanos", "sopranos", - "southren", "southern", - "soverein", "sovereign", - "soverign", "sovereign", - "sovietes", "soviets", - "spagheti", "spaghetti", - "spainish", "spanish", - "spaltoon", "splatoon", - "spammade", "spammed", - "spammare", "spammer", - "spammear", "spammer", - "spammend", "spammed", - "spammeur", "spammer", - "spanisch", "spanish", - "sparklie", "sparkle", - "spawnign", "spawning", - "specemin", "specimen", - "speciaal", "special", - "specialt", "specialist", - "specialy", "specially", - "specialz", "specialize", - "specifed", "specified", - "specifiy", "specify", - "speciman", "specimen", - "specrtal", "spectral", - "speicals", "specials", - "spellign", "spelling", - "spendour", "splendour", - "sphereos", "spheres", - "spilnter", "splinter", - "spiltter", "splitter", - "spindrel", "spindle", - "spirites", "spirits", - "spiritis", "spirits", - "spiritus", "spirits", - "spirtied", "spirited", - "spleling", "spelling", - "splitner", "splinter", - "spoilerd", "spoiled", - "spoliers", "spoilers", - "sponsord", "sponsored", - "sporanos", "sopranos", - "spotifiy", "spotify", - "spotifty", "spotify", - "sppeches", "speeches", - "sprayade", "sprayed", - "spreaded", "spread", - "springst", "sprints", - "sprinkel", "sprinkle", - "sprintas", "sprints", - "spritual", "spiritual", - "sproutes", "sprouts", - "spwaning", "spawning", - "sqaudron", "squadron", - "sqaurely", "squarely", - "sqiurtle", "squirtle", - "squardon", "squadron", - "squareds", "squares", - "squarley", "squarely", - "squeakey", "squeaky", - "squeakly", "squeaky", - "squirlte", "squirtle", - "squirrle", "squirrel", - "squirtel", "squirtle", - "squishey", "squishy", - "squishly", "squishy", - "squritle", "squirtle", - "squrriel", "squirrel", - "squrtile", "squirtle", - "sriarcha", "sriracha", - "srriacha", "sriracha", - "sryacuse", "syracuse", - "staduims", "stadiums", - "staidums", "stadiums", - "staklers", "stalkers", - "stalekrs", "stalkers", - "stalkear", "stalker", - "staminia", "stamina", - "stampade", "stamped", - "stampeed", "stamped", - "stancels", "stances", - "stancers", "stances", - "standars", "standards", - "standbay", "standby", - "standbuy", "standby", - "stangant", "stagnant", - "staright", "straight", - "starined", "strained", - "starlted", "startled", - "startegy", "strategy", - "starteld", "startled", - "startsup", "startups", - "stateman", "statesman", - "staticts", "statist", - "stationd", "stationed", - "stationy", "stationary", - "statiskt", "statist", - "statistc", "statistic", - "statment", "statement", - "stattues", "statutes", - "statuets", "statutes", - "statuser", "stature", - "staurday", "saturday", - "steadliy", "steadily", - "stealhty", "stealthy", - "steathly", "stealthy", - "stelathy", "stealthy", - "sterilze", "sterile", - "steriods", "steroids", - "stichted", "stitched", - "sticthed", "stitched", - "sticthes", "stitches", - "stimulai", "stimuli", - "stimulas", "stimulants", - "stimulat", "stimulants", - "stimulli", "stimuli", - "stingent", "stringent", - "stirkers", "strikers", - "stlakers", "stalkers", - "stomache", "stomach", - "stormade", "stormed", - "stormend", "stormed", - "stradegy", "strategy", - "stragety", "strategy", - "straignt", "straighten", - "straigth", "straight", - "straings", "strains", - "strangel", "strangle", - "stranget", "strangest", - "stratgey", "strategy", - "stratled", "startled", - "streames", "streams", - "streamos", "streams", - "streamus", "streams", - "streamys", "streams", - "stregnth", "strength", - "stremear", "streamer", - "strenght", "strength", - "strengts", "strengths", - "strenous", "strenuous", - "strentgh", "strength", - "stretchs", "stretches", - "striaght", "straight", - "striclty", "strictly", - "striekrs", "strikers", - "strikely", "strikingly", - "stringet", "stringent", - "stubbron", "stubborn", - "stubmled", "stumbled", - "stucture", "structure", - "studioes", "studios", - "stuipder", "stupider", - "stumbeld", "stumbled", - "stupdily", "stupidly", - "stupidiy", "stupidity", - "stylisch", "stylish", - "styrofom", "styrofoam", - "suasages", "sausages", - "subltety", "subtlety", - "submarie", "submarines", - "subruban", "suburban", - "subscrie", "subscriber", - "subsidie", "subsidized", - "subsidiy", "subsidy", - "substace", "substance", - "substans", "substances", - "substite", "substitute", - "subtelty", "subtlety", - "subtetly", "subtlety", - "subtilte", "subtitle", - "subtitel", "subtitle", - "subtitls", "subtitles", - "subtltey", "subtlety", - "succeded", "succeeded", - "succedes", "succeeds", - "succeeed", "succeed", - "succesed", "succeeds", - "successs", "successes", - "succsess", "success", - "suceeded", "succeeded", - "sucesful", "successful", - "sucesion", "succession", - "sucesses", "successes", - "sucessor", "successor", - "sucessot", "successor", - "sucidial", "suicidal", - "suddnely", "suddenly", - "sufficit", "sufficient", - "suggesst", "suggests", - "suggeste", "suggestive", - "summenor", "summoner", - "summones", "summoners", - "sunfiber", "sunfire", - "sunscren", "sunscreen", - "superham", "superhuman", - "superheo", "superhero", - "superios", "superiors", - "supirsed", "suprised", - "suposing", "supposing", - "supporre", "supporters", - "suprised", "surprised", - "suprized", "surprised", - "suprsied", "suprised", - "supsects", "suspects", - "supsense", "suspense", - "surbuban", "suburban", - "surounds", "surrounds", - "surpases", "surpass", - "surpress", "suppress", - "surprize", "surprise", - "surrouns", "surrounds", - "surveill", "surveil", - "surveyer", "surveyor", - "surviver", "survivor", - "suspened", "suspend", - "suspenso", "suspension", - "swaering", "swearing", - "swansoon", "swanson", - "swasitka", "swastika", - "swaskita", "swastika", - "swatiska", "swastika", - "swatsika", "swastika", - "swedisch", "swedish", - "swiftley", "swiftly", - "swithced", "switched", - "swithces", "switches", - "swtiched", "switched", - "swtiches", "switches", - "syarcuse", "syracuse", - "sydnrome", "syndrome", - "sylablle", "syllable", - "syllabel", "syllable", - "symapthy", "sympathy", - "symboles", "symbols", - "symhpony", "symphony", - "symmerty", "symmetry", - "symmtery", "symmetry", - "symoblic", "symbolic", - "symphaty", "sympathy", - "symptoom", "symptom", - "symtpoms", "symptoms", - "synomyns", "synonyms", - "synonmys", "synonyms", - "synonomy", "synonym", - "synoynms", "synonyms", - "synphony", "symphony", - "synposis", "synopsis", - "sypmathy", "sympathy", - "sypmtoms", "symptoms", - "sypnosis", "synopsis", - "syraucse", "syracuse", - "syrcause", "syracuse", - "syringae", "syringe", - "syringue", "syringe", - "sysamdin", "sysadmin", - "sysdamin", "sysadmin", - "tacticas", "tactics", - "tacticts", "tactics", - "tacticus", "tactics", - "tagliate", "tailgate", - "tahnkyou", "thankyou", - "tailsman", "talisman", - "taiwanee", "taiwanese", - "taligate", "tailgate", - "taliored", "tailored", - "tallents", "tallest", - "talsiman", "talisman", - "tanturms", "tantrums", - "tapitude", "aptitude", - "tasliman", "talisman", - "tattooes", "tattoos", - "tattooos", "tattoos", - "taxanomy", "taxonomy", - "teamfigt", "teamfight", - "teamspek", "teamspeak", - "teancity", "tenacity", - "teapsoon", "teaspoon", - "techniqe", "technique", - "teenages", "teenagers", - "telegrah", "telegraph", - "telphony", "telephony", - "tempalrs", "templars", - "tempalte", "template", - "templats", "templates", - "templeos", "temples", - "templers", "temples", - "temporay", "temporary", - "temprary", "temporary", - "tenacles", "tentacles", - "tenactiy", "tenacity", - "tencaity", "tenacity", - "tendancy", "tendency", - "tendence", "tendencies", - "tentacel", "tentacle", - "tentacls", "tentacles", - "tentalce", "tentacle", - "tequilia", "tequila", - "terriory", "territory", - "territoy", "territory", - "terroist", "terrorist", - "tesitcle", "testicle", - "testicel", "testicle", - "testifiy", "testify", - "teusdays", "tuesdays", - "texutres", "textures", - "thaliand", "thailand", - "theather", "theater", - "theathre", "theater", - "theature", "theater", - "theisitc", "theistic", - "themslef", "themself", - "theorits", "theorist", - "theraphy", "therapy", - "thereian", "therein", - "theroies", "theories", - "theroist", "theorist", - "thesitic", "theistic", - "thialand", "thailand", - "thiestic", "theistic", - "thikning", "thinking", - "thirites", "thirties", - "thirstay", "thirsty", - "thnakyou", "thankyou", - "thoeries", "theories", - "thoerist", "theorist", - "thomspon", "thompson", - "thopmson", "thompson", - "thougths", "thoughts", - "thourogh", "thorough", - "threates", "threatens", - "threefor", "therefor", - "thriteen", "thirteen", - "thrities", "thirties", - "throaths", "throats", - "throners", "thrones", - "throough", "thorough", - "throught", "thought", - "thrusday", "thursday", - "thumbnal", "thumbnails", - "thurdsay", "thursday", - "thursdsy", "thursdays", - "tightare", "tighter", - "timestap", "timestamp", - "tirangle", "triangle", - "tirbunal", "tribunal", - "titainum", "titanium", - "titanuim", "titanium", - "tocuhpad", "touchpad", - "togehter", "together", - "togheter", "together", - "toiletts", "toilets", - "tolerabe", "tolerable", - "tommorow", "tomorrow", - "tonguers", "tongues", - "toriodal", "toroidal", - "toritlla", "tortilla", - "tornadoe", "tornado", - "torotise", "tortoise", - "torpedeo", "torpedo", - "torphies", "trophies", - "tortiose", "tortoise", - "toruisty", "touristy", - "toruneys", "tourneys", - "touchapd", "touchpad", - "tounreys", "tourneys", - "tourisim", "tourism", - "touritsy", "touristy", - "tournyes", "tourneys", - "toursits", "tourists", - "toursity", "touristy", - "toxiticy", "toxicity", - "trabajao", "trabajo", - "trabajdo", "trabajo", - "trackres", "trackers", - "trageted", "targeted", - "traingle", "triangle", - "traitour", "traitor", - "trakcers", "trackers", - "traliers", "trailers", - "tranform", "transform", - "transeat", "translates", - "transfom", "transform", - "transfos", "transforms", - "transiet", "transient", - "transito", "transition", - "transpot", "transport", - "trasnfer", "transfer", - "tratiors", "traitors", - "traveles", "travels", - "traveres", "traverse", - "treasurs", "treasures", - "treatmet", "treatments", - "treatsie", "treaties", - "treausre", "treasure", - "tredning", "trending", - "tremelos", "tremolos", - "tresuary", "treasury", - "trialers", "trailers", - "trianers", "trainers", - "triangel", "triangle", - "triangls", "triangles", - "trianing", "training", - "trianlge", "triangle", - "triators", "traitors", - "tribuanl", "tribunal", - "trickyer", "trickery", - "triggern", "triggering", - "trilogoy", "trilogy", - "trinagle", "triangle", - "trinekts", "trinkets", - "tringale", "triangle", - "trinitiy", "trinity", - "triology", "trilogy", - "triumpth", "triumph", - "trohpies", "trophies", - "trollade", "trolled", - "tropcial", "tropical", - "trotilla", "tortilla", - "trpoical", "tropical", - "trubinal", "tribunal", - "trubines", "turbines", - "tsunamai", "tsunami", - "tuesdsay", "tuesdays", - "tunnells", "tunnels", - "turkisch", "turkish", - "turntabe", "turntable", - "turretts", "turrets", - "tusedays", "tuesdays", - "tutorual", "tutorial", - "twilgiht", "twilight", - "tylenool", "tylenol", - "typicaly", "typically", - "tyranies", "tyrannies", - "tyrannia", "tyrannical", - "ublisher", "publisher", - "udnercut", "undercut", - "udnerdog", "underdog", - "ugpraded", "upgraded", - "ugprades", "upgrades", - "ukrainie", "ukraine", - "ukrainin", "ukrainian", - "ukranian", "ukrainian", - "ulitmate", "ultimate", - "ultamite", "ultimate", - "ultiamte", "ultimate", - "ultimely", "ultimately", - "ultrason", "ultrasound", - "umberlla", "umbrella", - "unabnned", "unbanned", - "unbanend", "unbanned", - "uncanney", "uncanny", - "uncannny", "uncanny", - "underbog", "undergo", - "underglo", "undergo", - "undersog", "undergo", - "undertoe", "undertones", - "underwar", "underwater", - "unfailry", "unfairly", - "unfarily", "unfairly", - "ungodley", "ungodly", - "unhapppy", "unhappy", - "unhealty", "unhealthy", - "unicrons", "unicorns", - "unifroms", "uniforms", - "uniquley", "uniquely", - "univeral", "universal", - "unlikley", "unlikely", - "unlockes", "unlocks", - "unluckly", "unlucky", - "unpoened", "unopened", - "unqiuely", "uniquely", - "unrakned", "unranked", - "unrnaked", "unranked", - "unrpoven", "unproven", - "unsuable", "unusable", - "untraind", "untrained", - "unusualy", "unusually", - "unvierse", "universe", - "unworhty", "unworthy", - "upgarded", "upgraded", - "upgardes", "upgrades", - "uploades", "uploads", - "upstaris", "upstairs", - "upstiars", "upstairs", - "urethrea", "urethra", - "uruguary", "uruguay", - "ususally", "usually", - "utilitiy", "utility", - "utlimate", "ultimate", - "vaccinae", "vaccinated", - "vaccinet", "vaccinated", - "vacinity", "vicinity", - "vaguelly", "vaguely", - "vaiation", "aviation", - "vaieties", "varieties", - "vailidty", "validity", - "vairable", "variable", - "vaklyrie", "valkyrie", - "valenica", "valencia", - "valentie", "valentines", - "valentis", "valentines", - "validade", "validated", - "valkirye", "valkyrie", - "valkiyre", "valkyrie", - "valkriye", "valkyrie", - "valkryie", "valkyrie", - "valkyire", "valkyrie", - "valnecia", "valencia", - "valubale", "valuable", - "valykrie", "valkyrie", - "vamipres", "vampires", - "vampiers", "vampires", - "vampries", "vampires", - "vangurad", "vanguard", - "vanillia", "vanilla", - "vanillla", "vanilla", - "vanugard", "vanguard", - "varaible", "variable", - "varaints", "variants", - "variabel", "variable", - "varibale", "variable", - "varities", "varieties", - "vassales", "vassals", - "vassalls", "vassals", - "vassalos", "vassals", - "vaticaan", "vatican", - "vaticina", "vatican", - "vaulable", "valuable", - "vaylkrie", "valkyrie", - "vechiles", "vehicles", - "vectores", "vectors", - "vegansim", "veganism", - "vegtable", "vegetable", - "vehciles", "vehicles", - "vehicels", "vehicles", - "vehicule", "vehicle", - "veichles", "vehicles", - "venelope", "envelope", - "venemous", "venomous", - "vengance", "vengeance", - "vengence", "vengeance", - "verablly", "verbally", - "verbaitm", "verbatim", - "verisons", "versions", - "versatel", "versatile", - "vertabim", "verbatim", - "vertigro", "vertigo", - "vesseles", "vessels", - "vessells", "vessels", - "viabiliy", "viability", - "viatmins", "vitamins", - "vibratie", "vibrate", - "vibratin", "vibration", - "vicintiy", "vicinity", - "vicseral", "visceral", - "victimas", "victims", - "victimes", "victims", - "victorin", "victorian", - "victoris", "victories", - "vieweres", "viewers", - "viewpoit", "viewpoints", - "vigilane", "vigilante", - "vigliant", "vigilant", - "vikingos", "vikings", - "viligant", "vigilant", - "villegas", "villages", - "vindicte", "vindictive", - "vinicity", "vicinity", - "violatin", "violation", - "violenty", "violently", - "violetas", "violates", - "virament", "vraiment", - "virbator", "vibrator", - "virginas", "virgins", - "virgines", "virgins", - "virgings", "virgins", - "virginis", "virgins", - "virginus", "virgins", - "virtualy", "virtually", - "virtuels", "virtues", - "virtuose", "virtues", - "viscreal", "visceral", - "visercal", "visceral", - "visibily", "visibility", - "visibley", "visibly", - "visiblly", "visibly", - "vitailty", "vitality", - "vitimans", "vitamins", - "vitmains", "vitamins", - "vitories", "victories", - "voicemal", "voicemail", - "voilates", "violates", - "volatily", "volatility", - "volcando", "volcano", - "volcanoe", "volcano", - "volcaron", "volcano", - "vriament", "vraiment", - "wahtever", "whatever", - "wallpapr", "wallpapers", - "warantee", "warranty", - "warcarft", "warcraft", - "warrante", "warranties", - "warriros", "warriors", - "watchemn", "watchmen", - "watchign", "watching", - "wathcing", "watching", - "wathcmen", "watchmen", - "wathever", "whatever", - "watkings", "watkins", - "wealthly", "wealthy", - "webistes", "websites", - "websties", "websites", - "wednesdy", "wednesdays", - "weigthed", "weighted", - "weridest", "weirdest", - "werstler", "wrestler", - "wesbites", "websites", - "westbrok", "westbrook", - "westerse", "westerners", - "wherease", "whereas", - "whipsers", "whispers", - "whislist", "wishlist", - "whisltes", "whistles", - "whisperd", "whispered", - "whistels", "whistles", - "whitsles", "whistles", - "whsipers", "whispers", - "widgetas", "widgets", - "wieghted", "weighted", - "willaims", "williams", - "willfuly", "willfully", - "willimas", "williams", - "windsoar", "windsor", - "wininpeg", "winnipeg", - "winnigns", "winnings", - "winnpieg", "winnipeg", - "wiredest", "weirdest", - "wishlsit", "wishlist", - "wishpers", "whispers", - "withdral", "withdrawal", - "witnesss", "witnesses", - "wonderes", "wonders", - "wonderus", "wonders", - "workfore", "workforce", - "wouldnot", "wouldnt", - "wranlger", "wrangler", - "wreckign", "wrecking", - "wrecthed", "wretched", - "wrekcing", "wrecking", - "wreslter", "wrestler", - "wresters", "wrestlers", - "writting", "writing", - "wrnagler", "wrangler", - "wrteched", "wretched", - "yeilding", "yielding", - "yoesmite", "yosemite", - "yorksher", "yorkshire", - "yorkshie", "yorkshire", - "yosemeti", "yosemite", - "yosimete", "yosemite", - "zealotes", "zealots", - "zealoths", "zealots", - "zealotus", "zealots", - "zealouts", "zealous", - "zepplein", "zeppelin", - "zepplien", "zeppelin", - "zimbabew", "zimbabwe", - "zimbawbe", "zimbabwe", - "zinoists", "zionists", - "zionisim", "zionism", - "zionistm", "zionism", - "zionsits", "zionists", - "zoinists", "zionists", - "abiltiy", "ability", - "abodmen", "abdomen", - "abondon", "abandon", - "aboslve", "absolve", - "abosrbs", "absorbs", - "abriter", "arbiter", - "abrupty", "abruptly", - "absense", "absence", - "absolue", "absolute", - "absovle", "absolve", - "absrobs", "absorbs", - "absuers", "abusers", - "absurdy", "absurdly", - "absymal", "abysmal", - "abymsal", "abysmal", - "acadamy", "academy", - "acadmic", "academic", - "accesss", "access", - "accpets", "accepts", - "accross", "across", - "accuray", "accuracy", - "acheive", "achieve", - "achived", "achieved", - "acident", "accident", - "ackward", "awkward", - "acrlyic", "acrylic", - "actauly", "actualy", - "activit", "activist", - "activly", "actively", - "actualy", "actually", - "actulay", "actualy", - "acuracy", "accuracy", - "acusing", "causing", - "acustom", "accustom", - "acutaly", "actualy", - "acyrlic", "acrylic", - "adaptes", "adapters", - "adatper", "adapter", - "adbomen", "abdomen", - "addcits", "addicts", - "adderss", "address", - "addtion", "addition", - "adequet", "adequate", - "adequit", "adequate", - "adivser", "adviser", - "adivsor", "advisor", - "admited", "admitted", - "admrial", "admiral", - "adpater", "adapter", - "adquire", "acquire", - "adultey", "adultery", - "adverst", "adverts", - "adviced", "advised", - "advocay", "advocacy", - "advsior", "advisor", - "aeriels", "aerials", - "affaris", "affairs", - "affiars", "affairs", - "afircan", "african", - "africas", "africans", - "afwully", "awfully", - "againts", "against", - "agaisnt", "against", - "aganist", "against", - "aggreed", "agreed", - "agianst", "against", - "agreing", "agreeing", - "agruing", "arguing", - "ahtiest", "athiest", - "aicraft", "aircraft", - "ailmony", "alimony", - "airbore", "airborne", - "aircaft", "aircraft", - "airlfow", "airflow", - "airosft", "airsoft", - "airpost", "airports", - "airsfot", "airsoft", - "airzona", "arizona", - "alchmey", "alchemy", - "alchool", "alcohol", - "alcohal", "alcohol", - "aledged", "alleged", - "aledges", "alleges", - "alegbra", "algebra", - "algerba", "algebra", - "alienet", "alienate", - "alledge", "allege", - "allegry", "allergy", - "alltime", "all-time", - "almighy", "almighty", - "alochol", "alcohol", - "alotted", "allotted", - "alowing", "allowing", - "alphabt", "alphabet", - "alreayd", "already", - "alrighy", "alrighty", - "altanta", "atlanta", - "alteast", "atleast", - "altough", "although", - "alusion", "allusion", - "amateus", "amateurs", - "amatuer", "amateur", - "amature", "armature", - "amensia", "amnesia", - "amensty", "amnesty", - "amercia", "america", - "americs", "americas", - "ammount", "amount", - "ammused", "amused", - "amneisa", "amnesia", - "amnsety", "amnesty", - "amognst", "amongst", - "amongts", "amongst", - "amonsgt", "amongst", - "ampilfy", "amplify", - "amrpits", "armpits", - "analoge", "analogue", - "analsyt", "analyst", - "analyes", "analyse", - "analyts", "analyst", - "analzye", "analyze", - "anaylse", "analyse", - "anaylst", "analyst", - "anaylze", "analyze", - "anceint", "ancient", - "andorid", "android", - "andriod", "android", - "androis", "androids", - "angirly", "angrily", - "angluar", "angular", - "angualr", "angular", - "anicent", "ancient", - "anitque", "antique", - "anixety", "anxiety", - "anmesia", "amnesia", - "anmesty", "amnesty", - "annoint", "anoint", - "annualy", "annually", - "annuled", "annulled", - "anohter", "another", - "anomoly", "anomaly", - "answerd", "answered", - "anuglar", "angular", - "anulled", "annulled", - "anwsers", "answers", - "anwyays", "anyways", - "anxeity", "anxiety", - "anyoens", "anyones", - "anyonse", "anyones", - "anywyas", "anyways", - "aparent", "apparent", - "appeard", "appeared", - "appluad", "applaud", - "aproval", "approval", - "apsects", "aspects", - "apshalt", "asphalt", - "apsirin", "aspirin", - "aqcuire", "acquire", - "aquarim", "aquarium", - "aquired", "acquired", - "aranged", "arranged", - "arbitre", "arbiter", - "arcahic", "archaic", - "archiac", "archaic", - "arcylic", "acrylic", - "aresnal", "arsenal", - "aretmis", "artemis", - "argubly", "arguably", - "aribter", "arbiter", - "ariflow", "airflow", - "arisoft", "airsoft", - "aritsts", "artists", - "armchar", "armchair", - "arogant", "arrogant", - "arogent", "arrogant", - "arresst", "arrests", - "arround", "around", - "arsneal", "arsenal", - "artcile", "article", - "artical", "article", - "articel", "article", - "artistc", "artistic", - "artmeis", "artemis", - "artsits", "artists", - "aruging", "arguing", - "aseuxal", "asexual", - "asexaul", "asexual", - "ashpalt", "asphalt", - "asiprin", "aspirin", - "asissts", "assists", - "asnwers", "answers", - "asorbed", "absorbed", - "aspahlt", "asphalt", - "asphlat", "asphalt", - "aspriin", "aspirin", - "assagne", "assange", - "assasin", "assassin", - "assembe", "assemble", - "assemby", "assembly", - "assisst", "assists", - "assnage", "assange", - "asssits", "assists", - "assualt", "assault", - "asterik", "asterisk", - "asutria", "austria", - "atcualy", "actualy", - "atelast", "atleast", - "athesim", "atheism", - "athiesm", "atheism", - "athiest", "atheist", - "athiets", "athiest", - "athlets", "athletes", - "atlantc", "atlantic", - "atleats", "atleast", - "atlesat", "atleast", - "atorney", "attorney", - "atremis", "artemis", - "attemps", "attempts", - "attemts", "attempts", - "attened", "attended", - "attracs", "attracts", - "audbile", "audible", - "audibel", "audible", - "austira", "austria", - "austrai", "austria", - "autistc", "autistic", - "avation", "aviation", - "avtaars", "avatars", - "awakend", "awakened", - "bablyon", "babylon", - "backdor", "backdoor", - "backsta", "backseat", - "baclony", "balcony", - "badnits", "bandits", - "baiscly", "basicly", - "bakcers", "backers", - "balanse", "balances", - "balcked", "blacked", - "banhsee", "banshee", - "bankgok", "bangkok", - "baoynet", "bayonet", - "baptims", "baptism", - "baptsim", "baptism", - "baragin", "bargain", - "bargani", "bargain", - "bargian", "bargain", - "bariner", "brainer", - "barlkey", "barkley", - "barracs", "barracks", - "barrles", "barrels", - "barsita", "barista", - "barvery", "bravery", - "bascily", "basicly", - "basicly", "basically", - "basilcy", "basicly", - "basiton", "bastion", - "basnhee", "banshee", - "bastane", "bastante", - "bastars", "bastards", - "bastino", "bastion", - "bathrom", "bathroom", - "batitsa", "batista", - "batsita", "batista", - "bayblon", "babylon", - "baynoet", "bayonet", - "bayoent", "bayonet", - "bceuase", "becuase", - "beacuse", "because", - "bealtes", "beatles", - "beaslty", "beastly", - "beatels", "beatles", - "beaucop", "beaucoup", - "becamae", "became", - "becames", "becomes", - "becasue", "because", - "becouse", "because", - "becuaes", "becuase", - "becuase", "because", - "becusae", "becuase", - "befried", "befriend", - "beggins", "begins", - "beglian", "belgian", - "beglium", "belgium", - "begnals", "bengals", - "bejiing", "beijing", - "beleifs", "beliefs", - "beleive", "believe", - "belgain", "belgian", - "belguim", "belgium", - "believr", "believer", - "believs", "believes", - "belifes", "beliefs", - "beligan", "belgian", - "beligum", "belgium", - "belived", "believed", - "belives", "believes", - "benagls", "bengals", - "benedit", "benedict", - "benghai", "benghazi", - "benglas", "bengals", - "benifit", "benefit", - "beoynce", "beyonce", - "beraded", "bearded", - "bersekr", "berserk", - "beseige", "besiege", - "betales", "beatles", - "bethesa", "bethesda", - "betrayd", "betrayed", - "beucase", "becuase", - "bewteen", "between", - "bicthes", "bitches", - "bidrman", "birdman", - "biejing", "beijing", - "bifgoot", "bigfoot", - "bigorty", "bigotry", - "bigtoed", "bigoted", - "bigtory", "bigotry", - "biogted", "bigoted", - "biogtry", "bigotry", - "bioplar", "bipolar", - "biploar", "bipolar", - "birdamn", "birdman", - "birdges", "bridges", - "birgade", "brigade", - "bitcion", "bitcoin", - "bithced", "bitched", - "bithces", "bitches", - "bitocin", "bitcoin", - "bizzare", "bizarre", - "blacony", "balcony", - "blaimed", "blamed", - "blankes", "blankets", - "blegian", "belgian", - "blegium", "belgium", - "blizzad", "blizzard", - "blockes", "blockers", - "bloster", "bolster", - "blulets", "bullets", - "bobmers", "bombers", - "bollocs", "bollocks", - "bondary", "boundary", - "bonnano", "bonanno", - "bonsues", "bonuses", - "boraden", "broaden", - "borader", "broader", - "boradly", "broadly", - "bordeom", "boredom", - "boslter", "bolster", - "boudler", "boulder", - "boundry", "boundary", - "bounses", "bonuses", - "boutiqe", "boutique", - "bouyant", "buoyant", - "braevry", "bravery", - "braista", "barista", - "brakley", "barkley", - "branier", "brainer", - "braoden", "broaden", - "braoder", "broader", - "braodly", "broadly", - "brednan", "brendan", - "breifly", "briefly", - "breserk", "berserk", - "brethen", "brethren", - "brewrey", "brewery", - "briagde", "brigade", - "brianer", "brainer", - "bridman", "birdman", - "brielfy", "briefly", - "brigdes", "bridges", - "brightn", "brighten", - "brisben", "brisbane", - "britian", "britain", - "britsol", "bristol", - "briused", "bruised", - "briuser", "bruiser", - "briuses", "bruises", - "brocoli", "broccoli", - "bronocs", "broncos", - "browine", "brownie", - "brownei", "brownie", - "brownis", "brownies", - "bruglar", "burglar", - "brunete", "brunette", - "bruning", "burning", - "brusied", "bruised", - "brusies", "bruises", - "brusses", "brussels", - "brutaly", "brutally", - "btiched", "bitched", - "btiches", "bitches", - "bubbels", "bubbles", - "buddhim", "buddhism", - "buddhit", "buddhist", - "buddist", "buddhist", - "budgest", "budgets", - "bugdets", "budgets", - "buildes", "builders", - "bulgara", "bulgaria", - "bullest", "bullets", - "buoancy", "buoyancy", - "burguny", "burgundy", - "buriser", "bruiser", - "burlgar", "burglar", - "burnign", "burning", - "burried", "buried", - "burrtio", "burrito", - "busines", "business", - "busness", "business", - "butthoe", "butthole", - "buttrey", "buttery", - "cababge", "cabbage", - "cabines", "cabinets", - "cabniet", "cabinet", - "caclium", "calcium", - "cacuses", "caucuses", - "caffeen", "caffeine", - "cahched", "cached", - "cahotic", "chaotic", - "cahsier", "cashier", - "cailbre", "calibre", - "calaber", "caliber", - "calagry", "calgary", - "calback", "callback", - "calbire", "calibre", - "calcuim", "calcium", - "calculs", "calculus", - "calicum", "calcium", - "calrify", "clarify", - "calrity", "clarity", - "caluses", "clauses", - "camboda", "cambodia", - "campain", "campaign", - "campuss", "campuses", - "cancles", "cancels", - "cancres", "cancers", - "cancuks", "canucks", - "canides", "candies", - "cannnot", "cannot", - "canrage", "carnage", - "capible", "capable", - "capitas", "capitals", - "capsuls", "capsules", - "captais", "captains", - "captial", "capital", - "captiol", "capitol", - "captued", "captured", - "capturd", "captured", - "capusle", "capsule", - "carange", "carnage", - "carbien", "carbine", - "cardaic", "cardiac", - "cardina", "cardigan", - "careing", "caring", - "caridac", "cardiac", - "carmtan", "cartman", - "carnege", "carnage", - "carnige", "carnage", - "carolan", "carolina", - "carreer", "career", - "carrers", "careers", - "cartles", "cartels", - "caryons", "crayons", - "casette", "cassette", - "casheir", "cashier", - "cashies", "cashiers", - "cashire", "cashier", - "casltes", "castles", - "caspule", "capsule", - "cassete", "cassette", - "castels", "castles", - "casuing", "causing", - "cathlic", "catholic", - "cauncks", "canucks", - "cavarly", "cavalry", - "cavlary", "cavalry", - "celcius", "celsius", - "celisus", "celsius", - "celitcs", "celtics", - "celsuis", "celsius", - "centruy", "century", - "centuty", "century", - "ceratin", "certain", - "cermaic", "ceramic", - "certian", "certain", - "cervial", "cervical", - "cesspol", "cesspool", - "cetlics", "celtics", - "chambre", "chamber", - "charcol", "charcoal", - "charisa", "charisma", - "chasiss", "chassis", - "chatoic", "chaotic", - "cheeots", "cheetos", - "cheesse", "cheeses", - "chekcer", "checker", - "chelsae", "chelsea", - "cheslea", "chelsea", - "chiense", "chinese", - "childen", "children", - "chimeny", "chimney", - "chinees", "chinese", - "chinmey", "chimney", - "chipest", "chipset", - "chispet", "chipset", - "chivaly", "chivalry", - "chlesea", "chelsea", - "choatic", "chaotic", - "chocies", "choices", - "choosen", "chosen", - "chtulhu", "cthulhu", - "churchs", "churches", - "cilanto", "cilantro", - "cilents", "clients", - "circels", "circles", - "circuis", "circuits", - "cirlces", "circles", - "clacium", "calcium", - "claerer", "clearer", - "claerly", "clearly", - "clagary", "calgary", - "claibre", "calibre", - "claimes", "claims", - "clairfy", "clarify", - "clairty", "clarity", - "clanand", "clannad", - "clarfiy", "clarify", - "classis", "classics", - "clasues", "clauses", - "claymer", "claymore", - "claymoe", "claymore", - "cleanes", "cleanse", - "cleasne", "cleanse", - "cleints", "clients", - "clenase", "cleanse", - "clesius", "celsius", - "cletics", "celtics", - "clevery", "cleverly", - "climats", "climates", - "climbes", "climbers", - "clincis", "clinics", - "clitors", "clitoris", - "cloesly", "closely", - "closley", "closely", - "cluases", "clauses", - "cluprit", "culprit", - "coalese", "coalesce", - "coctail", "cocktail", - "cohesie", "cohesive", - "colgone", "cologne", - "collape", "collapse", - "collest", "collects", - "collony", "colony", - "collumn", "column", - "cologen", "cologne", - "colomba", "colombia", - "colonge", "cologne", - "colorao", "colorado", - "colourd", "coloured", - "columsn", "columns", - "comando", "commando", - "comapny", "company", - "comapre", "compare", - "comarde", "comrade", - "comback", "comeback", - "combins", "combines", - "comdeic", "comedic", - "comited", "committed", - "commano", "commando", - "commans", "commands", - "commere", "commerce", - "comming", "coming", - "commitd", "commited", - "compase", "compares", - "compede", "competed", - "compilr", "compiler", - "compnay", "company", - "compots", "compost", - "comrads", "comrades", - "comtpon", "compton", - "conceed", "concede", - "conceps", "concepts", - "conclue", "conclude", - "concret", "concert", - "condenm", "condemn", - "condiut", "conduit", - "condmen", "condemn", - "confids", "confides", - "confins", "confines", - "confise", "confines", - "conflit", "conflict", - "conived", "connived", - "connecs", "connects", - "conqeur", "conquer", - "conqure", "conquer", - "consept", "concept", - "consern", "concern", - "consums", "consumes", - "contacs", "contacts", - "contais", "contains", - "contast", "contacts", - "contemt", "contempt", - "contens", "contents", - "contess", "contests", - "contian", "contain", - "contine", "continue", - "convers", "converts", - "conveyd", "conveyed", - "convine", "convince", - "coprses", "corpses", - "coputer", "computer", - "corasir", "corsair", - "coratia", "croatia", - "coridal", "cordial", - "corsari", "corsair", - "corsiar", "corsair", - "corspes", "corpses", - "corwbar", "crowbar", - "costums", "costumes", - "coudlnt", "couldnt", - "coulmns", "columns", - "coulndt", "couldnt", - "counsle", "counsel", - "countes", "counters", - "courtey", "courtesy", - "covenat", "covenant", - "coytoes", "coyotes", - "crabine", "carbine", - "cralwed", "crawled", - "craotia", "croatia", - "craweld", "crawled", - "creamic", "ceramic", - "createn", "creatine", - "creater", "creature", - "creatie", "creatine", - "creatue", "creature", - "creepes", "creepers", - "creepig", "creeping", - "creulty", "cruelty", - "cricles", "circles", - "critera", "criteria", - "cropses", "corpses", - "crosair", "corsair", - "crpytic", "cryptic", - "crsytal", "crystal", - "crtical", "critical", - "crucibe", "crucible", - "cruetly", "cruelty", - "cruical", "crucial", - "crulety", "cruelty", - "crusdae", "crusade", - "crusier", "cruiser", - "crusies", "cruises", - "crusive", "cursive", - "crutchs", "crutches", - "crypitc", "cryptic", - "crystas", "crystals", - "crystsl", "crystals", - "crytpic", "cryptic", - "crytsal", "crystal", - "cthluhu", "cthulhu", - "cthuhlu", "cthulhu", - "cthuluh", "cthulhu", - "ctuhlhu", "cthulhu", - "cuasing", "causing", - "cubcile", "cubicle", - "cubilce", "cubicle", - "cuddels", "cuddles", - "culrpit", "culprit", - "culturs", "cultures", - "cupboad", "cupboard", - "cuplrit", "culprit", - "curatin", "curtain", - "curcial", "crucial", - "curcuit", "circuit", - "curelty", "cruelty", - "curiser", "cruiser", - "curisve", "cursive", - "currate", "curate", - "currens", "currents", - "curreny", "currency", - "currest", "currents", - "cursade", "crusade", - "curtian", "curtain", - "cyandie", "cyanide", - "cyclits", "cyclist", - "cycloen", "cyclone", - "cycolps", "cyclops", - "cylcist", "cyclist", - "cylcone", "cyclone", - "cylcops", "cyclops", - "cynaide", "cyanide", - "cyrptic", "cryptic", - "cyrstal", "crystal", - "dagners", "dangers", - "daimond", "diamond", - "damenor", "demeanor", - "dammage", "damage", - "darcula", "dracula", - "dargons", "dragons", - "darkets", "darkest", - "datbase", "database", - "daulity", "duality", - "dawrves", "dwarves", - "ddogers", "dodgers", - "ddoging", "dodging", - "deadlit", "deadlift", - "deadpol", "deadpool", - "deafult", "default", - "deahtly", "deathly", - "deatils", "details", - "deatlhy", "deathly", - "decalre", "declare", - "decison", "decision", - "declars", "declares", - "declase", "declares", - "decress", "decrees", - "decribe", "describe", - "decsend", "descend", - "dectect", "detect", - "defaint", "defiant", - "defauls", "defaults", - "defelct", "deflect", - "defensd", "defends", - "deffine", "define", - "definat", "defiant", - "definet", "definite", - "definie", "definite", - "definig", "defining", - "definit", "definite", - "defualt", "default", - "degarde", "degrade", - "degrase", "degrasse", - "degrate", "degrade", - "deiners", "deniers", - "deisgns", "designs", - "deivant", "deviant", - "dekstop", "desktop", - "delcare", "declare", - "delfect", "deflect", - "demenor", "demeanor", - "dementa", "dementia", - "demsond", "desmond", - "deneirs", "deniers", - "denisty", "density", - "densley", "densely", - "depcits", "depicts", - "dependd", "depended", - "depitcs", "depicts", - "deployd", "deployed", - "depsise", "despise", - "descrie", "describe", - "descuss", "discuss", - "desgins", "designs", - "desings", "designs", - "desitny", "destiny", - "desnely", "densely", - "desnity", "density", - "desomnd", "desmond", - "despict", "depict", - "despide", "despised", - "despies", "despise", - "destkop", "desktop", - "destory", "destroy", - "destros", "destroys", - "detaild", "detailed", - "detials", "details", - "detorit", "detroit", - "detriot", "detroit", - "deuling", "dueling", - "devaint", "deviant", - "devaite", "deviate", - "devided", "divided", - "devlove", "devolve", - "devotin", "devotion", - "devovle", "devolve", - "diabets", "diabetes", - "dialecs", "dialects", - "dialoge", "dialogue", - "diamons", "diamonds", - "diasble", "disable", - "dicksih", "dickish", - "dicover", "discover", - "dictats", "dictates", - "dieties", "deities", - "dilpoma", "diploma", - "dimaond", "diamond", - "dingity", "dignity", - "dinosar", "dinosaur", - "diosese", "diocese", - "dipolma", "diploma", - "dirbble", "dribble", - "directy", "directly", - "diretcx", "directx", - "dirived", "derived", - "dirvers", "drivers", - "disbale", "disable", - "disguss", "disgusts", - "disliks", "dislikes", - "disover", "discover", - "dispair", "despair", - "dispath", "dispatch", - "dispite", "despite", - "dispuse", "disputes", - "disputs", "disputes", - "dissole", "dissolve", - "distase", "distaste", - "distint", "distinct", - "divison", "division", - "docuhes", "douches", - "docuhey", "douchey", - "dogders", "dodgers", - "dogding", "dodging", - "dolhpin", "dolphin", - "dolphis", "dolphins", - "dominae", "dominate", - "dominno", "dominion", - "doplhin", "dolphin", - "dortmud", "dortmund", - "draclua", "dracula", - "dracual", "dracula", - "drakest", "darkest", - "dramtic", "dramatic", - "dribbel", "dribble", - "driectx", "directx", - "driftig", "drifting", - "drinkes", "drinkers", - "druming", "drumming", - "duailty", "duality", - "dualtiy", "duality", - "dubsetp", "dubstep", - "dulaity", "duality", - "duleing", "dueling", - "dunegon", "dungeon", - "dungeos", "dungeons", - "dungoen", "dungeon", - "durring", "during", - "dusbtep", "dubstep", - "dyansty", "dynasty", - "dynamis", "dynamics", - "dynsaty", "dynasty", - "earlies", "earliest", - "earliet", "earliest", - "earplus", "earplugs", - "eastwod", "eastwood", - "ebcuase", "becuase", - "ecilpse", "eclipse", - "eclipes", "eclipse", - "eclispe", "eclipse", - "eclpise", "eclipse", - "ectsasy", "ecstasy", - "edbiles", "edibles", - "edibels", "edibles", - "effords", "efforts", - "ehtanol", "ethanol", - "eifnach", "einfach", - "eighten", "eighteen", - "einfahc", "einfach", - "elasped", "elapsed", - "elcipse", "eclipse", - "elction", "election", - "elecrto", "electro", - "electic", "electric", - "electon", "election", - "ellitot", "elliott", - "elloitt", "elliott", - "elphant", "elephant", - "emabrgo", "embargo", - "emabssy", "embassy", - "emapthy", "empathy", - "embeded", "embedded", - "embrago", "embargo", - "eminate", "emanate", - "emipres", "empires", - "emision", "emission", - "emiting", "emitting", - "emition", "emission", - "emmited", "emitted", - "empahty", "empathy", - "emphsis", "emphasis", - "empiers", "empires", - "empited", "emptied", - "emplore", "employer", - "emporer", "emperor", - "empries", "empires", - "emtpied", "emptied", - "enameld", "enameled", - "encahnt", "enchant", - "encalve", "enclave", - "encrpyt", "encrypt", - "encyrpt", "encrypt", - "endores", "endorse", - "endrose", "endorse", - "energis", "energies", - "enforse", "enforces", - "enginer", "engineer", - "englsih", "english", - "enhanse", "enhances", - "enlcave", "enclave", - "enlgish", "english", - "enlsave", "enslave", - "ensalve", "enslave", - "entbook", "netbook", - "entirey", "entirety", - "entorpy", "entropy", - "epiloge", "epilogue", - "episdoe", "episode", - "epsiode", "episode", - "epsorts", "esports", - "eptiome", "epitome", - "equiped", "equipped", - "erested", "arrested", - "escapse", "escapes", - "escpaes", "escapes", - "esctasy", "ecstasy", - "esporst", "esports", - "espreso", "espresso", - "esprots", "esports", - "essense", "essence", - "etherel", "ethereal", - "ethnaol", "ethanol", - "euphora", "euphoria", - "europen", "european", - "eurpean", "european", - "everets", "everest", - "everset", "everest", - "evloved", "evolved", - "evloves", "evolves", - "evovled", "evolved", - "evovles", "evolves", - "exaclty", "exactly", - "exahust", "exhaust", - "examind", "examined", - "exapnds", "expands", - "exatled", "exalted", - "excange", "exchange", - "excatly", "exactly", - "excells", "excels", - "exceprt", "excerpt", - "excluse", "excludes", - "excrept", "excerpt", - "exculde", "exclude", - "exelent", "excellent", - "exemple", "example", - "exerpts", "excerpts", - "exhasut", "exhaust", - "exhuast", "exhaust", - "exising", "existing", - "existet", "existent", - "exlated", "exalted", - "exlcude", "exclude", - "exliled", "exiled", - "exludes", "excludes", - "exmaple", "example", - "exoitcs", "exotics", - "expalin", "explain", - "expeced", "expected", - "expells", "expels", - "expiers", "expires", - "explict", "explicit", - "expliot", "exploit", - "explods", "explodes", - "explose", "explodes", - "expolde", "explode", - "expolit", "exploit", - "exposse", "exposes", - "expries", "expires", - "exsited", "existed", - "extered", "exerted", - "exterme", "extreme", - "extoics", "exotics", - "extreem", "extreme", - "extrems", "extremes", - "eyebals", "eyeballs", - "eyebros", "eyebrows", - "fabulos", "fabulous", - "facebok", "facebook", - "facepam", "facepalm", - "faclons", "falcons", - "facsism", "fascism", - "facsist", "fascist", - "failurs", "failures", - "faincee", "fiancee", - "falesly", "falsely", - "falired", "flaired", - "falshed", "flashed", - "falshes", "flashes", - "falsley", "falsely", - "falvors", "flavors", - "familes", "families", - "famoust", "famous", - "famousy", "famously", - "fanatsy", "fantasy", - "fantaic", "fanatic", - "faoming", "foaming", - "fascits", "fascist", - "fasicsm", "fascism", - "fasicst", "fascist", - "faslely", "falsely", - "fatiuge", "fatigue", - "febuary", "february", - "fecthed", "fetched", - "fecthes", "fetches", - "feminen", "feminine", - "feminie", "feminine", - "feminim", "feminism", - "feodras", "fedoras", - "fertily", "fertility", - "fesitve", "festive", - "fethced", "fetched", - "fethces", "fetches", - "fetishs", "fetishes", - "fianite", "finite", - "fianlly", "finally", - "fiercly", "fiercely", - "filcker", "flicker", - "filpped", "flipped", - "filterd", "filtered", - "finacee", "fiancee", - "fineses", "finesse", - "fininsh", "finnish", - "finishs", "finishes", - "finisse", "finishes", - "finnsih", "finnish", - "firends", "friends", - "firggin", "friggin", - "firsbee", "frisbee", - "firslty", "firstly", - "firtsly", "firstly", - "fitlers", "filters", - "flacons", "falcons", - "flahsed", "flashed", - "flahses", "flashes", - "flaried", "flaired", - "flasely", "falsely", - "flashig", "flashing", - "flavord", "flavored", - "flavous", "flavours", - "flawess", "flawless", - "flciker", "flicker", - "fliters", "filters", - "flordia", "florida", - "florene", "florence", - "fnaatic", "fanatic", - "fomaing", "foaming", - "fonetic", "phonetic", - "forefit", "forfeit", - "foregin", "foreign", - "foreing", "foreign", - "forfiet", "forfeit", - "forhead", "forehead", - "foriegn", "foreign", - "formaly", "formally", - "formery", "formerly", - "formost", "foremost", - "formual", "formula", - "formuls", "formulas", - "forrset", "forrest", - "forsakn", "forsaken", - "forsane", "forsaken", - "forumla", "formula", - "fountan", "fountain", - "fourten", "fourteen", - "fracter", "fracture", - "fragmet", "fragment", - "freedos", "freedoms", - "freinds", "friends", - "frigign", "friggin", - "fristly", "firstly", - "frostig", "frosting", - "frsibee", "frisbee", - "fruitin", "fruition", - "fullets", "fullest", - "fullset", "fullest", - "funides", "fundies", - "funtion", "function", - "furance", "furnace", - "furncae", "furnace", - "futhroc", "futhark", - "gadgest", "gadgets", - "gagdets", "gadgets", - "galatic", "galactic", - "galcier", "glacier", - "galsgow", "glasgow", - "gameply", "gameplay", - "gamerga", "gamertag", - "gankign", "ganking", - "ganster", "gangster", - "garabge", "garbage", - "garfied", "garfield", - "garnola", "granola", - "generas", "generals", - "genersl", "generals", - "geniuss", "geniuses", - "geogria", "georgia", - "geomety", "geometry", - "georiga", "georgia", - "gernade", "grenade", - "gerogia", "georgia", - "gigabye", "gigabyte", - "giltchy", "glitchy", - "gimmics", "gimmicks", - "gimmicy", "gimmicky", - "girzzly", "grizzly", - "glagsow", "glasgow", - "glaicer", "glacier", - "glicthy", "glitchy", - "glimpes", "glimpse", - "glimspe", "glimpse", - "glipmse", "glimpse", - "glitchd", "glitched", - "glitchs", "glitches", - "glithcy", "glitchy", - "globaly", "globally", - "gloiath", "goliath", - "glorios", "glorious", - "gltichy", "glitchy", - "gnaking", "ganking", - "gnawwed", "gnawed", - "goddanm", "goddamn", - "goddman", "goddamn", - "godliek", "godlike", - "godlman", "goldman", - "godsped", "godspeed", - "goergia", "georgia", - "goilath", "goliath", - "golaith", "goliath", - "golbins", "goblins", - "goldamn", "goldman", - "goldbeg", "goldberg", - "goldike", "godlike", - "golitah", "goliath", - "goodluk", "goodluck", - "gorumet", "gourmet", - "gosepls", "gospels", - "gosples", "gospels", - "gpysies", "gypsies", - "grabage", "garbage", - "grahpic", "graphic", - "grainte", "granite", - "grammer", "grammar", - "graniet", "granite", - "grantie", "granite", - "graphie", "graphite", - "graphis", "graphics", - "grappel", "grapple", - "greande", "grenade", - "grenads", "grenades", - "greneer", "greener", - "griaffe", "giraffe", - "gridles", "griddles", - "grillig", "grilling", - "grpahic", "graphic", - "guardin", "guardian", - "guiness", "guinness", - "gullibe", "gullible", - "gutiars", "guitars", - "gypises", "gypsies", - "gyspies", "gypsies", - "habaeus", "habeas", - "haethen", "heathen", - "hailfax", "halifax", - "halfiax", "halifax", - "handbok", "handbook", - "handedy", "handedly", - "handeld", "handled", - "hanlder", "handler", - "hannibl", "hannibal", - "hanuted", "haunted", - "haorder", "hoarder", - "hapened", "happened", - "happend", "happened", - "happliy", "happily", - "harased", "harassed", - "harases", "harasses", - "hardend", "hardened", - "hardwod", "hardwood", - "haricut", "haircut", - "hatchig", "hatching", - "hauntig", "haunting", - "haviest", "heaviest", - "headest", "headset", - "headses", "headsets", - "heaveny", "heavenly", - "heigher", "higher", - "heigths", "heights", - "helemts", "helmets", - "hellfie", "hellfire", - "hellvua", "helluva", - "helment", "helmet", - "helpped", "helped", - "hemlets", "helmets", - "henious", "heinous", - "heorics", "heroics", - "heorine", "heroine", - "heriocs", "heroics", - "herione", "heroine", - "herocis", "heroics", - "heronie", "heroine", - "hesiman", "heisman", - "hieghts", "heights", - "hienous", "heinous", - "hiesman", "heisman", - "himselv", "himself", - "hiptser", "hipster", - "hismelf", "himself", - "hispter", "hipster", - "hitboxs", "hitboxes", - "hoilday", "holiday", - "hokpins", "hopkins", - "holdiay", "holiday", - "holdins", "holdings", - "homniem", "hominem", - "horader", "hoarder", - "hosited", "hoisted", - "hosthot", "hotshot", - "hostles", "hostels", - "hostpot", "hotspot", - "hothsot", "hotshot", - "hotpsot", "hotspot", - "hotsopt", "hotspot", - "hounour", "honour", - "hseldon", "sheldon", - "huanted", "haunted", - "humanit", "humanist", - "humants", "humanist", - "humidiy", "humidity", - "humoros", "humorous", - "hunagry", "hungary", - "hunderd", "hundred", - "hundres", "hundreds", - "hungray", "hungary", - "hurdels", "hurdles", - "hurldes", "hurdles", - "husbans", "husbands", - "hweaton", "wheaton", - "hybirds", "hybrids", - "hydogen", "hydrogen", - "hygeine", "hygiene", - "hypnoss", "hypnosis", - "hyrbids", "hybrids", - "hystera", "hysteria", - "iceforg", "icefrog", - "ierland", "ireland", - "ignitin", "ignition", - "ignorat", "ignorant", - "illegas", "illegals", - "illegsl", "illegals", - "illinos", "illinois", - "imanent", "eminent", - "imapcts", "impacts", - "iminent", "eminent", - "imminet", "imminent", - "implict", "implicit", - "imploed", "implode", - "imploys", "employs", - "impluse", "impulse", - "impolde", "implode", - "importd", "imported", - "imporve", "improve", - "impules", "impulse", - "impusle", "impulse", - "imrpove", "improve", - "incldue", "include", - "incluse", "includes", - "indains", "indians", - "indiaan", "indiana", - "indluge", "indulge", - "indugle", "indulge", - "infalte", "inflate", - "infenro", "inferno", - "infered", "inferred", - "inferir", "inferior", - "infinet", "infinite", - "infinie", "infinite", - "infinit", "infinite", - "infornt", "infront", - "infroms", "informs", - "infrotn", "infront", - "inheirt", "inherit", - "inidans", "indians", - "initals", "initials", - "initisl", "initials", - "inlcine", "incline", - "inovker", "invoker", - "inpeach", "impeach", - "inpsect", "inspect", - "inpsire", "inspire", - "inquier", "inquire", - "inquriy", "inquiry", - "insaney", "insanely", - "inscets", "insects", - "insepct", "inspect", - "insipre", "inspire", - "insluts", "insults", - "instade", "instead", - "instint", "instinct", - "intenst", "intents", - "intered", "interred", - "interet", "interest", - "internt", "internet", - "interro", "interior", - "intrest", "interest", - "intrige", "intrigue", - "invlove", "involve", - "invoekr", "invoker", - "invovle", "involve", - "iornman", "ironman", - "iranain", "iranian", - "iranias", "iranians", - "iranina", "iranian", - "irleand", "ireland", - "ironamn", "ironman", - "isalmic", "islamic", - "isareli", "israeli", - "islamit", "islamist", - "islmaic", "islamic", - "isloate", "isolate", - "isralei", "israeli", - "isreali", "israeli", - "italias", "italians", - "jagaurs", "jaguars", - "jaguras", "jaguars", - "jamacia", "jamaica", - "jamaina", "jamaican", - "jamiaca", "jamaica", - "jamsine", "jasmine", - "janaury", "january", - "januray", "january", - "japanes", "japanese", - "jasmien", "jasmine", - "jaugars", "jaguars", - "jaunary", "january", - "jeircho", "jericho", - "jennins", "jennings", - "jeopary", "jeopardy", - "jeresys", "jerseys", - "jericoh", "jericho", - "jersyes", "jerseys", - "jewerly", "jewelry", - "jorunal", "journal", - "jounral", "journal", - "joystik", "joystick", - "juadism", "judaism", - "judasim", "judaism", - "judical", "judicial", - "juipter", "jupiter", - "junglig", "jungling", - "juptier", "jupiter", - "jusitfy", "justify", - "justfiy", "justify", - "karakoe", "karaoke", - "karoake", "karaoke", - "kenendy", "kennedy", - "kenndey", "kennedy", - "kentucy", "kentucky", - "keyboad", "keyboard", - "keychan", "keychain", - "keynode", "keynote", - "kicthen", "kitchen", - "killins", "killings", - "kineitc", "kinetic", - "kinghts", "knights", - "kinteic", "kinetic", - "kitches", "kitchens", - "kitites", "kitties", - "knietic", "kinetic", - "knigths", "knights", - "knuckel", "knuckle", - "kroeans", "koreans", - "krudish", "kurdish", - "ktichen", "kitchen", - "kubirck", "kubrick", - "kunckle", "knuckle", - "kurbick", "kubrick", - "kuridsh", "kurdish", - "laguage", "language", - "landins", "landings", - "lantren", "lantern", - "laready", "already", - "laregly", "largely", - "largley", "largely", - "lasanga", "lasagna", - "lasgana", "lasagna", - "latitue", "latitude", - "latnern", "lantern", - "launhed", "launched", - "lavendr", "lavender", - "leathal", "lethal", - "lefitst", "leftist", - "leftits", "leftist", - "legnths", "lengths", - "legnthy", "lengthy", - "legoins", "legions", - "leigons", "legions", - "lenghts", "lengths", - "lenoard", "leonard", - "lepoard", "leopard", - "lesbain", "lesbian", - "lesiban", "lesbian", - "lesiure", "leisure", - "liasion", "liaison", - "liasons", "liaisons", - "liberae", "liberate", - "liberas", "liberals", - "lienups", "lineups", - "liesure", "leisure", - "liftime", "lifetime", - "lighlty", "lightly", - "lightes", "lighters", - "ligthly", "lightly", - "linclon", "lincoln", - "linueps", "lineups", - "liqiuds", "liquids", - "lisence", "license", - "lisense", "license", - "listend", "listened", - "litecon", "litecoin", - "literae", "literate", - "lithuim", "lithium", - "litihum", "lithium", - "loadous", "loadouts", - "loenard", "leonard", - "loepard", "leopard", - "logiteh", "logitech", - "loosley", "loosely", - "luandry", "laundry", - "luckliy", "luckily", - "luicfer", "lucifer", - "lunatis", "lunatics", - "maching", "machine", - "machins", "machines", - "maclolm", "malcolm", - "macthup", "matchup", - "madsion", "madison", - "magents", "magnets", - "magicin", "magician", - "magolia", "magnolia", - "maidson", "madison", - "maintan", "maintain", - "mairlyn", "marilyn", - "malaira", "malaria", - "malaysa", "malaysia", - "malclom", "malcolm", - "manauls", "manuals", - "mandase", "mandates", - "mandats", "mandates", - "mangeld", "mangled", - "mangets", "magnets", - "manualy", "manually", - "manuver", "maneuver", - "marbels", "marbles", - "margart", "margaret", - "mariage", "marriage", - "mariens", "marines", - "maritan", "martian", - "marixsm", "marxism", - "mariyln", "marilyn", - "markede", "marketed", - "marlbes", "marbles", - "marliyn", "marilyn", - "marnies", "marines", - "marrage", "marriage", - "martail", "martial", - "martain", "martian", - "masacra", "mascara", - "massace", "massacre", - "mathcup", "matchup", - "mathwes", "mathews", - "matrial", "martial", - "maunals", "manuals", - "mcalren", "mclaren", - "meanins", "meanings", - "medicad", "medicaid", - "medicae", "medicare", - "medioce", "mediocre", - "meixcan", "mexican", - "meldoic", "melodic", - "melieux", "milieux", - "melodis", "melodies", - "memeber", "member", - "memoery", "memory", - "memorie", "memory", - "menally", "mentally", - "mentaly", "mentally", - "meoldic", "melodic", - "meranda", "veranda", - "merchat", "merchant", - "merucry", "mercury", - "messagd", "messaged", - "messaih", "messiah", - "metagem", "metagame", - "metalic", "metallic", - "mexcian", "mexican", - "michina", "michigan", - "midfied", "midfield", - "midotwn", "midtown", - "midtwon", "midtown", - "migrans", "migrants", - "militat", "militant", - "militis", "militias", - "miltary", "military", - "mimimum", "minimum", - "mineras", "minerals", - "mininos", "minions", - "ministr", "minister", - "ministy", "ministry", - "minoins", "minions", - "minstry", "ministry", - "minumum", "minimum", - "mirrord", "mirrored", - "misandy", "misandry", - "misison", "mission", - "misouri", "missouri", - "mispell", "misspell", - "missils", "missiles", - "mistery", "mystery", - "mobiliy", "mobility", - "modualr", "modular", - "momento", "memento", - "momment", "moment", - "monarcy", "monarchy", - "monatge", "montage", - "monglos", "mongols", - "monitos", "monitors", - "monstre", "monster", - "montaeg", "montage", - "montrel", "montreal", - "monumet", "monument", - "morbidy", "morbidly", - "morgage", "mortgage", - "morphen", "morphine", - "morphie", "morphine", - "morroco", "morocco", - "mortage", "mortgage", - "mosnter", "monster", - "mosture", "moisture", - "motivet", "motivate", - "motnage", "montage", - "motoral", "motorola", - "mountan", "mountain", - "movment", "movement", - "mucuous", "mucous", - "muesums", "museums", - "muliple", "multiple", - "mulsims", "muslims", - "multipe", "multiple", - "multipy", "multiply", - "munbers", "numbers", - "munchis", "munchies", - "murderd", "murdered", - "muscial", "musical", - "mushrom", "mushroom", - "musilms", "muslims", - "muslces", "muscles", - "musuems", "museums", - "mutatin", "mutation", - "mypsace", "myspace", - "mysapce", "myspace", - "napolen", "napoleon", - "narhwal", "narwhal", - "natique", "antique", - "nativey", "natively", - "natrual", "natural", - "naugthy", "naughty", - "nauseos", "nauseous", - "nautils", "nautilus", - "nautral", "natural", - "nautres", "natures", - "nectode", "netcode", - "needels", "needles", - "neruons", "neurons", - "neslave", "enslave", - "netocde", "netcode", - "netowrk", "network", - "netural", "neutral", - "neturon", "neutron", - "netwrok", "network", - "neurton", "neutron", - "neuterd", "neutered", - "nighlty", "nightly", - "nigthly", "nightly", - "nihilim", "nihilism", - "ninties", "1990s", - "niverse", "inverse", - "nocture", "nocturne", - "nominae", "nominate", - "nominet", "nominate", - "nonsene", "nonsense", - "noramls", "normals", - "norhern", "northern", - "normaly", "normally", - "normany", "normandy", - "northen", "northern", - "nostris", "nostrils", - "notario", "ontario", - "notebok", "notebook", - "nothern", "northern", - "nowdays", "nowadays", - "nrivana", "nirvana", - "nuaghty", "naughty", - "nubmers", "numbers", - "nucelar", "nuclear", - "nucelus", "nucleus", - "nuclean", "unclean", - "nuclues", "nucleus", - "nucular", "nuclear", - "nuerons", "neurons", - "nuetral", "neutral", - "nuetron", "neutron", - "nulcear", "nuclear", - "nullfiy", "nullify", - "nusance", "nuisance", - "nutriet", "nutrient", - "oarcles", "oracles", - "obivous", "obvious", - "obvoius", "obvious", - "ocarnia", "ocarina", - "ocasion", "occasion", - "occured", "occurred", - "ocotber", "october", - "ocotpus", "octopus", - "ocraina", "ocarina", - "ocuntry", "country", - "ocurred", "occurred", - "ofcoure", "ofcourse", - "offcers", "officers", - "offical", "official", - "offisde", "offside", - "oftenly", "often", - "ogrilla", "gorilla", - "olmypic", "olympic", - "olreans", "orleans", - "olympis", "olympics", - "olypmic", "olympic", - "omision", "omission", - "omiting", "omitting", - "omlette", "omelette", - "ommited", "omitted", - "onatrio", "ontario", - "onbaord", "onboard", - "onborad", "onboard", - "ontairo", "ontario", - "ontraio", "ontario", - "opartor", "operator", - "openess", "openness", - "opitcal", "optical", - "opitmal", "optimal", - "oponent", "opponent", - "oposite", "opposite", - "oppenly", "openly", - "opponet", "opponent", - "oprhans", "orphans", - "optimim", "optimism", - "oracels", "oracles", - "oragnes", "oranges", - "oragsms", "orgasms", - "oralces", "oracles", - "orbtial", "orbital", - "orcales", "oracles", - "orelans", "orleans", - "organes", "organise", - "organie", "organise", - "organim", "organism", - "orginal", "original", - "orhpans", "orphans", - "oribtal", "orbital", - "orlenas", "orleans", - "orpahns", "orphans", - "orthodx", "orthodox", - "outfied", "outfield", - "outsidr", "outsider", - "overhal", "overhaul", - "overpad", "overpaid", - "oversue", "overuse", - "overtun", "overturn", - "ownders", "wonders", - "owuldve", "wouldve", - "oylmpic", "olympic", - "pacakge", "package", - "pacifit", "pacifist", - "packade", "packaged", - "pacthes", "patches", - "pahntom", "phantom", - "paitent", "patient", - "palcebo", "placebo", - "pallete", "palette", - "palster", "plaster", - "palyboy", "playboy", - "pamflet", "pamphlet", - "pamplet", "pamphlet", - "pancaks", "pancakes", - "pandroa", "pandora", - "panthen", "pantheon", - "paradim", "paradigm", - "paradse", "parades", - "paralel", "parallel", - "paranoa", "paranoia", - "parises", "praises", - "parites", "parties", - "partice", "particle", - "partick", "patrick", - "partiel", "particle", - "partiot", "patriot", - "partols", "patrols", - "passabe", "passable", - "passivs", "passives", - "pasuing", "pausing", - "pateint", "patient", - "pathces", "patches", - "patiens", "patients", - "patirot", "patriot", - "patrcik", "patrick", - "patrios", "patriots", - "patroit", "patriot", - "peaples", "peoples", - "pebbels", "pebbles", - "peirced", "pierced", - "penatly", "penalty", - "pendulm", "pendulum", - "penguis", "penguins", - "penicls", "pencils", - "penison", "pension", - "penisse", "penises", - "penitum", "pentium", - "pensies", "penises", - "pensino", "pension", - "pentuim", "pentium", - "peopels", "peoples", - "percise", "precise", - "perdict", "predict", - "perfers", "prefers", - "perhasp", "perhaps", - "perhpas", "perhaps", - "perisan", "persian", - "perjery", "perjury", - "permade", "premade", - "permier", "premier", - "permise", "premise", - "permium", "premium", - "peroids", "periods", - "peronal", "personal", - "perpaid", "prepaid", - "perphas", "perhaps", - "persain", "persian", - "persets", "presets", - "persits", "persist", - "persued", "pursued", - "persuit", "pursuit", - "pervail", "prevail", - "perview", "preview", - "pharoah", "pharaoh", - "phatnom", "phantom", - "phsyics", "physics", - "phyiscs", "physics", - "physcis", "physics", - "physiqe", "physique", - "picthed", "pitched", - "picther", "pitcher", - "picthes", "pitches", - "piegons", "pigeons", - "piglrim", "pilgrim", - "pigoens", "pigeons", - "pilgirm", "pilgrim", - "pilrgim", "pilgrim", - "pinoeer", "pioneer", - "pinpoit", "pinpoint", - "pionere", "pioneer", - "pireced", "pierced", - "pithces", "pitches", - "plantes", "planets", - "plastis", "plastics", - "plastre", "plaster", - "plataeu", "plateau", - "plateua", "plateau", - "playabe", "playable", - "playofs", "playoffs", - "plesant", "pleasant", - "pligrim", "pilgrim", - "ploygon", "polygon", - "ploymer", "polymer", - "podemso", "podemos", - "podmeos", "podemos", - "poeples", "peoples", - "poignat", "poignant", - "poineer", "pioneer", - "pointes", "pointers", - "poisond", "poisoned", - "polgyon", "polygon", - "polical", "political", - "polishs", "polishes", - "polisse", "polishes", - "politey", "politely", - "poluted", "polluted", - "polutes", "pollutes", - "popluar", "popular", - "populer", "popular", - "populos", "populous", - "porpose", "propose", - "porshan", "portion", - "porshon", "portion", - "portait", "portrait", - "portary", "portray", - "portras", "portrays", - "portrat", "portrait", - "posions", "poisons", - "positon", "position", - "positve", "positive", - "possiby", "possibly", - "postdam", "potsdam", - "postion", "position", - "postive", "positive", - "potatos", "potatoes", - "potical", "optical", - "potrait", "portrait", - "powderd", "powdered", - "poweful", "powerful", - "poylgon", "polygon", - "poylmer", "polymer", - "practie", "practise", - "praisse", "praises", - "praries", "prairies", - "prasied", "praised", - "prasies", "praises", - "pratice", "practice", - "preamde", "premade", - "preceed", "precede", - "precice", "precise", - "preests", "presets", - "prehaps", "perhaps", - "preimer", "premier", - "preimum", "premium", - "preists", "priests", - "preivew", "preview", - "premeir", "premier", - "premiee", "premiere", - "premire", "premier", - "premits", "permits", - "premius", "premiums", - "premuim", "premium", - "prepair", "prepare", - "preriod", "period", - "presens", "presents", - "presest", "presets", - "presist", "persist", - "prestes", "presets", - "presude", "presumed", - "pretene", "pretense", - "pretens", "pretends", - "preveiw", "preview", - "prevert", "pervert", - "previal", "prevail", - "previes", "previews", - "previos", "previous", - "priased", "praised", - "priases", "praises", - "printes", "printers", - "pristen", "pristine", - "probabe", "probable", - "probaly", "probably", - "probelm", "problem", - "procede", "proceed", - "procees", "proceeds", - "procesd", "proceeds", - "proclam", "proclaim", - "produly", "proudly", - "produse", "produces", - "progidy", "prodigy", - "progrom", "pogrom", - "prohibt", "prohibit", - "prohpet", "prophet", - "prologe", "prologue", - "promose", "promotes", - "promots", "promotes", - "prompty", "promptly", - "promtps", "prompts", - "pronous", "pronouns", - "prooved", "proved", - "propeht", "prophet", - "prophey", "prophecy", - "propper", "proper", - "protals", "portals", - "protecs", "protects", - "protess", "protests", - "protocl", "protocol", - "protray", "portray", - "prouldy", "proudly", - "provded", "provided", - "provine", "province", - "prusuit", "pursuit", - "pryamid", "pyramid", - "pscyhed", "psyched", - "ptiched", "pitched", - "pticher", "pitcher", - "puasing", "pausing", - "publicy", "publicly", - "publsih", "publish", - "puhsups", "pushups", - "punishs", "punishes", - "punisse", "punishes", - "pursiut", "pursuit", - "pursude", "pursued", - "purused", "pursued", - "pushpus", "pushups", - "pyarmid", "pyramid", - "pyramis", "pyramids", - "pyrmaid", "pyramid", - "pysched", "psyched", - "qaulify", "qualify", - "qaulity", "quality", - "qauntum", "quantum", - "quailfy", "qualify", - "quailty", "quality", - "queires", "queries", - "queitly", "quietly", - "quereis", "queries", - "quicket", "quickest", - "quielty", "quietly", - "quitely", "quietly", - "qunatum", "quantum", - "qunetin", "quentin", - "racisst", "racists", - "racthet", "ratchet", - "radaint", "radiant", - "radiane", "radiance", - "radicas", "radicals", - "radiers", "raiders", - "raelism", "realism", - "raidant", "radiant", - "railrod", "railroad", - "rainbos", "rainbows", - "raoches", "roaches", - "raoming", "roaming", - "raptros", "raptors", - "raputre", "rapture", - "rathcet", "ratchet", - "ratpure", "rapture", - "reacing", "reaching", - "reagrds", "regards", - "realies", "realise", - "realsie", "realise", - "realsim", "realism", - "realtes", "relates", - "reamins", "remains", - "reapirs", "repairs", - "rebouns", "rebounds", - "rebulit", "rebuilt", - "recalim", "reclaim", - "receips", "receipts", - "recided", "resided", - "reciept", "receipt", - "recievd", "recieved", - "recieve", "receive", - "recitfy", "rectify", - "recived", "received", - "reclami", "reclaim", - "recliam", "reclaim", - "recorre", "recorder", - "recoves", "recovers", - "recpies", "recipes", - "redeemd", "redeemed", - "redners", "renders", - "refelct", "reflect", - "referal", "referral", - "refered", "referred", - "referig", "refering", - "referrs", "refers", - "reflexs", "reflexes", - "refrers", "refers", - "refroms", "reforms", - "refusla", "refusal", - "regerts", "regrets", - "regiems", "regimes", - "regimet", "regiment", - "registy", "registry", - "regluar", "regular", - "regrest", "regrets", - "regulae", "regulate", - "regulas", "regulars", - "regulsr", "regulars", - "reigmes", "regimes", - "reigons", "regions", - "reitres", "retires", - "reivews", "reviews", - "reknown", "renown", - "relaise", "realise", - "relapes", "relapse", - "relaspe", "relapse", - "relatie", "relative", - "relatin", "relation", - "relcaim", "reclaim", - "releive", "relieve", - "releses", "releases", - "relfect", "reflect", - "reliabe", "reliable", - "relient", "reliant", - "relized", "realised", - "relpase", "relapse", - "remaind", "remained", - "remaing", "remaining", - "remakrs", "remarks", - "remannt", "remnant", - "remeber", "remember", - "remians", "remains", - "remnans", "remnants", - "renderd", "rendered", - "renegae", "renegade", - "renmant", "remnant", - "rentors", "renters", - "rentres", "renters", - "renuion", "reunion", - "repaird", "repaired", - "repalys", "replays", - "repblic", "republic", - "repeast", "repeats", - "repitle", "reptile", - "replase", "replaces", - "replayd", "replayed", - "reponse", "response", - "repostd", "reposted", - "repsawn", "respawn", - "repsond", "respond", - "repsots", "reposts", - "reptiel", "reptile", - "reptils", "reptiles", - "repubic", "republic", - "republi", "republic", - "repulic", "republic", - "reqiuem", "requiem", - "requeim", "requiem", - "requime", "requiem", - "requred", "required", - "resapwn", "respawn", - "rescuse", "rescues", - "resembe", "resemble", - "reslove", "resolve", - "resolvs", "resolves", - "resonet", "resonate", - "resovle", "resolve", - "respest", "respects", - "respone", "response", - "respwan", "respawn", - "ressits", "resists", - "restord", "restored", - "resuced", "rescued", - "resuces", "rescues", - "returnd", "returned", - "reuinon", "reunion", - "reveald", "revealed", - "reveiws", "reviews", - "revelas", "reveals", - "reveral", "reversal", - "reviere", "reviewer", - "reviewd", "reviewed", - "reviewr", "reviewer", - "revolvr", "revolver", - "revolvs", "revolves", - "rewirte", "rewrite", - "reworkd", "reworked", - "rewriet", "rewrite", - "reynols", "reynolds", - "rhapsoy", "rhapsody", - "rhythem", "rhythm", - "rhythim", "rhythm", - "rhytmic", "rhythmic", - "riaders", "raiders", - "ritlain", "ritalin", - "ritoers", "rioters", - "rivarly", "rivalry", - "rivlary", "rivalry", - "roahces", "roaches", - "robotis", "robotics", - "rococco", "rococo", - "roestta", "rosetta", - "roiters", "rioters", - "roleply", "roleplay", - "romaina", "romania", - "romaing", "roaming", - "romanin", "romanian", - "romanna", "romanian", - "roomate", "roommate", - "rotuers", "routers", - "rugters", "rutgers", - "rulebok", "rulebook", - "rumorus", "rumours", - "rumuors", "rumours", - "runnung", "running", - "ruslted", "rustled", - "russina", "russian", - "russion", "russian", - "rusteld", "rustled", - "rythmic", "rhythmic", - "rythyms", "rhythms", - "sacrasm", "sarcasm", - "saddnes", "saddens", - "sadistc", "sadistic", - "sadning", "sanding", - "salaris", "salaries", - "salavge", "salvage", - "salvery", "slavery", - "salying", "slaying", - "sampels", "samples", - "samruai", "samurai", - "samuari", "samurai", - "samuria", "samurai", - "sandlas", "sandals", - "sandnig", "sanding", - "sanlder", "sandler", - "santorm", "santorum", - "sapphie", "sapphire", - "sarcams", "sarcasm", - "sargant", "sergeant", - "sasuage", "sausage", - "satifsy", "satisfy", - "satsify", "satisfy", - "satsohi", "satoshi", - "savanha", "savannah", - "savannh", "savannah", - "saveing", "saving", - "sawnsea", "swansea", - "sawnson", "swanson", - "scandas", "scandals", - "scannig", "scanning", - "scartch", "scratch", - "scheems", "schemes", - "schoold", "schooled", - "sciense", "sciences", - "scinece", "science", - "scootes", "scooters", - "scorpin", "scorpion", - "scpeter", "scepter", - "scracth", "scratch", - "scrambe", "scramble", - "scritps", "scripts", - "scrolld", "scrolled", - "scrpits", "scripts", - "scyhter", "scyther", - "seached", "searched", - "seaches", "searches", - "seahaws", "seahawks", - "seantor", "senator", - "searchd", "searched", - "searchs", "searches", - "sebrian", "serbian", - "secerts", "secrets", - "secpter", "scepter", - "secrest", "secrets", - "secrety", "secretly", - "seflies", "selfies", - "seguoys", "segues", - "seinors", "seniors", - "selifes", "selfies", - "senoirs", "seniors", - "sensure", "censure", - "sentaor", "senator", - "sentris", "sentries", - "serbain", "serbian", - "sergeat", "sergeant", - "sergent", "sergeant", - "seriban", "serbian", - "servans", "servants", - "sesnors", "sensors", - "settins", "settings", - "severly", "severely", - "sexualy", "sexually", - "seziure", "seizure", - "shaddow", "shadow", - "shanghi", "shanghai", - "shaprie", "sharpie", - "shaprly", "sharply", - "sharipe", "sharpie", - "shcemes", "schemes", - "sheelpe", "sheeple", - "sheepel", "sheeple", - "shephed", "shepherd", - "sherlok", "sherlock", - "shetler", "shelter", - "shevles", "shelves", - "shfiter", "shifter", - "shieldd", "shielded", - "shiping", "shipping", - "shirely", "shirley", - "shitfer", "shifter", - "shledon", "sheldon", - "shleter", "shelter", - "shoudln", "should", - "shouldt", "shouldnt", - "shoutot", "shoutout", - "showede", "showered", - "showerd", "showered", - "shperes", "spheres", - "shriley", "shirley", - "siblins", "siblings", - "sidelen", "sideline", - "sideral", "sidereal", - "siezing", "seizing", - "siezure", "seizure", - "signfiy", "signify", - "signins", "signings", - "signles", "singles", - "silders", "sliders", - "silenty", "silently", - "similir", "similiar", - "simliar", "similar", - "simplet", "simplest", - "simpley", "simply", - "simplfy", "simplify", - "simpliy", "simplify", - "simposn", "simpson", - "simspon", "simpson", - "singals", "signals", - "singels", "singles", - "singify", "signify", - "singsog", "singsong", - "sitmuli", "stimuli", - "skecthy", "sketchy", - "skeletl", "skeletal", - "skeptis", "skeptics", - "sketchs", "sketches", - "sketpic", "skeptic", - "skpetic", "skeptic", - "sktechy", "sketchy", - "skwyard", "skyward", - "slavage", "salvage", - "slayign", "slaying", - "sldiers", "sliders", - "slefies", "selfies", - "slighly", "slightly", - "slighty", "slightly", - "slippes", "slippers", - "slippey", "slippery", - "smaples", "samples", - "smartre", "smarter", - "smaurai", "samurai", - "snadler", "sandler", - "snigles", "singles", - "snippes", "snippets", - "snodwen", "snowden", - "snwoden", "snowden", - "snycing", "syncing", - "snyergy", "synergy", - "socialy", "socially", - "sofware", "software", - "soildly", "solidly", - "soldies", "soldiers", - "soldily", "solidly", - "somaila", "somalia", - "someons", "someones", - "somethn", "somethin", - "southen", "southern", - "soveits", "soviets", - "spacebr", "spacebar", - "spainsh", "spanish", - "spansih", "spanish", - "spanwed", "spawned", - "sparkel", "sparkle", - "spartas", "spartans", - "spartsn", "spartans", - "sparyed", "sprayed", - "spawend", "spawned", - "spawnig", "spawning", - "specail", "special", - "specfic", "specific", - "specias", "specials", - "specisl", "specials", - "spectum", "spectrum", - "speechs", "speeches", - "spehres", "spheres", - "speical", "special", - "speices", "species", - "spellig", "spelling", - "spindel", "spindle", - "spiritd", "spirited", - "splaton", "splatoon", - "splittr", "splitter", - "spoiles", "spoilers", - "spoitfy", "spotify", - "spolied", "spoiled", - "sponser", "sponsor", - "sporles", "sproles", - "sporuts", "sprouts", - "spotfiy", "spotify", - "sprinke", "sprinkle", - "sproels", "sproles", - "spwaned", "spawned", - "sqaures", "squares", - "sqeuaky", "squeaky", - "sqiushy", "squishy", - "squarey", "squarely", - "squirel", "squirtle", - "squirle", "squirrel", - "squirrl", "squirrel", - "squirte", "squirtle", - "squsihy", "squishy", - "sriraca", "sriracha", - "srpouts", "sprouts", - "sryians", "syrians", - "sryinge", "syringe", - "stadius", "stadiums", - "staduim", "stadium", - "stagnat", "stagnant", - "staidum", "stadium", - "stakler", "stalker", - "stalkes", "stalkers", - "stamnia", "stamina", - "staoshi", "satoshi", - "starins", "strains", - "startde", "startled", - "startus", "startups", - "statits", "statist", - "statsit", "statist", - "statuer", "stature", - "statuse", "statutes", - "statuts", "statutes", - "stautes", "statues", - "stealty", "stealthy", - "steeles", "steelers", - "steorid", "steroid", - "steriel", "sterile", - "sterlie", "sterile", - "stickes", "stickers", - "stiring", "stirring", - "stirker", "striker", - "stirrig", "stirring", - "stitchs", "stitches", - "stlaker", "stalker", - "stlyish", "stylish", - "storeis", "stories", - "storise", "stories", - "stormde", "stormed", - "straigt", "straight", - "straind", "strained", - "streamd", "streamed", - "stregth", "strength", - "strengh", "strength", - "streoid", "steroid", - "stresss", "stresses", - "strians", "strains", - "stricty", "strictly", - "striekr", "striker", - "stromed", "stormed", - "stubbon", "stubborn", - "studing", "studying", - "stuidos", "studios", - "stunami", "tsunami", - "stupidr", "stupider", - "stupidy", "stupidly", - "stupire", "stupider", - "suasage", "sausage", - "subisdy", "subsidy", - "subjest", "subjects", - "subtiel", "subtitle", - "succede", "succeed", - "succeds", "succeeds", - "succees", "succeeds", - "succesd", "succeeds", - "suceeds", "succeeds", - "suddeny", "suddenly", - "suefull", "usefull", - "sufferd", "suffered", - "summonr", "summoner", - "summore", "summoner", - "sunggle", "snuggle", - "sunifre", "sunfire", - "superme", "supreme", - "suposed", "supposed", - "suposes", "supposes", - "suppoed", "supposed", - "suppost", "supports", - "suprass", "surpass", - "supress", "suppress", - "suprisd", "suprised", - "suprise", "surprise", - "suprize", "surprise", - "supsend", "suspend", - "suround", "surround", - "surpeme", "supreme", - "surroud", "surround", - "sweidsh", "swedish", - "swiflty", "swiftly", - "swiming", "swimming", - "switchs", "switches", - "switfly", "swiftly", - "swnasea", "swansea", - "sycning", "syncing", - "sycther", "scyther", - "syirans", "syrians", - "sykward", "skyward", - "syllabe", "syllable", - "symetry", "symmetry", - "symmety", "symmetry", - "symobls", "symbols", - "sympaty", "sympathy", - "symtpom", "symptom", - "synegry", "synergy", - "synoynm", "synonym", - "sypmtom", "symptom", - "syracue", "syracuse", - "syrains", "syrians", - "sysadmn", "sysadmin", - "systemc", "systemic", - "sytlish", "stylish", - "tabacco", "tobacco", - "tailban", "taliban", - "tailord", "tailored", - "talbian", "taliban", - "tallets", "tallest", - "tangeld", "tangled", - "tanlged", "tangled", - "targetd", "targeted", - "taryvon", "trayvon", - "teached", "taught", - "teaspon", "teaspoon", - "techeis", "techies", - "tehcies", "techies", - "temepst", "tempest", - "tempels", "temples", - "tempets", "tempest", - "templas", "templars", - "tempset", "tempest", - "tenacle", "tentacle", - "tendacy", "tendency", - "tequlia", "tequila", - "tesitfy", "testify", - "testice", "testicle", - "teusday", "tuesday", - "thankyu", "thankyou", - "thearpy", "therapy", - "theistc", "theistic", - "theives", "thieves", - "themsef", "themself", - "therefo", "thereof", - "therien", "therein", - "theroem", "theorem", - "thesits", "theists", - "thiests", "theists", - "thirldy", "thirdly", - "thirten", "thirteen", - "thirtsy", "thirsty", - "thoerem", "theorem", - "thorats", "throats", - "thornes", "thrones", - "thoruim", "thorium", - "thoughs", "thoughts", - "threadd", "threaded", - "threeof", "thereof", - "thridly", "thirdly", - "thristy", "thirsty", - "throast", "throats", - "throium", "thorium", - "thryoid", "thyroid", - "thyorid", "thyroid", - "thyriod", "thyroid", - "tigther", "tighter", - "tiolets", "toilets", - "tirdent", "trident", - "titanim", "titanium", - "tlaking", "talking", - "tobbaco", "tobacco", - "toliets", "toilets", - "tolkein", "tolkien", - "tomatos", "tomatoes", - "tongiht", "tonight", - "tonuges", "tongues", - "toppins", "toppings", - "torando", "tornado", - "torndao", "tornado", - "torpdeo", "torpedo", - "torrest", "torrents", - "tortila", "tortilla", - "toruney", "tourney", - "toubles", "troubles", - "touchda", "touchpad", - "tounrey", "tourney", - "tourisy", "touristy", - "tourits", "tourist", - "tournes", "tourneys", - "toursim", "tourism", - "toursit", "tourist", - "towords", "towards", - "trackes", "trackers", - "trailes", "trailers", - "traines", "trainers", - "trainig", "training", - "tralier", "trailer", - "tratior", "traitor", - "traveld", "traveled", - "travere", "traverse", - "travesy", "travesty", - "travles", "travels", - "treasue", "treasure", - "treatis", "treaties", - "tremelo", "tremolo", - "trendig", "trending", - "trialer", "trailer", - "triange", "triangle", - "triator", "traitor", - "trickey", "trickery", - "tridnet", "trident", - "trimuph", "triumph", - "trinkes", "trinkets", - "trinkst", "trinkets", - "trintiy", "trinity", - "triolgy", "trilogy", - "troleld", "trolled", - "troling", "trolling", - "tronado", "tornado", - "tropedo", "torpedo", - "trudnle", "trundle", - "truimph", "triumph", - "trukish", "turkish", - "trundel", "trundle", - "trunlde", "trundle", - "tryahrd", "tryhard", - "tryavon", "trayvon", - "tsamina", "stamina", - "tsnuami", "tsunami", - "tsuanmi", "tsunami", - "tsunmai", "tsunami", - "tuesdsy", "tuesdays", - "tunnles", "tunnels", - "turbins", "turbines", - "turksih", "turkish", - "turltes", "turtles", - "turrest", "turrets", - "turtels", "turtles", - "tuseday", "tuesday", - "tusnami", "tsunami", - "tutrles", "turtles", - "twiligt", "twilight", - "tyelnol", "tylenol", - "typcial", "typical", - "tyrhard", "tryhard", - "tyrrany", "tyranny", - "udpated", "updated", - "uesfull", "usefull", - "ugprade", "upgrade", - "ukarine", "ukraine", - "ukranie", "ukraine", - "ukriane", "ukraine", - "ultimae", "ultimate", - "umbrela", "umbrella", - "unahppy", "unhappy", - "unbannd", "unbanned", - "underog", "undergo", - "unfairy", "unfairly", - "ungoldy", "ungodly", - "unicors", "unicorns", - "uniquey", "uniquely", - "unknwon", "unknown", - "unkonwn", "unknown", - "unlcean", "unclean", - "unlcoks", "unlocks", - "unlcuky", "unlucky", - "unlikey", "unlikely", - "unopend", "unopened", - "unprone", "unproven", - "unusabe", "unusable", - "unworty", "unworthy", - "upgarde", "upgrade", - "upgrads", "upgrades", - "uplaods", "uploads", - "upsteam", "upstream", - "urainum", "uranium", - "uranuim", "uranium", - "uretrha", "urethra", - "urkaine", "ukraine", - "urnaium", "uranium", - "urugauy", "uruguay", - "usefull", "useful", - "usefuly", "usefully", - "utiltiy", "utility", - "utopain", "utopian", - "utpoian", "utopian", - "vaccins", "vaccines", - "vaccume", "vacuum", - "vageuly", "vaguely", - "vaguley", "vaguely", - "vairant", "variant", - "valenca", "valencia", - "valetta", "valletta", - "valkyre", "valkyrie", - "valuabe", "valuable", - "valuble", "valuable", - "vampirs", "vampires", - "vanguad", "vanguard", - "varaint", "variant", - "vareity", "variety", - "varians", "variants", - "varient", "variant", - "varisty", "varsity", - "varitey", "variety", - "varstiy", "varsity", - "vasalls", "vassals", - "vasslas", "vassals", - "vaugely", "vaguely", - "vecotrs", "vectors", - "vectros", "vectors", - "veitnam", "vietnam", - "veiwers", "viewers", - "vendeta", "vendetta", - "verbaly", "verbally", - "verical", "vertical", - "verious", "various", - "verison", "version", - "veritgo", "vertigo", - "versoin", "version", - "vertgio", "vertigo", - "vessles", "vessels", - "vetween", "between", - "viatmin", "vitamin", - "vibratr", "vibrator", - "vicitms", "victims", - "vientam", "vietnam", - "vigrins", "virgins", - "vikigns", "vikings", - "villian", "villain", - "villify", "vilify", - "virbate", "vibrate", - "virigns", "virgins", - "virtiol", "vitriol", - "virutal", "virtual", - "virutes", "virtues", - "visable", "visible", - "visably", "visibly", - "visbily", "visibly", - "visting", "visiting", - "vistors", "visitors", - "vitaliy", "vitality", - "vitamis", "vitamins", - "vitenam", "vietnam", - "vitirol", "vitriol", - "vitmain", "vitamin", - "vitroil", "vitriol", - "vitrual", "virtual", - "vitrues", "virtues", - "volatge", "voltage", - "volumne", "volume", - "votlage", "voltage", - "vrigins", "virgins", - "waclott", "walcott", - "wacther", "watcher", - "waitres", "waiters", - "waktins", "watkins", - "warcrat", "warcraft", - "wardobe", "wardrobe", - "wariwck", "warwick", - "warrany", "warranty", - "warrent", "warrant", - "warrios", "warriors", - "warwcik", "warwick", - "wathcer", "watcher", - "watiers", "waiters", - "waviers", "waivers", - "wawrick", "warwick", - "wayword", "wayward", - "webapge", "webpage", - "webiste", "website", - "webstie", "website", - "weigths", "weights", - "weilded", "wielded", - "weirldy", "weirdly", - "weirods", "weirdos", - "welathy", "wealthy", - "wendsay", "wednesday", - "wensday", "wednesday", - "wepbage", "webpage", - "weridly", "weirdly", - "weridos", "weirdos", - "werstle", "wrestle", - "wesbite", "website", - "whaeton", "wheaton", - "whipser", "whisper", - "whislte", "whistle", - "whistel", "whistle", - "whitsle", "whistle", - "whsiper", "whisper", - "wiaters", "waiters", - "wiavers", "waivers", - "widgest", "widgets", - "wieghts", "weights", - "wigdets", "widgets", - "windosr", "windsor", - "winnins", "winnings", - "winsdor", "windsor", - "wintson", "winston", - "wirting", "writing", - "wisnton", "winston", - "withces", "witches", - "witheld", "withheld", - "withing", "within", - "withold", "withhold", - "wlacott", "walcott", - "wokring", "working", - "workins", "workings", - "woudlnt", "wouldnt", - "woudlve", "wouldve", - "woulndt", "wouldnt", - "wreslte", "wrestle", - "wroking", "working", - "wtiches", "witches", - "wupport", "support", - "yaching", "yachting", - "younget", "youngest", - "youseff", "yousef", - "youself", "yourself", - "zaelots", "zealots", - "zealtos", "zealots", - "zelaots", "zealots", - "zelaous", "zealous", - "zimbabe", "zimbabwe", - "zionsim", "zionism", - "zionsit", "zionist", - "zoinism", "zionism", - "zoinist", "zionist", - "abbout", "about", - "abilty", "ability", - "absail", "abseil", - "abutts", "abuts", - "achive", "achieve", - "acused", "accused", - "addopt", "adopt", - "addres", "address", - "adress", "address", - "aeriel", "aerial", - "affort", "afford", - "agains", "against", - "aginst", "against", - "ahppen", "happen", - "aiport", "airport", - "aisian", "asian", - "albiet", "albeit", - "alchol", "alcohol", - "aledge", "allege", - "aleged", "alleged", - "allign", "align", - "almsot", "almost", - "alomst", "almost", - "alowed", "allowed", - "alwasy", "always", - "alwyas", "always", - "amking", "making", - "ammend", "amend", - "amoung", "among", - "aplied", "applied", - "appart", "apart", - "aquire", "acquire", - "aready", "already", - "arised", "arose", - "arival", "arrival", - "arrary", "array", - "artice", "article", - "asetic", "ascetic", - "asside", "aside", - "attemp", "attempt", - "attemt", "attempt", - "auther", "author", - "awared", "awarded", - "bedore", "before", - "beeing", "being", - "befoer", "before", - "beggin", "begin", - "beleif", "belief", - "belive", "believe", - "beteen", "between", - "betwen", "between", - "beween", "between", - "bianry", "binary", - "boyant", "buoyant", - "broady", "broadly", - "buddah", "buddha", - "buring", "burying", - "carcas", "carcass", - "casion", "caisson", - "casued", "caused", - "casues", "causes", - "ceasar", "caesar", - "cencus", "census", - "censur", "censor", - "cheifs", "chiefs", - "circut", "circuit", - "clasic", "classic", - "coform", "conform", - "comany", "company", - "coucil", "council", - "densly", "densely", - "deside", "decide", - "devels", "delves", - "devide", "divide", - "dieing", "dying", - "divice", "device", - "doulbe", "double", - "dreasm", "dreams", - "duting", "during", - "ealier", "earlier", - "eearly", "early", - "efford", "effort", - "emited", "emitted", - "emnity", "enmity", - "enduce", "induce", - "enlish", "english", - "erally", "orally", - "eratic", "erratic", - "ethose", "those", - "exampt", "exempt", - "excact", "exact", - "excell", "excel", - "exerpt", "excerpt", - "exinct", "extinct", - "expell", "expel", - "expoch", "epoch", - "extint", "extinct", - "facist", "fascist", - "faught", "fought", - "finaly", "finally", - "forsaw", "foresaw", - "fougth", "fought", - "fourty", "forty", - "foward", "forward", - "freind", "friend", - "fromed", "formed", - "fufill", "fulfill", - "futher", "further", - "gardai", "gardaí", - "ghandi", "gandhi", - "glight", "flight", - "gloabl", "global", - "godess", "goddess", - "guilia", "giulia", - "guilio", "giulio", - "habeus", "habeas", - "harras", "harass", - "hatian", "haitian", - "heared", "heard", - "hertzs", "hertz", - "hieght", "height", - "higest", "highest", - "higway", "highway", - "honory", "honorary", - "howver", "however", - "hstory", "history", - "hunman", "human", - "husban", "husband", - "hvaing", "having", - "illess", "illness", - "ilness", "illness", - "imagin", "imagine", - "imense", "immense", - "includ", "include", - "inital", "initial", - "interm", "interim", - "intial", "initial", - "iunior", "junior", - "jaques", "jacques", - "jospeh", "joseph", - "jouney", "journey", - "klenex", "kleenex", - "labled", "labelled", - "largst", "largest", - "larrry", "larry", - "lefted", "left", - "lenght", "length", - "lerans", "learns", - "liason", "liaison", - "libary", "library", - "lieing", "lying", - "lieved", "lived", - "littel", "little", - "livley", "lively", - "lonley", "lonely", - "mailny", "mainly", - "markes", "marks", - "mileau", "milieu", - "milion", "million", - "millon", "million", - "misile", "missile", - "missen", "mizzen", - "missle", "missile", - "mkaing", "making", - "moderm", "modem", - "moreso", "more", - "mounth", "month", - "myraid", "myriad", - "naieve", "naive", - "nestin", "nesting", - "nineth", "ninth", - "noveau", "nouveau", - "occour", "occur", - "occurr", "occur", - "offred", "offered", - "omited", "omitted", - "ouevre", "oeuvre", - "oxigen", "oxygen", - "p0enis", "penis", - "packge", "package", - "peaple", "people", - "pensle", "pencil", - "peopel", "people", - "peotry", "poetry", - "perade", "parade", - "persan", "person", - "persue", "pursue", - "plateu", "plateau", - "poenis", "penis", - "poisin", "poison", - "polute", "pollute", - "posess", "possess", - "posion", "poison", - "prairy", "prairie", - "prarie", "prairie", - "preiod", "period", - "privte", "private", - "proces", "process", - "proove", "prove", - "psuedo", "pseudo", - "psyhic", "psychic", - "pucini", "puccini", - "pumkin", "pumpkin", - "puting", "putting", - "pyscic", "psychic", - "quizes", "quizzes", - "quuery", "query", - "racaus", "raucous", - "radify", "ratify", - "raelly", "really", - "reacll", "recall", - "realyl", "really", - "reched", "reached", - "recide", "reside", - "recrod", "record", - "refect", "reflect", - "relaly", "really", - "renewl", "renewal", - "retuns", "returns", - "reveiw", "review", - "rhymme", "rhyme", - "rigeur", "rigueur", - "rocord", "record", - "rougly", "roughly", - "runing", "running", - "rythem", "rhythm", - "rythim", "rhythm", - "saftey", "safety", - "salery", "salary", - "satisy", "satisfy", - "satric", "satiric", - "saught", "sought", - "scince", "science", - "scirpt", "script", - "seceed", "succeed", - "seinor", "senior", - "sepina", "subpoena", - "sevice", "service", - "shamen", "shaman", - "sheild", "shield", - "shiped", "shipped", - "shorly", "shortly", - "shoudl", "should", - "shreak", "shriek", - "siezed", "seized", - "sixtin", "sistine", - "sneeks", "sneaks", - "somene", "someone", - "soudns", "sounds", - "sourth", "south", - "speach", "speech", - "spects", "aspects", - "spoace", "space", - "sqaure", "square", - "staion", "station", - "stange", "strange", - "stilus", "stylus", - "stirrs", "stirs", - "stopry", "story", - "strnad", "strand", - "studdy", "study", - "suceed", "succeed", - "sucess", "success", - "sucide", "suicide", - "sumary", "summary", - "suport", "support", - "supose", "suppose", - "surfce", "surface", - "surley", "surly", - "swaers", "swears", - "swepth", "swept", - "talekd", "talked", - "theese", "these", - "therby", "thereby", - "thigns", "things", - "thigsn", "things", - "thikns", "thinks", - "thiunk", "think", - "thnigs", "things", - "threee", "three", - "tkaing", "taking", - "tounge", "tongue", - "tourch", "torch", - "towrad", "toward", - "trafic", "traffic", - "troups", "troupes", - "truely", "truly", - "twelth", "twelfth", - "tyrany", "tyranny", - "unabel", "unable", - "unkown", "unknown", - "untill", "until", - "usally", "usually", - "useage", "usage", - "useing", "using", - "usualy", "usually", - "vaccum", "vacuum", - "variey", "variety", - "varing", "varying", - "varity", "variety", - "vasall", "vassal", - "vigeur", "vigueur", - "villin", "villain", - "vreity", "variety", - "vriety", "variety", - "whants", "wants", - "wheras", "whereas", - "wheter", "whether", - "wholey", "wholly", - "whther", "whether", - "wnated", "wanted", - "writen", "written", - "yaerly", "yearly", - "yotube", "youtube", - "zeebra", "zebra", - "abotu", "about", - "adres", "address", - "afair", "affair", - "agian", "again", - "agina", "again", - "agred", "agreed", - "alege", "allege", - "alsot", "also", - "altho", "although", - "amung", "among", - "anual", "annual", - "aroud", "around", - "arund", "around", - "asign", "assign", - "assit", "assist", - "asume", "assume", - "atain", "attain", - "autor", "author", - "baout", "about", - "blaim", "blame", - "boaut", "bout", - "boook", "book", - "borke", "broke", - "breif", "brief", - "caost", "coast", - "casue", "cause", - "chasr", "chaser", - "cheif", "chief", - "chuch", "church", - "claer", "clear", - "clera", "clear", - "coudl", "could", - "crowm", "crown", - "deram", "dram", - "diety", "deity", - "doens", "does", - "doign", "doing", - "donig", "doing", - "drnik", "drink", - "durig", "during", - "earnt", "earned", - "eigth", "eighth", - "eiter", "either", - "emtpy", "empty", - "endig", "ending", - "eveyr", "every", - "exept", "except", - "eyars", "years", - "eyasr", "years", - "fiels", "fields", - "firts", "flirts", - "fleed", "fled", - "fomed", "formed", - "foucs", "focus", - "foudn", "found", - "fouth", "fourth", - "frome", "from", - "ganes", "games", - "gaurd", "guard", - "gerat", "great", - "gogin", "going", - "goign", "going", - "gonig", "going", - "graet", "great", - "greif", "grief", - "gropu", "group", - "guage", "gauge", - "hapen", "happen", - "herad", "heard", - "heroe", "hero", - "higer", "higher", - "housr", "hours", - "htere", "there", - "htikn", "think", - "hting", "thing", - "htink", "think", - "hwihc", "which", - "hwile", "while", - "hwole", "whole", - "idaes", "ideas", - "idesa", "ideas", - "ihaca", "ithaca", - "knwos", "knows", - "konws", "knows", - "lastr", "last", - "lavae", "larvae", - "layed", "laid", - "leage", "league", - "leanr", "lean", - "leran", "learn", - "levle", "level", - "lible", "libel", - "liekd", "liked", - "liuke", "like", - "lmits", "limits", - "lonly", "lonely", - "lukid", "likud", - "lybia", "libya", - "maked", "marked", - "makse", "makes", - "mamal", "mammal", - "mileu", "milieu", - "mkaes", "makes", - "modle", "model", - "moent", "moment", - "moeny", "money", - "monts", "months", - "movei", "movie", - "muder", "murder", - "mysef", "myself", - "neice", "niece", - "ninty", "ninety", - "ocurr", "occur", - "oging", "going", - "opose", "oppose", - "orded", "ordered", - "orgin", "origin", - "otehr", "other", - "ouput", "output", - "owudl", "would", - "paide", "paid", - "palce", "place", - "pased", "passed", - "payed", "paid", - "peice", "piece", - "peoms", "poems", - "poety", "poetry", - "pwoer", "power", - "qtuie", "quite", - "qutie", "quite", - "realy", "really", - "repid", "rapid", - "rised", "raised", - "rulle", "rule", - "rwite", "write", - "rythm", "rhythm", - "safty", "safety", - "scoll", "scroll", - "seach", "search", - "seige", "siege", - "seing", "seeing", - "sence", "sense", - "sicne", "since", - "sieze", "seize", - "sinse", "sines", - "slowy", "slowly", - "snese", "sneeze", - "soley", "solely", - "sotry", "story", - "sotyr", "satyr", - "soudn", "sound", - "sould", "could", - "spred", "spread", - "stlye", "style", - "stong", "strong", - "stoyr", "story", - "strat", "start", - "stroy", "story", - "suppy", "supply", - "swaer", "swear", - "syrap", "syrup", - "sytem", "system", - "sytle", "style", - "tatoo", "tattoo", - "thast", "that", - "theif", "thief", - "theri", "their", - "thgat", "that", - "thier", "their", - "thign", "thing", - "thikn", "think", - "thnig", "thing", - "thrid", "third", - "thsoe", "those", - "thyat", "that", - "tihkn", "think", - "timne", "time", - "tiome", "time", - "tkaes", "takes", - "todya", "today", - "tyhat", "that", - "unsed", "used", - "weild", "wield", - "whant", "want", - "whcih", "which", - "whihc", "which", - "whith", "with", - "whlch", "which", - "wholy", "wholly", - "wierd", "weird", - "wille", "will", - "willk", "will", - "withh", "with", - "witht", "with", - "wiull", "will", - "wnats", "wants", - "wohle", "whole", - "worls", "world", - "woudl", "would", - "wriet", "write", - "wroet", "wrote", - "yaers", "years", - "yatch", "yacht", - "yearm", "year", - "yeasr", "years", - "yeild", "yield", - "yeras", "years", - "yersa", "years", - "agin", "again", - "agre", "agree", - "ahev", "have", - "ahve", "have", - "alse", "else", - "amke", "make", - "anbd", "and", - "andd", "and", - "apon", "upon", - "aslo", "also", - "awya", "away", - "bakc", "back", - "bcak", "back", - "clas", "class", - "cpoy", "coy", - "cxan", "cyan", - "daed", "dead", - "dael", "deal", - "diea", "idea", - "doub", "doubt", - "dyas", "dryas", - "eahc", "each", - "efel", "evil", - "eles", "eels", - "ened", "need", - "enxt", "next", - "esle", "else", - "eyar", "year", - "fatc", "fact", - "fidn", "find", - "fomr", "from", - "grwo", "grow", - "haev", "have", - "halp", "help", - "holf", "hold", - "hten", "then", - "htey", "they", - "htis", "this", - "hvae", "have", - "hvea", "have", - "inot", "into", - "iwll", "will", - "iwth", "with", - "jstu", "just", - "jsut", "just", - "knwo", "know", - "konw", "know", - "kwno", "know", - "liek", "like", - "loev", "love", - "lveo", "love", - "lvoe", "love", - "mkae", "make", - "mkea", "make", - "mroe", "more", - "nkow", "know", - "nkwo", "know", - "nmae", "name", - "noth", "north", - "nowe", "now", - "omre", "more", - "onot", "note", - "onyl", "only", - "owrk", "work", - "peom", "poem", - "pich", "pitch", - "rela", "real", - "sasy", "says", - "smae", "same", - "smoe", "some", - "soem", "some", - "sohw", "show", - "stpo", "stop", - "suop", "soup", - "syas", "says", - "tahn", "than", - "taht", "that", - "tast", "taste", - "tath", "that", - "tehy", "they", - "tghe", "the", - "ther", "there", - "thge", "the", - "thna", "than", - "thne", "then", - "thsi", "this", - "thta", "that", - "tiem", "time", - "tihs", "this", - "tjhe", "the", - "tkae", "take", - "tood", "todo", - "tust", "trust", - "twon", "town", - "twpo", "two", - "tyhe", "they", - "uise", "use", - "vell", "well", - "veyr", "very", - "vrey", "very", - "vyer", "very", - "vyre", "very", - "waht", "what", - "wass", "was", - "watn", "want", - "weas", "was", - "wehn", "when", - "whic", "which", - "whta", "what", - "wich", "which", - "wief", "wife", - "wiew", "view", - "wiht", "with", - "witn", "with", - "wnat", "want", - "wokr", "work", - "wrok", "work", - "wtih", "with", - "yaer", "year", - "yera", "year", - "yrea", "year", - "ytou", "you", - "adn", "and", - "ect", "etc", - "nto", "not", - "teh", "the", - "thn", "then", - "tje", "the", - "whn", "when", - "wih", "with", - "yuo", "you", -} - -// DictAmerican converts UK spellings to US spellings -var DictAmerican = []string{ - "institutionalisation", "institutionalization", - "internationalisation", "internationalization", - "professionalisation", "professionalization", - "compartmentalising", "compartmentalizing", - "institutionalising", "institutionalizing", - "internationalising", "internationalizing", - "compartmentalised", "compartmentalized", - "compartmentalises", "compartmentalizes", - "decriminalisation", "decriminalization", - "denationalisation", "denationalization", - "fictionalisations", "fictionalizations", - "institutionalised", "institutionalized", - "institutionalises", "institutionalizes", - "intellectualising", "intellectualizing", - "internationalised", "internationalized", - "internationalises", "internationalizes", - "pedestrianisation", "pedestrianization", - "professionalising", "professionalizing", - "archaeologically", "archeologically", - "compartmentalise", "compartmentalize", - "decentralisation", "decentralization", - "demilitarisation", "demilitarization", - "externalisations", "externalizations", - "fictionalisation", "fictionalization", - "institutionalise", "institutionalize", - "intellectualised", "intellectualized", - "intellectualises", "intellectualizes", - "internationalise", "internationalize", - "nationalisations", "nationalizations", - "palaeontologists", "paleontologists", - "professionalised", "professionalized", - "professionalises", "professionalizes", - "rationalisations", "rationalizations", - "sensationalising", "sensationalizing", - "sentimentalising", "sentimentalizing", - "acclimatisation", "acclimatization", - "bougainvillaeas", "bougainvilleas", - "commercialising", "commercializing", - "conceptualising", "conceptualizing", - "contextualising", "contextualizing", - "crystallisation", "crystallization", - "decriminalising", "decriminalizing", - "democratisation", "democratization", - "denationalising", "denationalizing", - "depersonalising", "depersonalizing", - "desensitisation", "desensitization", - "destabilisation", "destabilization", - "disorganisation", "disorganization", - "extemporisation", "extemporization", - "externalisation", "externalization", - "familiarisation", "familiarization", - "generalisations", "generalizations", - "hospitalisation", "hospitalization", - "individualising", "individualizing", - "industrialising", "industrializing", - "intellectualise", "intellectualize", - "internalisation", "internalization", - "manoeuvrability", "maneuverability", - "marginalisation", "marginalization", - "materialisation", "materialization", - "miniaturisation", "miniaturization", - "nationalisation", "nationalization", - "neighbourliness", "neighborliness", - "overemphasising", "overemphasizing", - "palaeontologist", "paleontologist", - "particularising", "particularizing", - "pedestrianising", "pedestrianizing", - "professionalise", "professionalize", - "psychoanalysing", "psychoanalyzing", - "rationalisation", "rationalization", - "reorganisations", "reorganizations", - "revolutionising", "revolutionizing", - "sensationalised", "sensationalized", - "sensationalises", "sensationalizes", - "sentimentalised", "sentimentalized", - "sentimentalises", "sentimentalizes", - "specialisations", "specializations", - "standardisation", "standardization", - "synchronisation", "synchronization", - "systematisation", "systematization", - "aggrandisement", "aggrandizement", - "anaesthetising", "anesthetizing", - "archaeological", "archeological", - "archaeologists", "archeologists", - "bougainvillaea", "bougainvillea", - "characterising", "characterizing", - "collectivising", "collectivizing", - "commercialised", "commercialized", - "commercialises", "commercializes", - "conceptualised", "conceptualized", - "conceptualises", "conceptualizes", - "contextualised", "contextualized", - "contextualises", "contextualizes", - "decentralising", "decentralizing", - "decriminalised", "decriminalized", - "decriminalises", "decriminalizes", - "dehumanisation", "dehumanization", - "demilitarising", "demilitarizing", - "demobilisation", "demobilization", - "demoralisation", "demoralization", - "denationalised", "denationalized", - "denationalises", "denationalizes", - "depersonalised", "depersonalized", - "depersonalises", "depersonalizes", - "disembowelling", "disemboweling", - "dramatisations", "dramatizations", - "editorialising", "editorializing", - "encyclopaedias", "encyclopedias", - "fictionalising", "fictionalizing", - "fraternisation", "fraternization", - "generalisation", "generalization", - "gynaecological", "gynecological", - "gynaecologists", "gynecologists", - "haematological", "hematological", - "haematologists", "hematologists", - "immobilisation", "immobilization", - "individualised", "individualized", - "individualises", "individualizes", - "industrialised", "industrialized", - "industrialises", "industrializes", - "liberalisation", "liberalization", - "monopolisation", "monopolization", - "naturalisation", "naturalization", - "neighbourhoods", "neighborhoods", - "neutralisation", "neutralization", - "organisational", "organizational", - "outmanoeuvring", "outmaneuvering", - "overemphasised", "overemphasized", - "overemphasises", "overemphasizes", - "paediatricians", "pediatricians", - "particularised", "particularized", - "particularises", "particularizes", - "pasteurisation", "pasteurization", - "pedestrianised", "pedestrianized", - "pedestrianises", "pedestrianizes", - "philosophising", "philosophizing", - "politicisation", "politicization", - "popularisation", "popularization", - "pressurisation", "pressurization", - "prioritisation", "prioritization", - "privatisations", "privatizations", - "propagandising", "propagandizing", - "psychoanalysed", "psychoanalyzed", - "psychoanalyses", "psychoanalyzes", - "regularisation", "regularization", - "reorganisation", "reorganization", - "revolutionised", "revolutionized", - "revolutionises", "revolutionizes", - "secularisation", "secularization", - "sensationalise", "sensationalize", - "sentimentalise", "sentimentalize", - "serialisations", "serializations", - "specialisation", "specialization", - "sterilisations", "sterilizations", - "stigmatisation", "stigmatization", - "transistorised", "transistorized", - "unrecognisable", "unrecognizable", - "visualisations", "visualizations", - "westernisation", "westernization", - "accessorising", "accessorizing", - "acclimatising", "acclimatizing", - "amortisations", "amortizations", - "amphitheatres", "amphitheaters", - "anaesthetised", "anesthetized", - "anaesthetises", "anesthetizes", - "anaesthetists", "anesthetists", - "archaeologist", "archeologist", - "backpedalling", "backpedaling", - "behaviourists", "behaviorists", - "breathalysers", "breathalyzers", - "breathalysing", "breathalyzing", - "callisthenics", "calisthenics", - "cannibalising", "cannibalizing", - "characterised", "characterized", - "characterises", "characterizes", - "circularising", "circularizing", - "clarinettists", "clarinetists", - "collectivised", "collectivized", - "collectivises", "collectivizes", - "commercialise", "commercialize", - "computerising", "computerizing", - "conceptualise", "conceptualize", - "contextualise", "contextualize", - "criminalising", "criminalizing", - "crystallising", "crystallizing", - "decentralised", "decentralized", - "decentralises", "decentralizes", - "decriminalise", "decriminalize", - "demilitarised", "demilitarized", - "demilitarises", "demilitarizes", - "democratising", "democratizing", - "denationalise", "denationalize", - "depersonalise", "depersonalize", - "desensitising", "desensitizing", - "destabilising", "destabilizing", - "disembowelled", "disemboweled", - "dishonourable", "dishonorable", - "dishonourably", "dishonorably", - "dramatisation", "dramatization", - "editorialised", "editorialized", - "editorialises", "editorializes", - "encyclopaedia", "encyclopedia", - "encyclopaedic", "encyclopedic", - "extemporising", "extemporizing", - "externalising", "externalizing", - "familiarising", "familiarizing", - "fertilisation", "fertilization", - "fictionalised", "fictionalized", - "fictionalises", "fictionalizes", - "formalisation", "formalization", - "fossilisation", "fossilization", - "globalisation", "globalization", - "gynaecologist", "gynecologist", - "haematologist", "hematologist", - "haemophiliacs", "hemophiliacs", - "haemorrhaging", "hemorrhaging", - "harmonisation", "harmonization", - "hospitalising", "hospitalizing", - "hypothesising", "hypothesizing", - "immortalising", "immortalizing", - "individualise", "individualize", - "industrialise", "industrialize", - "internalising", "internalizing", - "marginalising", "marginalizing", - "materialising", "materializing", - "mechanisation", "mechanization", - "memorialising", "memorializing", - "miniaturising", "miniaturizing", - "miscatalogued", "miscataloged", - "misdemeanours", "misdemeanors", - "multicoloured", "multicolored", - "nationalising", "nationalizing", - "neighbourhood", "neighborhood", - "normalisation", "normalization", - "organisations", "organizations", - "outmanoeuvred", "outmaneuvered", - "outmanoeuvres", "outmaneuvers", - "overemphasise", "overemphasize", - "paediatrician", "pediatrician", - "palaeontology", "paleontology", - "particularise", "particularize", - "passivisation", "passivization", - "patronisingly", "patronizingly", - "pedestrianise", "pedestrianize", - "personalising", "personalizing", - "philosophised", "philosophized", - "philosophises", "philosophizes", - "privatisation", "privatization", - "propagandised", "propagandized", - "propagandises", "propagandizes", - "proselytisers", "proselytizers", - "proselytising", "proselytizing", - "psychoanalyse", "psychoanalyze", - "pulverisation", "pulverization", - "rationalising", "rationalizing", - "reconnoitring", "reconnoitering", - "revolutionise", "revolutionize", - "romanticising", "romanticizing", - "serialisation", "serialization", - "socialisation", "socialization", - "stabilisation", "stabilization", - "standardising", "standardizing", - "sterilisation", "sterilization", - "subsidisation", "subsidization", - "synchronising", "synchronizing", - "systematising", "systematizing", - "tantalisingly", "tantalizingly", - "underutilised", "underutilized", - "victimisation", "victimization", - "visualisation", "visualization", - "vocalisations", "vocalizations", - "vulgarisation", "vulgarization", - "accessorised", "accessorized", - "accessorises", "accessorizes", - "acclimatised", "acclimatized", - "acclimatises", "acclimatizes", - "amortisation", "amortization", - "amphitheatre", "amphitheater", - "anaesthetics", "anesthetics", - "anaesthetise", "anesthetize", - "anaesthetist", "anesthetist", - "antagonising", "antagonizing", - "appetisingly", "appetizingly", - "backpedalled", "backpedaled", - "bastardising", "bastardizing", - "behaviourism", "behaviorism", - "behaviourist", "behaviorist", - "bowdlerising", "bowdlerizing", - "breathalysed", "breathalyzed", - "breathalyser", "breathalyzer", - "breathalyses", "breathalyzes", - "cannibalised", "cannibalized", - "cannibalises", "cannibalizes", - "capitalising", "capitalizing", - "caramelising", "caramelizing", - "categorising", "categorizing", - "centigrammes", "centigrams", - "centralising", "centralizing", - "centrepieces", "centerpieces", - "characterise", "characterize", - "circularised", "circularized", - "circularises", "circularizes", - "clarinettist", "clarinetist", - "collectivise", "collectivize", - "colonisation", "colonization", - "computerised", "computerized", - "computerises", "computerizes", - "criminalised", "criminalized", - "criminalises", "criminalizes", - "crystallised", "crystallized", - "crystallises", "crystallizes", - "decentralise", "decentralize", - "dehumanising", "dehumanizing", - "demilitarise", "demilitarize", - "demobilising", "demobilizing", - "democratised", "democratized", - "democratises", "democratizes", - "demoralising", "demoralizing", - "desensitised", "desensitized", - "desensitises", "desensitizes", - "destabilised", "destabilized", - "destabilises", "destabilizes", - "discolouring", "discoloring", - "dishonouring", "dishonoring", - "disorganised", "disorganized", - "editorialise", "editorialize", - "endeavouring", "endeavoring", - "equalisation", "equalization", - "evangelising", "evangelizing", - "extemporised", "extemporized", - "extemporises", "extemporizes", - "externalised", "externalized", - "externalises", "externalizes", - "familiarised", "familiarized", - "familiarises", "familiarizes", - "fictionalise", "fictionalize", - "finalisation", "finalization", - "fraternising", "fraternizing", - "generalising", "generalizing", - "haemophiliac", "hemophiliac", - "haemorrhaged", "hemorrhaged", - "haemorrhages", "hemorrhages", - "haemorrhoids", "hemorrhoids", - "homoeopathic", "homeopathic", - "homogenising", "homogenizing", - "hospitalised", "hospitalized", - "hospitalises", "hospitalizes", - "hypothesised", "hypothesized", - "hypothesises", "hypothesizes", - "idealisation", "idealization", - "immobilisers", "immobilizers", - "immobilising", "immobilizing", - "immortalised", "immortalized", - "immortalises", "immortalizes", - "immunisation", "immunization", - "initialising", "initializing", - "internalised", "internalized", - "internalises", "internalizes", - "jeopardising", "jeopardizing", - "legalisation", "legalization", - "legitimising", "legitimizing", - "liberalising", "liberalizing", - "manoeuvrable", "maneuverable", - "manoeuvrings", "maneuverings", - "marginalised", "marginalized", - "marginalises", "marginalizes", - "marvellously", "marvelously", - "materialised", "materialized", - "materialises", "materializes", - "maximisation", "maximization", - "memorialised", "memorialized", - "memorialises", "memorializes", - "metabolising", "metabolizing", - "militarising", "militarizing", - "milligrammes", "milligrams", - "miniaturised", "miniaturized", - "miniaturises", "miniaturizes", - "misbehaviour", "misbehavior", - "misdemeanour", "misdemeanor", - "mobilisation", "mobilization", - "moisturisers", "moisturizers", - "moisturising", "moisturizing", - "monopolising", "monopolizing", - "moustachioed", "mustachioed", - "nationalised", "nationalized", - "nationalises", "nationalizes", - "naturalising", "naturalizing", - "neighbouring", "neighboring", - "neutralising", "neutralizing", - "oesophaguses", "esophaguses", - "organisation", "organization", - "orthopaedics", "orthopedics", - "outmanoeuvre", "outmaneuver", - "palaeolithic", "paleolithic", - "pasteurising", "pasteurizing", - "personalised", "personalized", - "personalises", "personalizes", - "philosophise", "philosophize", - "plagiarising", "plagiarizing", - "ploughshares", "plowshares", - "polarisation", "polarization", - "politicising", "politicizing", - "popularising", "popularizing", - "pressurising", "pressurizing", - "prioritising", "prioritizing", - "propagandise", "propagandize", - "proselytised", "proselytized", - "proselytiser", "proselytizer", - "proselytises", "proselytizes", - "radicalising", "radicalizing", - "rationalised", "rationalized", - "rationalises", "rationalizes", - "realisations", "realizations", - "recognisable", "recognizable", - "recognisably", "recognizably", - "recognisance", "recognizance", - "reconnoitred", "reconnoitered", - "reconnoitres", "reconnoiters", - "regularising", "regularizing", - "reorganising", "reorganizing", - "revitalising", "revitalizing", - "rhapsodising", "rhapsodizing", - "romanticised", "romanticized", - "romanticises", "romanticizes", - "scandalising", "scandalizing", - "scrutinising", "scrutinizing", - "secularising", "secularizing", - "specialising", "specializing", - "squirrelling", "squirreling", - "standardised", "standardized", - "standardises", "standardizes", - "stigmatising", "stigmatizing", - "sympathisers", "sympathizers", - "sympathising", "sympathizing", - "synchronised", "synchronized", - "synchronises", "synchronizes", - "synthesisers", "synthesizers", - "synthesising", "synthesizing", - "systematised", "systematized", - "systematises", "systematizes", - "technicolour", "technicolor", - "theatregoers", "theatergoers", - "traumatising", "traumatizing", - "trivialising", "trivializing", - "unauthorised", "unauthorized", - "uncatalogued", "uncataloged", - "unfavourable", "unfavorable", - "unfavourably", "unfavorably", - "unionisation", "unionization", - "unrecognised", "unrecognized", - "untrammelled", "untrammeled", - "urbanisation", "urbanization", - "vaporisation", "vaporization", - "vocalisation", "vocalization", - "watercolours", "watercolors", - "westernising", "westernizing", - "accessorise", "accessorize", - "acclimatise", "acclimatize", - "agonisingly", "agonizingly", - "amortisable", "amortizable", - "anaesthesia", "anesthesia", - "anaesthetic", "anesthetic", - "anglicising", "anglicizing", - "antagonised", "antagonized", - "antagonises", "antagonizes", - "apologising", "apologizing", - "archaeology", "archeology", - "authorising", "authorizing", - "bastardised", "bastardized", - "bastardises", "bastardizes", - "bedevilling", "bedeviling", - "behavioural", "behavioral", - "belabouring", "belaboring", - "bowdlerised", "bowdlerized", - "bowdlerises", "bowdlerizes", - "breathalyse", "breathalyze", - "brutalising", "brutalizing", - "cannibalise", "cannibalize", - "capitalised", "capitalized", - "capitalises", "capitalizes", - "caramelised", "caramelized", - "caramelises", "caramelizes", - "carbonising", "carbonizing", - "cataloguing", "cataloging", - "categorised", "categorized", - "categorises", "categorizes", - "cauterising", "cauterizing", - "centigramme", "centigram", - "centilitres", "centiliters", - "centimetres", "centimeters", - "centralised", "centralized", - "centralises", "centralizes", - "centrefolds", "centerfolds", - "centrepiece", "centerpiece", - "channelling", "channeling", - "chequebooks", "checkbooks", - "circularise", "circularize", - "colourfully", "colorfully", - "colourizing", "colorizing", - "computerise", "computerize", - "councillors", "councilors", - "counselling", "counseling", - "counsellors", "counselors", - "criminalise", "criminalize", - "criticising", "criticizing", - "crystallise", "crystallize", - "customising", "customizing", - "defenceless", "defenseless", - "dehumanised", "dehumanized", - "dehumanises", "dehumanizes", - "demobilised", "demobilized", - "demobilises", "demobilizes", - "democratise", "democratize", - "demoralised", "demoralized", - "demoralises", "demoralizes", - "deodorising", "deodorizing", - "desensitise", "desensitize", - "destabilise", "destabilize", - "discoloured", "discolored", - "dishevelled", "disheveled", - "dishonoured", "dishonored", - "dramatising", "dramatizing", - "economising", "economizing", - "empathising", "empathizing", - "emphasising", "emphasizing", - "endeavoured", "endeavored", - "epitomising", "epitomizing", - "evangelised", "evangelized", - "evangelises", "evangelizes", - "extemporise", "extemporize", - "externalise", "externalize", - "factorising", "factorizing", - "familiarise", "familiarize", - "fantasising", "fantasizing", - "favouritism", "favoritism", - "fertilisers", "fertilizers", - "fertilising", "fertilizing", - "flavourings", "flavorings", - "flavourless", "flavorless", - "flavoursome", "flavorsome", - "formalising", "formalizing", - "fossilising", "fossilizing", - "fraternised", "fraternized", - "fraternises", "fraternizes", - "galvanising", "galvanizing", - "generalised", "generalized", - "generalises", "generalizes", - "ghettoising", "ghettoizing", - "globalising", "globalizing", - "gruellingly", "gruelingly", - "gynaecology", "gynecology", - "haematology", "hematology", - "haemoglobin", "hemoglobin", - "haemophilia", "hemophilia", - "haemorrhage", "hemorrhage", - "harmonising", "harmonizing", - "homoeopaths", "homeopaths", - "homoeopathy", "homeopathy", - "homogenised", "homogenized", - "homogenises", "homogenizes", - "hospitalise", "hospitalize", - "hybridising", "hybridizing", - "hypnotising", "hypnotizing", - "hypothesise", "hypothesize", - "immobilised", "immobilized", - "immobiliser", "immobilizer", - "immobilises", "immobilizes", - "immortalise", "immortalize", - "impanelling", "impaneling", - "imperilling", "imperiling", - "initialised", "initialized", - "initialises", "initializes", - "initialling", "initialing", - "instalments", "installments", - "internalise", "internalize", - "italicising", "italicizing", - "jeopardised", "jeopardized", - "jeopardises", "jeopardizes", - "kilogrammes", "kilograms", - "legitimised", "legitimized", - "legitimises", "legitimizes", - "liberalised", "liberalized", - "liberalises", "liberalizes", - "lionisation", "lionization", - "liquidisers", "liquidizers", - "liquidising", "liquidizing", - "magnetising", "magnetizing", - "manoeuvring", "maneuvering", - "marginalise", "marginalize", - "marshalling", "marshaling", - "materialise", "materialize", - "mechanising", "mechanizing", - "memorialise", "memorialize", - "mesmerising", "mesmerizing", - "metabolised", "metabolized", - "metabolises", "metabolizes", - "micrometres", "micrometers", - "militarised", "militarized", - "militarises", "militarizes", - "milligramme", "milligram", - "millilitres", "milliliters", - "millimetres", "millimeters", - "miniaturise", "miniaturize", - "modernising", "modernizing", - "moisturised", "moisturized", - "moisturiser", "moisturizer", - "moisturises", "moisturizes", - "monopolised", "monopolized", - "monopolises", "monopolizes", - "nationalise", "nationalize", - "naturalised", "naturalized", - "naturalises", "naturalizes", - "neighbourly", "neighborly", - "neutralised", "neutralized", - "neutralises", "neutralizes", - "normalising", "normalizing", - "orthopaedic", "orthopedic", - "ostracising", "ostracizing", - "oxidisation", "oxidization", - "paediatrics", "pediatrics", - "paedophiles", "pedophiles", - "paedophilia", "pedophilia", - "passivising", "passivizing", - "pasteurised", "pasteurized", - "pasteurises", "pasteurizes", - "patronising", "patronizing", - "personalise", "personalize", - "plagiarised", "plagiarized", - "plagiarises", "plagiarizes", - "ploughshare", "plowshare", - "politicised", "politicized", - "politicises", "politicizes", - "popularised", "popularized", - "popularises", "popularizes", - "praesidiums", "presidiums", - "pressurised", "pressurized", - "pressurises", "pressurizes", - "prioritised", "prioritized", - "prioritises", "prioritizes", - "privatising", "privatizing", - "proselytise", "proselytize", - "publicising", "publicizing", - "pulverising", "pulverizing", - "quarrelling", "quarreling", - "radicalised", "radicalized", - "radicalises", "radicalizes", - "randomising", "randomizing", - "rationalise", "rationalize", - "realisation", "realization", - "recognising", "recognizing", - "reconnoitre", "reconnoiter", - "regularised", "regularized", - "regularises", "regularizes", - "remodelling", "remodeling", - "reorganised", "reorganized", - "reorganises", "reorganizes", - "revitalised", "revitalized", - "revitalises", "revitalizes", - "rhapsodised", "rhapsodized", - "rhapsodises", "rhapsodizes", - "romanticise", "romanticize", - "scandalised", "scandalized", - "scandalises", "scandalizes", - "sceptically", "skeptically", - "scrutinised", "scrutinized", - "scrutinises", "scrutinizes", - "secularised", "secularized", - "secularises", "secularizes", - "sensitising", "sensitizing", - "serialising", "serializing", - "sermonising", "sermonizing", - "shrivelling", "shriveling", - "signalising", "signalizing", - "snorkelling", "snorkeling", - "snowploughs", "snowplow", - "socialising", "socializing", - "solemnising", "solemnizing", - "specialised", "specialized", - "specialises", "specializes", - "squirrelled", "squirreled", - "stabilisers", "stabilizers", - "stabilising", "stabilizing", - "standardise", "standardize", - "stencilling", "stenciling", - "sterilisers", "sterilizers", - "sterilising", "sterilizing", - "stigmatised", "stigmatized", - "stigmatises", "stigmatizes", - "subsidisers", "subsidizers", - "subsidising", "subsidizing", - "summarising", "summarizing", - "symbolising", "symbolizing", - "sympathised", "sympathized", - "sympathiser", "sympathizer", - "sympathises", "sympathizes", - "synchronise", "synchronize", - "synthesised", "synthesized", - "synthesiser", "synthesizer", - "synthesises", "synthesizes", - "systematise", "systematize", - "tantalising", "tantalizing", - "temporising", "temporizing", - "tenderising", "tenderizing", - "terrorising", "terrorizing", - "theatregoer", "theatergoer", - "traumatised", "traumatized", - "traumatises", "traumatizes", - "trivialised", "trivialized", - "trivialises", "trivializes", - "tyrannising", "tyrannizing", - "uncivilised", "uncivilized", - "unorganised", "unorganized", - "unravelling", "unraveling", - "utilisation", "utilization", - "vandalising", "vandalizing", - "verbalising", "verbalizing", - "victimising", "victimizing", - "visualising", "visualizing", - "vulgarising", "vulgarizing", - "watercolour", "watercolor", - "westernised", "westernized", - "westernises", "westernizes", - "worshipping", "worshiping", - "aeroplanes", "airplanes", - "amortising", "amortizing", - "anglicised", "anglicized", - "anglicises", "anglicizes", - "annualised", "annualized", - "antagonise", "antagonize", - "apologised", "apologized", - "apologises", "apologizes", - "appetisers", "appetizers", - "appetising", "appetizing", - "authorised", "authorized", - "authorises", "authorizes", - "bannisters", "banisters", - "bastardise", "bastardize", - "bedevilled", "bedeviled", - "behaviours", "behaviors", - "bejewelled", "bejeweled", - "belaboured", "belabored", - "bowdlerise", "bowdlerize", - "brutalised", "brutalized", - "brutalises", "brutalizes", - "canalising", "canalizing", - "cancelling", "canceling", - "canonising", "canonizing", - "capitalise", "capitalize", - "caramelise", "caramelize", - "carbonised", "carbonized", - "carbonises", "carbonizes", - "catalogued", "cataloged", - "catalogues", "catalogs", - "catalysing", "catalyzing", - "categorise", "categorize", - "cauterised", "cauterized", - "cauterises", "cauterizes", - "centilitre", "centiliter", - "centimetre", "centimeter", - "centralise", "centralize", - "centrefold", "centerfold", - "channelled", "channeled", - "chequebook", "checkbook", - "chiselling", "chiseling", - "civilising", "civilizing", - "clamouring", "clamoring", - "colonisers", "colonizers", - "colonising", "colonizing", - "colourants", "colorants", - "colourized", "colorized", - "colourizes", "colorizes", - "colourless", "colorless", - "connexions", "connections", - "councillor", "councilor", - "counselled", "counseled", - "counsellor", "counselor", - "criticised", "criticized", - "criticises", "criticizes", - "cudgelling", "cudgeling", - "customised", "customized", - "customises", "customizes", - "dehumanise", "dehumanize", - "demobilise", "demobilize", - "demonising", "demonizing", - "demoralise", "demoralize", - "deodorised", "deodorized", - "deodorises", "deodorizes", - "deputising", "deputizing", - "digitising", "digitizing", - "discolours", "discolors", - "dishonours", "dishonors", - "dramatised", "dramatized", - "dramatises", "dramatizes", - "drivelling", "driveling", - "economised", "economized", - "economises", "economizes", - "empathised", "empathized", - "empathises", "empathizes", - "emphasised", "emphasized", - "emphasises", "emphasizes", - "enamelling", "enameling", - "endeavours", "endeavors", - "energising", "energizing", - "epaulettes", "epaulets", - "epicentres", "epicenters", - "epitomised", "epitomized", - "epitomises", "epitomizes", - "equalisers", "equalizers", - "equalising", "equalizing", - "eulogising", "eulogizing", - "evangelise", "evangelize", - "factorised", "factorized", - "factorises", "factorizes", - "fantasised", "fantasized", - "fantasises", "fantasizes", - "favourable", "favorable", - "favourably", "favorably", - "favourites", "favorites", - "feminising", "feminizing", - "fertilised", "fertilized", - "fertiliser", "fertilizer", - "fertilises", "fertilizes", - "fibreglass", "fiberglass", - "finalising", "finalizing", - "flavouring", "flavoring", - "formalised", "formalized", - "formalises", "formalizes", - "fossilised", "fossilized", - "fossilises", "fossilizes", - "fraternise", "fraternize", - "fulfilment", "fulfillment", - "funnelling", "funneling", - "galvanised", "galvanized", - "galvanises", "galvanizes", - "gambolling", "gamboling", - "gaolbreaks", "jailbreaks", - "generalise", "generalize", - "ghettoised", "ghettoized", - "ghettoises", "ghettoizes", - "globalised", "globalized", - "globalises", "globalizes", - "gonorrhoea", "gonorrhea", - "grovelling", "groveling", - "harbouring", "harboring", - "harmonised", "harmonized", - "harmonises", "harmonizes", - "homoeopath", "homeopath", - "homogenise", "homogenize", - "honourable", "honorable", - "honourably", "honorably", - "humanising", "humanizing", - "humourless", "humorless", - "hybridised", "hybridized", - "hybridises", "hybridizes", - "hypnotised", "hypnotized", - "hypnotises", "hypnotizes", - "idealising", "idealizing", - "immobilise", "immobilize", - "immunising", "immunizing", - "impanelled", "impaneled", - "imperilled", "imperiled", - "inflexions", "inflections", - "initialise", "initialize", - "initialled", "initialed", - "instalment", "installment", - "ionisation", "ionization", - "italicised", "italicized", - "italicises", "italicizes", - "jeopardise", "jeopardize", - "kilogramme", "kilogram", - "kilometres", "kilometers", - "lacklustre", "lackluster", - "legalising", "legalizing", - "legitimise", "legitimize", - "liberalise", "liberalize", - "liquidised", "liquidized", - "liquidiser", "liquidizer", - "liquidises", "liquidizes", - "localising", "localizing", - "magnetised", "magnetized", - "magnetises", "magnetizes", - "manoeuvred", "maneuvered", - "manoeuvres", "maneuvers", - "marshalled", "marshaled", - "marvelling", "marveling", - "marvellous", "marvelous", - "maximising", "maximizing", - "mechanised", "mechanized", - "mechanises", "mechanizes", - "memorising", "memorizing", - "mesmerised", "mesmerized", - "mesmerises", "mesmerizes", - "metabolise", "metabolize", - "micrometre", "micrometer", - "militarise", "militarize", - "millilitre", "milliliter", - "millimetre", "millimeter", - "minimising", "minimizing", - "mobilising", "mobilizing", - "modernised", "modernized", - "modernises", "modernizes", - "moisturise", "moisturize", - "monopolise", "monopolize", - "moralising", "moralizing", - "mouldering", "moldering", - "moustached", "mustached", - "moustaches", "mustaches", - "naturalise", "naturalize", - "neighbours", "neighbors", - "neutralise", "neutralize", - "normalised", "normalized", - "normalises", "normalizes", - "oesophagus", "esophagus", - "optimising", "optimizing", - "organisers", "organizers", - "organising", "organizing", - "ostracised", "ostracized", - "ostracises", "ostracizes", - "paederasts", "pederasts", - "paediatric", "pediatric", - "paedophile", "pedophile", - "panellists", "panelists", - "paralysing", "paralyzing", - "parcelling", "parceling", - "passivised", "passivized", - "passivises", "passivizes", - "pasteurise", "pasteurize", - "patronised", "patronized", - "patronises", "patronizes", - "penalising", "penalizing", - "pencilling", "penciling", - "plagiarise", "plagiarize", - "polarising", "polarizing", - "politicise", "politicize", - "popularise", "popularize", - "practising", "practicing", - "praesidium", "presidium", - "pressurise", "pressurize", - "prioritise", "prioritize", - "privatised", "privatized", - "privatises", "privatizes", - "programmes", "programs", - "publicised", "publicized", - "publicises", "publicizes", - "pulverised", "pulverized", - "pulverises", "pulverizes", - "pummelling", "pummeled", - "quarrelled", "quarreled", - "radicalise", "radicalize", - "randomised", "randomized", - "randomises", "randomizes", - "realisable", "realizable", - "recognised", "recognized", - "recognises", "recognizes", - "refuelling", "refueling", - "regularise", "regularize", - "remodelled", "remodeled", - "remoulding", "remolding", - "reorganise", "reorganize", - "revitalise", "revitalize", - "rhapsodise", "rhapsodize", - "ritualised", "ritualized", - "sanitising", "sanitizing", - "satirising", "satirizing", - "scandalise", "scandalize", - "scepticism", "skepticism", - "scrutinise", "scrutinize", - "secularise", "secularize", - "sensitised", "sensitized", - "sensitises", "sensitizes", - "sepulchres", "sepulchers", - "serialised", "serialized", - "serialises", "serializes", - "sermonised", "sermonized", - "sermonises", "sermonizes", - "shovelling", "shoveling", - "shrivelled", "shriveled", - "signalised", "signalized", - "signalises", "signalizes", - "signalling", "signaling", - "snivelling", "sniveling", - "snorkelled", "snorkeled", - "snowplough", "snowplow", - "socialised", "socialized", - "socialises", "socializes", - "sodomising", "sodomizing", - "solemnised", "solemnized", - "solemnises", "solemnizes", - "specialise", "specialize", - "spiralling", "spiraling", - "splendours", "splendors", - "stabilised", "stabilized", - "stabiliser", "stabilizer", - "stabilises", "stabilizes", - "stencilled", "stenciled", - "sterilised", "sterilized", - "steriliser", "sterilizer", - "sterilises", "sterilizes", - "stigmatise", "stigmatize", - "subsidised", "subsidized", - "subsidiser", "subsidizer", - "subsidises", "subsidizes", - "succouring", "succoring", - "sulphurous", "sulfurous", - "summarised", "summarized", - "summarises", "summarizes", - "swivelling", "swiveling", - "symbolised", "symbolized", - "symbolises", "symbolizes", - "sympathise", "sympathize", - "synthesise", "synthesize", - "tantalised", "tantalized", - "tantalises", "tantalizes", - "temporised", "temporized", - "temporises", "temporizes", - "tenderised", "tenderized", - "tenderises", "tenderizes", - "terrorised", "terrorized", - "terrorises", "terrorizes", - "theorising", "theorizing", - "traumatise", "traumatize", - "travellers", "travelers", - "travelling", "traveling", - "tricolours", "tricolors", - "trivialise", "trivialize", - "tunnelling", "tunneling", - "tyrannised", "tyrannized", - "tyrannises", "tyrannizes", - "unequalled", "unequaled", - "unionising", "unionizing", - "unravelled", "unraveled", - "unrivalled", "unrivaled", - "urbanising", "urbanizing", - "utilisable", "utilizable", - "vandalised", "vandalized", - "vandalises", "vandalizes", - "vaporising", "vaporizing", - "verbalised", "verbalized", - "verbalises", "verbalizes", - "victimised", "victimized", - "victimises", "victimizes", - "visualised", "visualized", - "visualises", "visualizes", - "vocalising", "vocalizing", - "vulcanised", "vulcanized", - "vulgarised", "vulgarized", - "vulgarises", "vulgarizes", - "weaselling", "weaseling", - "westernise", "westernize", - "womanisers", "womanizers", - "womanising", "womanizing", - "worshipped", "worshiped", - "worshipper", "worshiper", - "aeroplane", "airplane", - "aetiology", "etiology", - "agonising", "agonizing", - "almanacks", "almanacs", - "aluminium", "aluminum", - "amortised", "amortized", - "amortises", "amortizes", - "analogues", "analogs", - "analysing", "analyzing", - "anglicise", "anglicize", - "apologise", "apologize", - "appetiser", "appetizer", - "armourers", "armorers", - "armouries", "armories", - "artefacts", "artifacts", - "authorise", "authorize", - "baptising", "baptizing", - "behaviour", "behavior", - "belabours", "belabors", - "brutalise", "brutalize", - "callipers", "calipers", - "canalised", "canalized", - "canalises", "canalizes", - "cancelled", "canceled", - "canonised", "canonized", - "canonises", "canonizes", - "carbonise", "carbonize", - "carolling", "caroling", - "catalogue", "catalog", - "catalysed", "catalyzed", - "catalyses", "catalyzes", - "cauterise", "cauterize", - "cavilling", "caviling", - "chequered", "checkered", - "chiselled", "chiseled", - "civilised", "civilized", - "civilises", "civilizes", - "clamoured", "clamored", - "colonised", "colonized", - "coloniser", "colonizer", - "colonises", "colonizes", - "colourant", "colorant", - "coloureds", "coloreds", - "colourful", "colorful", - "colouring", "coloring", - "colourize", "colorize", - "connexion", "connection", - "criticise", "criticize", - "cruellest", "cruelest", - "cudgelled", "cudgeled", - "customise", "customize", - "demeanour", "demeanor", - "demonised", "demonized", - "demonises", "demonizes", - "deodorise", "deodorize", - "deputised", "deputized", - "deputises", "deputizes", - "dialogues", "dialogs", - "diarrhoea", "diarrhea", - "digitised", "digitized", - "digitises", "digitizes", - "discolour", "discolor", - "disfavour", "disfavor", - "dishonour", "dishonor", - "dramatise", "dramatize", - "drivelled", "driveled", - "economise", "economize", - "empathise", "empathize", - "emphasise", "emphasize", - "enamelled", "enameled", - "enamoured", "enamored", - "endeavour", "endeavor", - "energised", "energized", - "energises", "energizes", - "epaulette", "epaulet", - "epicentre", "epicenter", - "epitomise", "epitomize", - "equalised", "equalized", - "equaliser", "equalizer", - "equalises", "equalizes", - "eulogised", "eulogized", - "eulogises", "eulogizes", - "factorise", "factorize", - "fantasise", "fantasize", - "favouring", "favoring", - "favourite", "favorite", - "feminised", "feminized", - "feminises", "feminizes", - "fertilise", "fertilize", - "finalised", "finalized", - "finalises", "finalizes", - "flautists", "flutists", - "flavoured", "flavored", - "formalise", "formalize", - "fossilise", "fossilize", - "funnelled", "funneled", - "galvanise", "galvanize", - "gambolled", "gamboled", - "gaolbirds", "jailbirds", - "gaolbreak", "jailbreak", - "ghettoise", "ghettoize", - "globalise", "globalize", - "gravelled", "graveled", - "grovelled", "groveled", - "gruelling", "grueling", - "harboured", "harbored", - "harmonise", "harmonize", - "honouring", "honoring", - "humanised", "humanized", - "humanises", "humanizes", - "humouring", "humoring", - "hybridise", "hybridize", - "hypnotise", "hypnotize", - "idealised", "idealized", - "idealises", "idealizes", - "idolising", "idolizing", - "immunised", "immunized", - "immunises", "immunizes", - "inflexion", "inflection", - "italicise", "italicize", - "itemising", "itemizing", - "jewellers", "jewelers", - "jewellery", "jewelry", - "kilometre", "kilometer", - "labelling", "labeling", - "labourers", "laborers", - "labouring", "laboring", - "legalised", "legalized", - "legalises", "legalizes", - "leukaemia", "leukemia", - "levellers", "levelers", - "levelling", "leveling", - "libelling", "libeling", - "libellous", "libelous", - "licencing", "licensing", - "lionising", "lionizing", - "liquidise", "liquidize", - "localised", "localized", - "localises", "localizes", - "magnetise", "magnetize", - "manoeuvre", "maneuver", - "marvelled", "marveled", - "maximised", "maximized", - "maximises", "maximizes", - "mechanise", "mechanize", - "mediaeval", "medieval", - "memorised", "memorized", - "memorises", "memorizes", - "mesmerise", "mesmerize", - "minimised", "minimized", - "minimises", "minimizes", - "mobilised", "mobilized", - "mobilises", "mobilizes", - "modellers", "modelers", - "modelling", "modeling", - "modernise", "modernize", - "moralised", "moralized", - "moralises", "moralizes", - "motorised", "motorized", - "mouldered", "moldered", - "mouldiest", "moldiest", - "mouldings", "moldings", - "moustache", "mustache", - "neighbour", "neighbor", - "normalise", "normalize", - "odourless", "odorless", - "oestrogen", "estrogen", - "optimised", "optimized", - "optimises", "optimizes", - "organised", "organized", - "organiser", "organizer", - "organises", "organizes", - "ostracise", "ostracize", - "oxidising", "oxidizing", - "paederast", "pederast", - "panelling", "paneling", - "panellist", "panelist", - "paralysed", "paralyzed", - "paralyses", "paralyzes", - "parcelled", "parceled", - "passivise", "passivize", - "patronise", "patronize", - "pedalling", "pedaling", - "penalised", "penalized", - "penalises", "penalizes", - "pencilled", "penciled", - "ploughing", "plowing", - "ploughman", "plowman", - "ploughmen", "plowmen", - "polarised", "polarized", - "polarises", "polarizes", - "practised", "practiced", - "practises", "practices", - "pretences", "pretenses", - "primaeval", "primeval", - "privatise", "privatize", - "programme", "program", - "publicise", "publicize", - "pulverise", "pulverize", - "pummelled", "pummel", - "randomise", "randomize", - "ravelling", "raveling", - "realising", "realizing", - "recognise", "recognize", - "refuelled", "refueled", - "remoulded", "remolded", - "revellers", "revelers", - "revelling", "reveling", - "rivalling", "rivaling", - "saltpetre", "saltpeter", - "sanitised", "sanitized", - "sanitises", "sanitizes", - "satirised", "satirized", - "satirises", "satirizes", - "savouries", "savories", - "savouring", "savoring", - "sceptical", "skeptical", - "sensitise", "sensitize", - "sepulchre", "sepulcher", - "serialise", "serialize", - "sermonise", "sermonize", - "shovelled", "shoveled", - "signalise", "signalize", - "signalled", "signaled", - "snivelled", "sniveled", - "socialise", "socialize", - "sodomised", "sodomized", - "sodomises", "sodomizes", - "solemnise", "solemnize", - "spiralled", "spiraled", - "splendour", "splendor", - "stabilise", "stabilize", - "sterilise", "sterilize", - "subsidise", "subsidize", - "succoured", "succored", - "sulphates", "sulfates", - "sulphides", "sulfides", - "summarise", "summarize", - "swivelled", "swiveled", - "symbolise", "symbolize", - "syphoning", "siphoning", - "tantalise", "tantalize", - "tasselled", "tasseled", - "temporise", "temporize", - "tenderise", "tenderize", - "terrorise", "terrorize", - "theorised", "theorized", - "theorises", "theorizes", - "towelling", "toweling", - "travelled", "traveled", - "traveller", "traveler", - "trialling", "trialing", - "tricolour", "tricolor", - "tunnelled", "tunneled", - "tyrannise", "tyrannize", - "unionised", "unionized", - "unionises", "unionizes", - "unsavoury", "unsavory", - "urbanised", "urbanized", - "urbanises", "urbanizes", - "utilising", "utilizing", - "vandalise", "vandalize", - "vaporised", "vaporized", - "vaporises", "vaporizes", - "verbalise", "verbalize", - "victimise", "victimize", - "visualise", "visualize", - "vocalised", "vocalized", - "vocalises", "vocalizes", - "vulgarise", "vulgarize", - "weaselled", "weaseled", - "womanised", "womanized", - "womaniser", "womanizer", - "womanises", "womanizes", - "yodelling", "yodeling", - "yoghourts", "yogurts", - "agonised", "agonized", - "agonises", "agonizes", - "almanack", "almanac", - "amortise", "amortize", - "analogue", "analog", - "analysed", "analyzed", - "analyses", "analyzes", - "armoured", "armored", - "armourer", "armorer", - "artefact", "artifact", - "baptised", "baptized", - "baptises", "baptizes", - "baulking", "balking", - "belabour", "belabor", - "bevelled", "beveled", - "calibres", "calibers", - "calliper", "caliper", - "canalise", "canalize", - "canonise", "canonize", - "carolled", "caroled", - "catalyse", "catalyze", - "cavilled", "caviled", - "civilise", "civilize", - "clamours", "clamors", - "clangour", "clangor", - "colonise", "colonize", - "coloured", "colored", - "cosiness", "coziness", - "crueller", "crueler", - "defences", "defenses", - "demonise", "demonize", - "deputise", "deputize", - "dialling", "dialing", - "dialogue", "dialog", - "digitise", "digitize", - "draughty", "drafty", - "duelling", "dueling", - "energise", "energize", - "enthrals", "enthralls", - "equalise", "equalize", - "eulogise", "eulogize", - "favoured", "favored", - "feminise", "feminize", - "finalise", "finalize", - "flautist", "flutist", - "flavours", "flavors", - "foetuses", "fetuses", - "fuelling", "fueling", - "gaolbird", "jailbird", - "gryphons", "griffins", - "harbours", "harbors", - "honoured", "honored", - "humanise", "humanize", - "humoured", "humored", - "idealise", "idealize", - "idolised", "idolized", - "idolises", "idolizes", - "immunise", "immunize", - "ionisers", "ionizers", - "ionising", "ionizing", - "itemised", "itemized", - "itemises", "itemizes", - "jewelled", "jeweled", - "jeweller", "jeweler", - "labelled", "labeled", - "laboured", "labored", - "labourer", "laborer", - "legalise", "legalize", - "levelled", "leveled", - "leveller", "leveler", - "libelled", "libeled", - "licenced", "licensed", - "licences", "licenses", - "lionised", "lionized", - "lionises", "lionizes", - "localise", "localize", - "maximise", "maximize", - "memorise", "memorize", - "minimise", "minimize", - "misspelt", "misspelled", - "mobilise", "mobilize", - "modelled", "modeled", - "modeller", "modeler", - "moralise", "moralize", - "moulders", "molders", - "mouldier", "moldier", - "moulding", "molding", - "moulting", "molting", - "offences", "offenses", - "optimise", "optimize", - "organise", "organize", - "oxidised", "oxidized", - "oxidises", "oxidizes", - "panelled", "paneled", - "paralyse", "paralyze", - "parlours", "parlors", - "pedalled", "pedaled", - "penalise", "penalize", - "philtres", "filters", - "ploughed", "plowed", - "polarise", "polarize", - "practise", "practice", - "pretence", "pretense", - "ravelled", "raveled", - "realised", "realized", - "realises", "realizes", - "remoulds", "remolds", - "revelled", "reveled", - "reveller", "reveler", - "rivalled", "rivaled", - "rumoured", "rumored", - "sanitise", "sanitize", - "satirise", "satirize", - "saviours", "saviors", - "savoured", "savored", - "sceptics", "skeptics", - "sceptres", "scepters", - "sodomise", "sodomize", - "spectres", "specters", - "succours", "succors", - "sulphate", "sulfate", - "sulphide", "sulfide", - "syphoned", "siphoned", - "theatres", "theaters", - "theorise", "theorize", - "towelled", "toweled", - "toxaemia", "toxemia", - "trialled", "trialed", - "unionise", "unionize", - "urbanise", "urbanize", - "utilised", "utilized", - "utilises", "utilizes", - "vaporise", "vaporize", - "vocalise", "vocalize", - "womanise", "womanize", - "yodelled", "yodeled", - "yoghourt", "yogurt", - "yoghurts", "yogurts", - "agonise", "agonize", - "anaemia", "anemia", - "anaemic", "anemic", - "analyse", "analyze", - "arbours", "arbors", - "armoury", "armory", - "baptise", "baptize", - "baulked", "balked", - "behoved", "behooved", - "behoves", "behooves", - "calibre", "caliber", - "candour", "candor", - "centred", "centered", - "centres", "centers", - "cheques", "checks", - "clamour", "clamor", - "colours", "colors", - "cosiest", "coziest", - "defence", "defense", - "dialled", "dialed", - "distils", "distills", - "duelled", "dueled", - "enthral", "enthrall", - "favours", "favors", - "fervour", "fervor", - "flavour", "flavor", - "fuelled", "fueled", - "fulfils", "fulfills", - "gaolers", "jailers", - "gaoling", "jailing", - "gipsies", "gypsies", - "glueing", "gluing", - "goitres", "goiters", - "grammes", "grams", - "groynes", "groins", - "gryphon", "griffin", - "harbour", "harbor", - "honours", "honors", - "humours", "humors", - "idolise", "idolize", - "instals", "installs", - "instils", "instills", - "ionised", "ionized", - "ioniser", "ionizer", - "ionises", "ionizes", - "itemise", "itemize", - "labours", "labors", - "licence", "license", - "lionise", "lionize", - "louvred", "louvered", - "louvres", "louvers", - "moulded", "molded", - "moulder", "molder", - "moulted", "molted", - "offence", "offense", - "oxidise", "oxidize", - "parlour", "parlor", - "philtre", "filter", - "ploughs", "plows", - "pyjamas", "pajamas", - "rancour", "rancor", - "realise", "realize", - "remould", "remold", - "rigours", "rigors", - "rumours", "rumors", - "saviour", "savior", - "savours", "savors", - "savoury", "savory", - "sceptic", "skeptic", - "sceptre", "scepter", - "spectre", "specter", - "storeys", "stories", - "succour", "succor", - "sulphur", "sulfur", - "syphons", "siphons", - "theatre", "theater", - "tumours", "tumors", - "utilise", "utilize", - "vapours", "vapors", - "waggons", "wagons", - "yoghurt", "yogurt", - "ageing", "aging", - "appals", "appalls", - "arbour", "arbor", - "ardour", "ardor", - "baulks", "balks", - "behove", "behoove", - "centre", "center", - "cheque", "check", - "chilli", "chili", - "colour", "color", - "cosier", "cozier", - "cosies", "cozies", - "cosily", "cozily", - "distil", "distill", - "edoema", "edema", - "enrols", "enrolls", - "faecal", "fecal", - "faeces", "feces", - "favour", "favor", - "fibres", "fibers", - "foetal", "fetal", - "foetid", "fetid", - "foetus", "fetus", - "fulfil", "fulfill", - "gaoled", "jailed", - "gaoler", "jailer", - "goitre", "goiter", - "gramme", "gram", - "groyne", "groin", - "honour", "honor", - "humour", "humor", - "instal", "install", - "instil", "instill", - "ionise", "ionize", - "labour", "labor", - "litres", "liters", - "lustre", "luster", - "meagre", "meager", - "metres", "meters", - "mitres", "miters", - "moulds", "molds", - "mouldy", "moldy", - "moults", "molts", - "odours", "odors", - "plough", "plow", - "pyjama", "pajama", - "rigour", "rigor", - "rumour", "rumor", - "savour", "savor", - "storey", "story", - "syphon", "siphon", - "tumour", "tumor", - "valour", "valor", - "vapour", "vapor", - "vigour", "vigor", - "waggon", "wagon", - "appal", "appall", - "baulk", "balk", - "enrol", "enroll", - "fibre", "fiber", - "gaols", "jails", - "litre", "liter", - "metre", "meter", - "mitre", "miter", - "mould", "mold", - "moult", "molt", - "odour", "odor", - "tyres", "tires", - "cosy", "cozy", - "gaol", "jail", - "tyre", "tire", -} - -// DictBritish converts US spellings to UK spellings -var DictBritish = []string{ - "institutionalization", "institutionalisation", - "internationalization", "internationalisation", - "professionalization", "professionalisation", - "compartmentalizing", "compartmentalising", - "institutionalizing", "institutionalising", - "internationalizing", "internationalising", - "compartmentalized", "compartmentalised", - "compartmentalizes", "compartmentalises", - "decriminalization", "decriminalisation", - "denationalization", "denationalisation", - "fictionalizations", "fictionalisations", - "institutionalized", "institutionalised", - "institutionalizes", "institutionalises", - "intellectualizing", "intellectualising", - "internationalized", "internationalised", - "internationalizes", "internationalises", - "pedestrianization", "pedestrianisation", - "professionalizing", "professionalising", - "compartmentalize", "compartmentalise", - "decentralization", "decentralisation", - "demilitarization", "demilitarisation", - "externalizations", "externalisations", - "fictionalization", "fictionalisation", - "institutionalize", "institutionalise", - "intellectualized", "intellectualised", - "intellectualizes", "intellectualises", - "internationalize", "internationalise", - "nationalizations", "nationalisations", - "professionalized", "professionalised", - "professionalizes", "professionalises", - "rationalizations", "rationalisations", - "sensationalizing", "sensationalising", - "sentimentalizing", "sentimentalising", - "acclimatization", "acclimatisation", - "commercializing", "commercialising", - "conceptualizing", "conceptualising", - "contextualizing", "contextualising", - "crystallization", "crystallisation", - "decriminalizing", "decriminalising", - "democratization", "democratisation", - "denationalizing", "denationalising", - "depersonalizing", "depersonalising", - "desensitization", "desensitisation", - "disorganization", "disorganisation", - "extemporization", "extemporisation", - "externalization", "externalisation", - "familiarization", "familiarisation", - "generalizations", "generalisations", - "hospitalization", "hospitalisation", - "individualizing", "individualising", - "industrializing", "industrialising", - "intellectualize", "intellectualise", - "internalization", "internalisation", - "maneuverability", "manoeuvrability", - "materialization", "materialisation", - "miniaturization", "miniaturisation", - "nationalization", "nationalisation", - "overemphasizing", "overemphasising", - "paleontologists", "palaeontologists", - "particularizing", "particularising", - "pedestrianizing", "pedestrianising", - "professionalize", "professionalise", - "psychoanalyzing", "psychoanalysing", - "rationalization", "rationalisation", - "reorganizations", "reorganisations", - "revolutionizing", "revolutionising", - "sensationalized", "sensationalised", - "sensationalizes", "sensationalises", - "sentimentalized", "sentimentalised", - "sentimentalizes", "sentimentalises", - "specializations", "specialisations", - "standardization", "standardisation", - "synchronization", "synchronisation", - "systematization", "systematisation", - "aggrandizement", "aggrandisement", - "characterizing", "characterising", - "collectivizing", "collectivising", - "commercialized", "commercialised", - "commercializes", "commercialises", - "conceptualized", "conceptualised", - "conceptualizes", "conceptualises", - "contextualized", "contextualised", - "contextualizes", "contextualises", - "decentralizing", "decentralising", - "decriminalized", "decriminalised", - "decriminalizes", "decriminalises", - "dehumanization", "dehumanisation", - "demilitarizing", "demilitarising", - "demobilization", "demobilisation", - "demoralization", "demoralisation", - "denationalized", "denationalised", - "denationalizes", "denationalises", - "depersonalized", "depersonalised", - "depersonalizes", "depersonalises", - "dramatizations", "dramatisations", - "editorializing", "editorialising", - "fictionalizing", "fictionalising", - "fraternization", "fraternisation", - "generalization", "generalisation", - "immobilization", "immobilisation", - "individualized", "individualised", - "individualizes", "individualises", - "industrialized", "industrialised", - "industrializes", "industrialises", - "liberalization", "liberalisation", - "monopolization", "monopolisation", - "naturalization", "naturalisation", - "neighborliness", "neighbourliness", - "neutralization", "neutralisation", - "organizational", "organisational", - "outmaneuvering", "outmanoeuvring", - "overemphasized", "overemphasised", - "overemphasizes", "overemphasises", - "paleontologist", "palaeontologist", - "particularized", "particularised", - "particularizes", "particularises", - "pasteurization", "pasteurisation", - "pedestrianized", "pedestrianised", - "pedestrianizes", "pedestrianises", - "philosophizing", "philosophising", - "politicization", "politicisation", - "popularization", "popularisation", - "pressurization", "pressurisation", - "prioritization", "prioritisation", - "privatizations", "privatisations", - "propagandizing", "propagandising", - "psychoanalyzed", "psychoanalysed", - "psychoanalyzes", "psychoanalyses", - "reconnoitering", "reconnoitring", - "regularization", "regularisation", - "reorganization", "reorganisation", - "revolutionized", "revolutionised", - "revolutionizes", "revolutionises", - "secularization", "secularisation", - "sensationalize", "sensationalise", - "sentimentalize", "sentimentalise", - "serializations", "serialisations", - "specialization", "specialisation", - "sterilizations", "sterilisations", - "stigmatization", "stigmatisation", - "transistorized", "transistorised", - "unrecognizable", "unrecognisable", - "visualizations", "visualisations", - "westernization", "westernisation", - "accessorizing", "accessorising", - "acclimatizing", "acclimatising", - "amortizations", "amortisations", - "amphitheaters", "amphitheatres", - "anesthetizing", "anaesthetising", - "archeologists", "archaeologists", - "breathalyzers", "breathalysers", - "breathalyzing", "breathalysing", - "cannibalizing", "cannibalising", - "characterized", "characterised", - "characterizes", "characterises", - "circularizing", "circularising", - "collectivized", "collectivised", - "collectivizes", "collectivises", - "commercialize", "commercialise", - "computerizing", "computerising", - "conceptualize", "conceptualise", - "contextualize", "contextualise", - "criminalizing", "criminalising", - "crystallizing", "crystallising", - "decentralized", "decentralised", - "decentralizes", "decentralises", - "decriminalize", "decriminalise", - "demilitarized", "demilitarised", - "demilitarizes", "demilitarises", - "democratizing", "democratising", - "denationalize", "denationalise", - "depersonalize", "depersonalise", - "desensitizing", "desensitising", - "destabilizing", "destabilising", - "disemboweling", "disembowelling", - "dramatization", "dramatisation", - "editorialized", "editorialised", - "editorializes", "editorialises", - "extemporizing", "extemporising", - "externalizing", "externalising", - "familiarizing", "familiarising", - "fertilization", "fertilisation", - "fictionalized", "fictionalised", - "fictionalizes", "fictionalises", - "formalization", "formalisation", - "fossilization", "fossilisation", - "globalization", "globalisation", - "gynecological", "gynaecological", - "gynecologists", "gynaecologists", - "harmonization", "harmonisation", - "hematological", "haematological", - "hematologists", "haematologists", - "hospitalizing", "hospitalising", - "hypothesizing", "hypothesising", - "immortalizing", "immortalising", - "individualize", "individualise", - "industrialize", "industrialise", - "internalizing", "internalising", - "marginalizing", "marginalising", - "materializing", "materialising", - "mechanization", "mechanisation", - "memorializing", "memorialising", - "miniaturizing", "miniaturising", - "nationalizing", "nationalising", - "neighborhoods", "neighbourhoods", - "normalization", "normalisation", - "organizations", "organisations", - "outmaneuvered", "outmanoeuvred", - "overemphasize", "overemphasise", - "particularize", "particularise", - "passivization", "passivisation", - "patronizingly", "patronisingly", - "pedestrianize", "pedestrianise", - "pediatricians", "paediatricians", - "personalizing", "personalising", - "philosophized", "philosophised", - "philosophizes", "philosophises", - "privatization", "privatisation", - "propagandized", "propagandised", - "propagandizes", "propagandises", - "proselytizers", "proselytisers", - "proselytizing", "proselytising", - "psychoanalyze", "psychoanalyse", - "pulverization", "pulverisation", - "rationalizing", "rationalising", - "reconnoitered", "reconnoitred", - "revolutionize", "revolutionise", - "romanticizing", "romanticising", - "serialization", "serialisation", - "socialization", "socialisation", - "standardizing", "standardising", - "sterilization", "sterilisation", - "subsidization", "subsidisation", - "synchronizing", "synchronising", - "systematizing", "systematising", - "tantalizingly", "tantalisingly", - "underutilized", "underutilised", - "victimization", "victimisation", - "visualization", "visualisation", - "vocalizations", "vocalisations", - "vulgarization", "vulgarisation", - "accessorized", "accessorised", - "accessorizes", "accessorises", - "acclimatized", "acclimatised", - "acclimatizes", "acclimatises", - "amortization", "amortisation", - "amphitheater", "amphitheatre", - "anesthetists", "anaesthetists", - "anesthetized", "anaesthetised", - "anesthetizes", "anaesthetises", - "antagonizing", "antagonising", - "appetizingly", "appetisingly", - "archeologist", "archaeologist", - "backpedaling", "backpedalling", - "bastardizing", "bastardising", - "behaviorists", "behaviourists", - "bowdlerizing", "bowdlerising", - "breathalyzed", "breathalysed", - "breathalyzes", "breathalyses", - "cannibalized", "cannibalised", - "cannibalizes", "cannibalises", - "capitalizing", "capitalising", - "caramelizing", "caramelising", - "categorizing", "categorising", - "centerpieces", "centrepieces", - "centralizing", "centralising", - "characterize", "characterise", - "circularized", "circularised", - "circularizes", "circularises", - "clarinetists", "clarinettists", - "collectivize", "collectivise", - "colonization", "colonisation", - "computerized", "computerised", - "computerizes", "computerises", - "criminalized", "criminalised", - "criminalizes", "criminalises", - "crystallized", "crystallised", - "crystallizes", "crystallises", - "decentralize", "decentralise", - "dehumanizing", "dehumanising", - "demilitarize", "demilitarise", - "demobilizing", "demobilising", - "democratized", "democratised", - "democratizes", "democratises", - "demoralizing", "demoralising", - "desensitized", "desensitised", - "desensitizes", "desensitises", - "destabilized", "destabilised", - "destabilizes", "destabilises", - "disemboweled", "disembowelled", - "dishonorable", "dishonourable", - "dishonorably", "dishonourably", - "disorganized", "disorganised", - "editorialize", "editorialise", - "equalization", "equalisation", - "evangelizing", "evangelising", - "extemporized", "extemporised", - "extemporizes", "extemporises", - "externalized", "externalised", - "externalizes", "externalises", - "familiarized", "familiarised", - "familiarizes", "familiarises", - "fictionalize", "fictionalise", - "finalization", "finalisation", - "fraternizing", "fraternising", - "generalizing", "generalising", - "gynecologist", "gynaecologist", - "hematologist", "haematologist", - "hemophiliacs", "haemophiliacs", - "hemorrhaging", "haemorrhaging", - "homogenizing", "homogenising", - "hospitalized", "hospitalised", - "hospitalizes", "hospitalises", - "hypothesized", "hypothesised", - "hypothesizes", "hypothesises", - "idealization", "idealisation", - "immobilizers", "immobilisers", - "immobilizing", "immobilising", - "immortalized", "immortalised", - "immortalizes", "immortalises", - "immunization", "immunisation", - "initializing", "initialising", - "installments", "instalments", - "internalized", "internalised", - "internalizes", "internalises", - "jeopardizing", "jeopardising", - "legalization", "legalisation", - "legitimizing", "legitimising", - "liberalizing", "liberalising", - "maneuverable", "manoeuvrable", - "maneuverings", "manoeuvrings", - "marginalized", "marginalised", - "marginalizes", "marginalises", - "materialized", "materialised", - "materializes", "materialises", - "maximization", "maximisation", - "memorialized", "memorialised", - "memorializes", "memorialises", - "metabolizing", "metabolising", - "militarizing", "militarising", - "miniaturized", "miniaturised", - "miniaturizes", "miniaturises", - "miscataloged", "miscatalogued", - "misdemeanors", "misdemeanours", - "mobilization", "mobilisation", - "moisturizers", "moisturisers", - "moisturizing", "moisturising", - "monopolizing", "monopolising", - "multicolored", "multicoloured", - "nationalized", "nationalised", - "nationalizes", "nationalises", - "naturalizing", "naturalising", - "neighborhood", "neighbourhood", - "neutralizing", "neutralising", - "organization", "organisation", - "outmaneuvers", "outmanoeuvres", - "paleontology", "palaeontology", - "pasteurizing", "pasteurising", - "pediatrician", "paediatrician", - "personalized", "personalised", - "personalizes", "personalises", - "philosophize", "philosophise", - "plagiarizing", "plagiarising", - "polarization", "polarisation", - "politicizing", "politicising", - "popularizing", "popularising", - "pressurizing", "pressurising", - "prioritizing", "prioritising", - "propagandize", "propagandise", - "proselytized", "proselytised", - "proselytizer", "proselytiser", - "proselytizes", "proselytises", - "radicalizing", "radicalising", - "rationalized", "rationalised", - "rationalizes", "rationalises", - "realizations", "realisations", - "recognizable", "recognisable", - "recognizably", "recognisably", - "recognizance", "recognisance", - "reconnoiters", "reconnoitres", - "regularizing", "regularising", - "reorganizing", "reorganising", - "revitalizing", "revitalising", - "rhapsodizing", "rhapsodising", - "romanticized", "romanticised", - "romanticizes", "romanticises", - "scandalizing", "scandalising", - "scrutinizing", "scrutinising", - "secularizing", "secularising", - "standardized", "standardised", - "standardizes", "standardises", - "stigmatizing", "stigmatising", - "sympathizers", "sympathisers", - "sympathizing", "sympathising", - "synchronized", "synchronised", - "synchronizes", "synchronises", - "synthesizing", "synthesising", - "systematized", "systematised", - "systematizes", "systematises", - "theatergoers", "theatregoers", - "traumatizing", "traumatising", - "trivializing", "trivialising", - "unauthorized", "unauthorised", - "unionization", "unionisation", - "unrecognized", "unrecognised", - "urbanization", "urbanisation", - "vaporization", "vaporisation", - "vocalization", "vocalisation", - "westernizing", "westernising", - "accessorize", "accessorise", - "acclimatize", "acclimatise", - "agonizingly", "agonisingly", - "amortizable", "amortisable", - "anesthetics", "anaesthetics", - "anesthetist", "anaesthetist", - "anesthetize", "anaesthetise", - "anglicizing", "anglicising", - "antagonized", "antagonised", - "antagonizes", "antagonises", - "apologizing", "apologising", - "backpedaled", "backpedalled", - "bastardized", "bastardised", - "bastardizes", "bastardises", - "behaviorism", "behaviourism", - "behaviorist", "behaviourist", - "bowdlerized", "bowdlerised", - "bowdlerizes", "bowdlerises", - "brutalizing", "brutalising", - "cannibalize", "cannibalise", - "capitalized", "capitalised", - "capitalizes", "capitalises", - "caramelized", "caramelised", - "caramelizes", "caramelises", - "carbonizing", "carbonising", - "categorized", "categorised", - "categorizes", "categorises", - "cauterizing", "cauterising", - "centerfolds", "centrefolds", - "centerpiece", "centrepiece", - "centiliters", "centilitres", - "centimeters", "centimetres", - "centralized", "centralised", - "centralizes", "centralises", - "circularize", "circularise", - "clarinetist", "clarinettist", - "computerize", "computerise", - "criminalize", "criminalise", - "criticizing", "criticising", - "crystallize", "crystallise", - "customizing", "customising", - "defenseless", "defenceless", - "dehumanized", "dehumanised", - "dehumanizes", "dehumanises", - "demobilized", "demobilised", - "demobilizes", "demobilises", - "democratize", "democratise", - "demoralized", "demoralised", - "demoralizes", "demoralises", - "deodorizing", "deodorising", - "desensitize", "desensitise", - "destabilize", "destabilise", - "discoloring", "discolouring", - "dishonoring", "dishonouring", - "dramatizing", "dramatising", - "economizing", "economising", - "empathizing", "empathising", - "emphasizing", "emphasising", - "endeavoring", "endeavouring", - "epitomizing", "epitomising", - "esophaguses", "oesophaguses", - "evangelized", "evangelised", - "evangelizes", "evangelises", - "extemporize", "extemporise", - "externalize", "externalise", - "factorizing", "factorising", - "familiarize", "familiarise", - "fantasizing", "fantasising", - "fertilizers", "fertilisers", - "fertilizing", "fertilising", - "formalizing", "formalising", - "fossilizing", "fossilising", - "fraternized", "fraternised", - "fraternizes", "fraternises", - "fulfillment", "fulfilment", - "galvanizing", "galvanising", - "generalized", "generalised", - "generalizes", "generalises", - "ghettoizing", "ghettoising", - "globalizing", "globalising", - "harmonizing", "harmonising", - "hemophiliac", "haemophiliac", - "hemorrhaged", "haemorrhaged", - "hemorrhages", "haemorrhages", - "hemorrhoids", "haemorrhoids", - "homogenized", "homogenised", - "homogenizes", "homogenises", - "hospitalize", "hospitalise", - "hybridizing", "hybridising", - "hypnotizing", "hypnotising", - "hypothesize", "hypothesise", - "immobilized", "immobilised", - "immobilizer", "immobiliser", - "immobilizes", "immobilises", - "immortalize", "immortalise", - "initialized", "initialised", - "initializes", "initialises", - "installment", "instalment", - "internalize", "internalise", - "italicizing", "italicising", - "jeopardized", "jeopardised", - "jeopardizes", "jeopardises", - "legitimized", "legitimised", - "legitimizes", "legitimises", - "liberalized", "liberalised", - "liberalizes", "liberalises", - "lionization", "lionisation", - "liquidizers", "liquidisers", - "liquidizing", "liquidising", - "magnetizing", "magnetising", - "maneuvering", "manoeuvring", - "marginalize", "marginalise", - "marvelously", "marvellously", - "materialize", "materialise", - "mechanizing", "mechanising", - "memorialize", "memorialise", - "mesmerizing", "mesmerising", - "metabolized", "metabolised", - "metabolizes", "metabolises", - "militarized", "militarised", - "militarizes", "militarises", - "milliliters", "millilitres", - "millimeters", "millimetres", - "miniaturize", "miniaturise", - "misbehavior", "misbehaviour", - "misdemeanor", "misdemeanour", - "modernizing", "modernising", - "moisturized", "moisturised", - "moisturizer", "moisturiser", - "moisturizes", "moisturises", - "monopolized", "monopolised", - "monopolizes", "monopolises", - "nationalize", "nationalise", - "naturalized", "naturalised", - "naturalizes", "naturalises", - "neighboring", "neighbouring", - "neutralized", "neutralised", - "neutralizes", "neutralises", - "normalizing", "normalising", - "orthopedics", "orthopaedics", - "ostracizing", "ostracising", - "outmaneuver", "outmanoeuvre", - "oxidization", "oxidisation", - "pasteurized", "pasteurised", - "pasteurizes", "pasteurises", - "patronizing", "patronising", - "personalize", "personalise", - "plagiarized", "plagiarised", - "plagiarizes", "plagiarises", - "politicized", "politicised", - "politicizes", "politicises", - "popularized", "popularised", - "popularizes", "popularises", - "pressurized", "pressurised", - "pressurizes", "pressurises", - "prioritized", "prioritised", - "prioritizes", "prioritises", - "privatizing", "privatising", - "proselytize", "proselytise", - "publicizing", "publicising", - "pulverizing", "pulverising", - "radicalized", "radicalised", - "radicalizes", "radicalises", - "randomizing", "randomising", - "rationalize", "rationalise", - "realization", "realisation", - "recognizing", "recognising", - "reconnoiter", "reconnoitre", - "regularized", "regularised", - "regularizes", "regularises", - "reorganized", "reorganised", - "reorganizes", "reorganises", - "revitalized", "revitalised", - "revitalizes", "revitalises", - "rhapsodized", "rhapsodised", - "rhapsodizes", "rhapsodises", - "romanticize", "romanticise", - "scandalized", "scandalised", - "scandalizes", "scandalises", - "scrutinized", "scrutinised", - "scrutinizes", "scrutinises", - "secularized", "secularised", - "secularizes", "secularises", - "sensitizing", "sensitising", - "serializing", "serialising", - "sermonizing", "sermonising", - "signalizing", "signalising", - "skeptically", "sceptically", - "socializing", "socialising", - "solemnizing", "solemnising", - "specialized", "specialised", - "specializes", "specialises", - "squirreling", "squirrelling", - "stabilizers", "stabilisers", - "stabilizing", "stabilising", - "standardize", "standardise", - "sterilizers", "sterilisers", - "sterilizing", "sterilising", - "stigmatized", "stigmatised", - "stigmatizes", "stigmatises", - "subsidizers", "subsidisers", - "subsidizing", "subsidising", - "summarizing", "summarising", - "symbolizing", "symbolising", - "sympathized", "sympathised", - "sympathizer", "sympathiser", - "sympathizes", "sympathises", - "synchronize", "synchronise", - "synthesized", "synthesised", - "synthesizes", "synthesises", - "systematize", "systematise", - "tantalizing", "tantalising", - "temporizing", "temporising", - "tenderizing", "tenderising", - "terrorizing", "terrorising", - "theatergoer", "theatregoer", - "traumatized", "traumatised", - "traumatizes", "traumatises", - "trivialized", "trivialised", - "trivializes", "trivialises", - "tyrannizing", "tyrannising", - "uncataloged", "uncatalogued", - "uncivilized", "uncivilised", - "unfavorable", "unfavourable", - "unfavorably", "unfavourably", - "unorganized", "unorganised", - "untrammeled", "untrammelled", - "utilization", "utilisation", - "vandalizing", "vandalising", - "verbalizing", "verbalising", - "victimizing", "victimising", - "visualizing", "visualising", - "vulgarizing", "vulgarising", - "watercolors", "watercolours", - "westernized", "westernised", - "westernizes", "westernises", - "amortizing", "amortising", - "anesthesia", "anaesthesia", - "anesthetic", "anaesthetic", - "anglicized", "anglicised", - "anglicizes", "anglicises", - "annualized", "annualised", - "antagonize", "antagonise", - "apologized", "apologised", - "apologizes", "apologises", - "appetizers", "appetisers", - "appetizing", "appetising", - "archeology", "archaeology", - "authorizes", "authorises", - "bastardize", "bastardise", - "bedeviling", "bedevilling", - "behavioral", "behavioural", - "belaboring", "belabouring", - "bowdlerize", "bowdlerise", - "brutalized", "brutalised", - "brutalizes", "brutalises", - "canalizing", "canalising", - "canonizing", "canonising", - "capitalize", "capitalise", - "caramelize", "caramelise", - "carbonized", "carbonised", - "carbonizes", "carbonises", - "cataloging", "cataloguing", - "catalyzing", "catalysing", - "categorize", "categorise", - "cauterized", "cauterised", - "cauterizes", "cauterises", - "centerfold", "centrefold", - "centiliter", "centilitre", - "centimeter", "centimetre", - "centralize", "centralise", - "channeling", "channelling", - "checkbooks", "chequebooks", - "civilizing", "civilising", - "colonizers", "colonisers", - "colonizing", "colonising", - "colorfully", "colourfully", - "colorizing", "colourizing", - "councilors", "councillors", - "counselors", "counsellors", - "criticized", "criticised", - "criticizes", "criticises", - "customized", "customised", - "customizes", "customises", - "dehumanize", "dehumanise", - "demobilize", "demobilise", - "demonizing", "demonising", - "demoralize", "demoralise", - "deodorized", "deodorised", - "deodorizes", "deodorises", - "deputizing", "deputising", - "digitizing", "digitising", - "discolored", "discoloured", - "disheveled", "dishevelled", - "dishonored", "dishonoured", - "dramatized", "dramatised", - "dramatizes", "dramatises", - "economized", "economised", - "economizes", "economises", - "empathized", "empathised", - "empathizes", "empathises", - "emphasized", "emphasised", - "emphasizes", "emphasises", - "endeavored", "endeavoured", - "energizing", "energising", - "epicenters", "epicentres", - "epitomized", "epitomised", - "epitomizes", "epitomises", - "equalizers", "equalisers", - "equalizing", "equalising", - "eulogizing", "eulogising", - "evangelize", "evangelise", - "factorized", "factorised", - "factorizes", "factorises", - "fantasized", "fantasised", - "fantasizes", "fantasises", - "favoritism", "favouritism", - "feminizing", "feminising", - "fertilized", "fertilised", - "fertilizer", "fertiliser", - "fertilizes", "fertilises", - "fiberglass", "fibreglass", - "finalizing", "finalising", - "flavorings", "flavourings", - "flavorless", "flavourless", - "flavorsome", "flavoursome", - "formalized", "formalised", - "formalizes", "formalises", - "fossilized", "fossilised", - "fossilizes", "fossilises", - "fraternize", "fraternise", - "galvanized", "galvanised", - "galvanizes", "galvanises", - "generalize", "generalise", - "ghettoized", "ghettoised", - "ghettoizes", "ghettoises", - "globalized", "globalised", - "globalizes", "globalises", - "gruelingly", "gruellingly", - "gynecology", "gynaecology", - "harmonized", "harmonised", - "harmonizes", "harmonises", - "hematology", "haematology", - "hemoglobin", "haemoglobin", - "hemophilia", "haemophilia", - "hemorrhage", "haemorrhage", - "homogenize", "homogenise", - "humanizing", "humanising", - "hybridized", "hybridised", - "hybridizes", "hybridises", - "hypnotized", "hypnotised", - "hypnotizes", "hypnotises", - "idealizing", "idealising", - "immobilize", "immobilise", - "immunizing", "immunising", - "impaneling", "impanelling", - "imperiling", "imperilling", - "initialing", "initialling", - "initialize", "initialise", - "ionization", "ionisation", - "italicized", "italicised", - "italicizes", "italicises", - "jeopardize", "jeopardise", - "kilometers", "kilometres", - "lackluster", "lacklustre", - "legalizing", "legalising", - "legitimize", "legitimise", - "liberalize", "liberalise", - "liquidized", "liquidised", - "liquidizer", "liquidiser", - "liquidizes", "liquidises", - "localizing", "localising", - "magnetized", "magnetised", - "magnetizes", "magnetises", - "maneuvered", "manoeuvred", - "marshaling", "marshalling", - "maximizing", "maximising", - "mechanized", "mechanised", - "mechanizes", "mechanises", - "memorizing", "memorising", - "mesmerized", "mesmerised", - "mesmerizes", "mesmerises", - "metabolize", "metabolise", - "militarize", "militarise", - "milliliter", "millilitre", - "millimeter", "millimetre", - "minimizing", "minimising", - "mobilizing", "mobilising", - "modernized", "modernised", - "modernizes", "modernises", - "moisturize", "moisturise", - "monopolize", "monopolise", - "moralizing", "moralising", - "naturalize", "naturalise", - "neighborly", "neighbourly", - "neutralize", "neutralise", - "normalized", "normalised", - "normalizes", "normalises", - "optimizing", "optimising", - "organizers", "organisers", - "organizing", "organising", - "orthopedic", "orthopaedic", - "ostracized", "ostracised", - "ostracizes", "ostracises", - "paralyzing", "paralysing", - "pasteurize", "pasteurise", - "patronized", "patronised", - "patronizes", "patronises", - "pedophiles", "paedophiles", - "pedophilia", "paedophilia", - "penalizing", "penalising", - "plagiarize", "plagiarise", - "plowshares", "ploughshares", - "polarizing", "polarising", - "politicize", "politicise", - "popularize", "popularise", - "prioritize", "prioritise", - "privatized", "privatised", - "privatizes", "privatises", - "publicized", "publicised", - "publicizes", "publicises", - "pulverized", "pulverised", - "pulverizes", "pulverises", - "quarreling", "quarrelling", - "radicalize", "radicalise", - "randomized", "randomised", - "randomizes", "randomises", - "realizable", "realisable", - "recognized", "recognised", - "recognizes", "recognises", - "regularize", "regularise", - "remodeling", "remodelling", - "reorganize", "reorganise", - "revitalize", "revitalise", - "rhapsodize", "rhapsodise", - "ritualized", "ritualised", - "sanitizing", "sanitising", - "satirizing", "satirising", - "scandalize", "scandalise", - "scrutinize", "scrutinise", - "secularize", "secularise", - "sensitized", "sensitised", - "sensitizes", "sensitises", - "sepulchers", "sepulchres", - "serialized", "serialised", - "serializes", "serialises", - "sermonized", "sermonised", - "sermonizes", "sermonises", - "shriveling", "shrivelling", - "signalized", "signalised", - "signalizes", "signalises", - "skepticism", "scepticism", - "socialized", "socialised", - "socializes", "socialises", - "sodomizing", "sodomising", - "solemnized", "solemnised", - "solemnizes", "solemnises", - "specialize", "specialise", - "squirreled", "squirrelled", - "stabilized", "stabilised", - "stabilizer", "stabiliser", - "stabilizes", "stabilises", - "stenciling", "stencilling", - "sterilized", "sterilised", - "sterilizer", "steriliser", - "sterilizes", "sterilises", - "stigmatize", "stigmatise", - "subsidized", "subsidised", - "subsidizer", "subsidiser", - "subsidizes", "subsidises", - "summarized", "summarised", - "summarizes", "summarises", - "symbolized", "symbolised", - "symbolizes", "symbolises", - "sympathize", "sympathise", - "tantalized", "tantalised", - "tantalizes", "tantalises", - "temporized", "temporised", - "temporizes", "temporises", - "tenderized", "tenderised", - "tenderizes", "tenderises", - "terrorized", "terrorised", - "terrorizes", "terrorises", - "theorizing", "theorising", - "traumatize", "traumatise", - "trivialize", "trivialise", - "tyrannized", "tyrannised", - "tyrannizes", "tyrannises", - "unionizing", "unionising", - "unraveling", "unravelling", - "urbanizing", "urbanising", - "utilizable", "utilisable", - "vandalized", "vandalised", - "vandalizes", "vandalises", - "vaporizing", "vaporising", - "verbalized", "verbalised", - "verbalizes", "verbalises", - "victimized", "victimised", - "victimizes", "victimises", - "visualized", "visualised", - "visualizes", "visualises", - "vocalizing", "vocalising", - "vulcanized", "vulcanised", - "vulgarized", "vulgarised", - "vulgarizes", "vulgarises", - "watercolor", "watercolour", - "westernize", "westernise", - "womanizers", "womanisers", - "womanizing", "womanising", - "worshiping", "worshipping", - "agonizing", "agonising", - "airplanes", "aeroplanes", - "amortized", "amortised", - "amortizes", "amortises", - "analyzing", "analysing", - "apologize", "apologise", - "appetizer", "appetiser", - "artifacts", "artefacts", - "baptizing", "baptising", - "bedeviled", "bedevilled", - "behaviors", "behaviours", - "bejeweled", "bejewelled", - "belabored", "belaboured", - "brutalize", "brutalise", - "canalized", "canalised", - "canalizes", "canalises", - "canonized", "canonised", - "canonizes", "canonises", - "carbonize", "carbonise", - "cataloged", "catalogued", - "catalyzed", "catalysed", - "catalyzes", "catalyses", - "cauterize", "cauterise", - "channeled", "channelled", - "checkbook", "chequebook", - "checkered", "chequered", - "chiseling", "chiselling", - "civilized", "civilised", - "civilizes", "civilises", - "clamoring", "clamouring", - "colonized", "colonised", - "colonizer", "coloniser", - "colonizes", "colonises", - "colorants", "colourants", - "colorized", "colourized", - "colorizes", "colourizes", - "colorless", "colourless", - "councilor", "councillor", - "counseled", "counselled", - "counselor", "counsellor", - "criticize", "criticise", - "cudgeling", "cudgelling", - "customize", "customise", - "demonized", "demonised", - "demonizes", "demonises", - "deodorize", "deodorise", - "deputized", "deputised", - "deputizes", "deputises", - "digitized", "digitised", - "digitizes", "digitises", - "discolors", "discolours", - "dishonors", "dishonours", - "dramatize", "dramatise", - "driveling", "drivelling", - "economize", "economise", - "empathize", "empathise", - "emphasize", "emphasise", - "enameling", "enamelling", - "endeavors", "endeavours", - "energized", "energised", - "energizes", "energises", - "enthralls", "enthrals", - "epicenter", "epicentre", - "epitomize", "epitomise", - "equalized", "equalised", - "equalizer", "equaliser", - "equalizes", "equalises", - "eulogized", "eulogised", - "eulogizes", "eulogises", - "factorize", "factorise", - "fantasize", "fantasise", - "favorable", "favourable", - "favorably", "favourably", - "favorites", "favourites", - "feminized", "feminised", - "feminizes", "feminises", - "fertilize", "fertilise", - "finalized", "finalised", - "finalizes", "finalises", - "flavoring", "flavouring", - "formalize", "formalise", - "fossilize", "fossilise", - "funneling", "funnelling", - "galvanize", "galvanise", - "gamboling", "gambolling", - "ghettoize", "ghettoise", - "globalize", "globalise", - "gonorrhea", "gonorrhoea", - "groveling", "grovelling", - "harboring", "harbouring", - "harmonize", "harmonise", - "honorably", "honourably", - "humanized", "humanised", - "humanizes", "humanises", - "hybridize", "hybridise", - "hypnotize", "hypnotise", - "idealized", "idealised", - "idealizes", "idealises", - "idolizing", "idolising", - "immunized", "immunised", - "immunizes", "immunises", - "impaneled", "impanelled", - "imperiled", "imperilled", - "initialed", "initialled", - "italicize", "italicise", - "itemizing", "itemising", - "kilometer", "kilometre", - "legalized", "legalised", - "legalizes", "legalises", - "lionizing", "lionising", - "liquidize", "liquidise", - "localized", "localised", - "localizes", "localises", - "magnetize", "magnetise", - "maneuvers", "manoeuvres", - "marshaled", "marshalled", - "marveling", "marvelling", - "marvelous", "marvellous", - "maximized", "maximised", - "maximizes", "maximises", - "mechanize", "mechanise", - "memorized", "memorised", - "memorizes", "memorises", - "mesmerize", "mesmerise", - "minimized", "minimised", - "minimizes", "minimises", - "mobilized", "mobilised", - "mobilizes", "mobilises", - "modernize", "modernise", - "moldering", "mouldering", - "moralized", "moralised", - "moralizes", "moralises", - "motorized", "motorised", - "mustached", "moustached", - "mustaches", "moustaches", - "neighbors", "neighbours", - "normalize", "normalise", - "optimized", "optimised", - "optimizes", "optimises", - "organized", "organised", - "organizer", "organiser", - "organizes", "organises", - "ostracize", "ostracise", - "oxidizing", "oxidising", - "panelists", "panellists", - "paralyzed", "paralysed", - "paralyzes", "paralyses", - "parceling", "parcelling", - "patronize", "patronise", - "pedophile", "paedophile", - "penalized", "penalised", - "penalizes", "penalises", - "penciling", "pencilling", - "plowshare", "ploughshare", - "polarized", "polarised", - "polarizes", "polarises", - "practiced", "practised", - "pretenses", "pretences", - "privatize", "privatise", - "publicize", "publicise", - "pulverize", "pulverise", - "quarreled", "quarrelled", - "randomize", "randomise", - "realizing", "realising", - "recognize", "recognise", - "refueling", "refuelling", - "remodeled", "remodelled", - "remolding", "remoulding", - "saltpeter", "saltpetre", - "sanitized", "sanitised", - "sanitizes", "sanitises", - "satirized", "satirised", - "satirizes", "satirises", - "sensitize", "sensitise", - "sepulcher", "sepulchre", - "serialize", "serialise", - "sermonize", "sermonise", - "shoveling", "shovelling", - "shriveled", "shrivelled", - "signaling", "signalling", - "signalize", "signalise", - "skeptical", "sceptical", - "sniveling", "snivelling", - "snorkeled", "snorkelled", - "socialize", "socialise", - "sodomized", "sodomised", - "sodomizes", "sodomises", - "solemnize", "solemnise", - "spiraling", "spiralling", - "splendors", "splendours", - "stabilize", "stabilise", - "stenciled", "stencilled", - "sterilize", "sterilise", - "subsidize", "subsidise", - "succoring", "succouring", - "sulfurous", "sulphurous", - "summarize", "summarise", - "swiveling", "swivelling", - "symbolize", "symbolise", - "tantalize", "tantalise", - "temporize", "temporise", - "tenderize", "tenderise", - "terrorize", "terrorise", - "theorized", "theorised", - "theorizes", "theorises", - "travelers", "travellers", - "traveling", "travelling", - "tricolors", "tricolours", - "tunneling", "tunnelling", - "tyrannize", "tyrannise", - "unequaled", "unequalled", - "unionized", "unionised", - "unionizes", "unionises", - "unraveled", "unravelled", - "unrivaled", "unrivalled", - "urbanized", "urbanised", - "urbanizes", "urbanises", - "utilizing", "utilising", - "vandalize", "vandalise", - "vaporized", "vaporised", - "vaporizes", "vaporises", - "verbalize", "verbalise", - "victimize", "victimise", - "visualize", "visualise", - "vocalized", "vocalised", - "vocalizes", "vocalises", - "vulgarize", "vulgarise", - "weaseling", "weaselling", - "womanized", "womanised", - "womanizer", "womaniser", - "womanizes", "womanises", - "worshiped", "worshipped", - "worshiper", "worshipper", - "agonized", "agonised", - "agonizes", "agonises", - "airplane", "aeroplane", - "aluminum", "aluminium", - "amortize", "amortise", - "analyzed", "analysed", - "analyzes", "analyses", - "armorers", "armourers", - "armories", "armouries", - "artifact", "artefact", - "baptized", "baptised", - "baptizes", "baptises", - "behavior", "behaviour", - "behooved", "behoved", - "behooves", "behoves", - "belabors", "belabours", - "calibers", "calibres", - "canalize", "canalise", - "canonize", "canonise", - "catalogs", "catalogues", - "catalyze", "catalyse", - "caviling", "cavilling", - "centered", "centred", - "chiseled", "chiselled", - "civilize", "civilise", - "clamored", "clamoured", - "colonize", "colonise", - "colorant", "colourant", - "coloreds", "coloureds", - "colorful", "colourful", - "coloring", "colouring", - "colorize", "colourize", - "coziness", "cosiness", - "cruelest", "cruellest", - "cudgeled", "cudgelled", - "defenses", "defences", - "demeanor", "demeanour", - "demonize", "demonise", - "deputize", "deputise", - "diarrhea", "diarrhoea", - "digitize", "digitise", - "disfavor", "disfavour", - "dishonor", "dishonour", - "distills", "distils", - "driveled", "drivelled", - "enameled", "enamelled", - "enamored", "enamoured", - "endeavor", "endeavour", - "energize", "energise", - "epaulets", "epaulettes", - "equalize", "equalise", - "estrogen", "oestrogen", - "etiology", "aetiology", - "eulogize", "eulogise", - "favoring", "favouring", - "favorite", "favourite", - "feminize", "feminise", - "finalize", "finalise", - "flavored", "flavoured", - "flutists", "flautists", - "fulfills", "fulfils", - "funneled", "funnelled", - "gamboled", "gambolled", - "graveled", "gravelled", - "groveled", "grovelled", - "grueling", "gruelling", - "harbored", "harboured", - "honoring", "honouring", - "humanize", "humanise", - "humoring", "humouring", - "idealize", "idealise", - "idolized", "idolised", - "idolizes", "idolises", - "immunize", "immunise", - "ionizing", "ionising", - "itemized", "itemised", - "itemizes", "itemises", - "jewelers", "jewellers", - "labeling", "labelling", - "laborers", "labourers", - "laboring", "labouring", - "legalize", "legalise", - "leukemia", "leukaemia", - "levelers", "levellers", - "leveling", "levelling", - "libeling", "libelling", - "libelous", "libellous", - "lionized", "lionised", - "lionizes", "lionises", - "localize", "localise", - "louvered", "louvred", - "maneuver", "manoeuvre", - "marveled", "marvelled", - "maximize", "maximise", - "memorize", "memorise", - "minimize", "minimise", - "mobilize", "mobilise", - "modelers", "modellers", - "modeling", "modelling", - "moldered", "mouldered", - "moldiest", "mouldiest", - "moldings", "mouldings", - "moralize", "moralise", - "mustache", "moustache", - "neighbor", "neighbour", - "odorless", "odourless", - "offenses", "offences", - "optimize", "optimise", - "organize", "organise", - "oxidized", "oxidised", - "oxidizes", "oxidises", - "paneling", "panelling", - "panelist", "panellist", - "paralyze", "paralyse", - "parceled", "parcelled", - "pedaling", "pedalling", - "penalize", "penalise", - "penciled", "pencilled", - "polarize", "polarise", - "pretense", "pretence", - "pummeled", "pummelling", - "raveling", "ravelling", - "realized", "realised", - "realizes", "realises", - "refueled", "refuelled", - "remolded", "remoulded", - "revelers", "revellers", - "reveling", "revelling", - "rivaling", "rivalling", - "sanitize", "sanitise", - "satirize", "satirise", - "savories", "savouries", - "savoring", "savouring", - "scepters", "sceptres", - "shoveled", "shovelled", - "signaled", "signalled", - "skeptics", "sceptics", - "sniveled", "snivelled", - "sodomize", "sodomise", - "specters", "spectres", - "spiraled", "spiralled", - "splendor", "splendour", - "succored", "succoured", - "sulfates", "sulphates", - "sulfides", "sulphides", - "swiveled", "swivelled", - "tasseled", "tasselled", - "theaters", "theatres", - "theorize", "theorise", - "toweling", "towelling", - "traveler", "traveller", - "trialing", "trialling", - "tricolor", "tricolour", - "tunneled", "tunnelled", - "unionize", "unionise", - "unsavory", "unsavoury", - "urbanize", "urbanise", - "utilized", "utilised", - "utilizes", "utilises", - "vaporize", "vaporise", - "vocalize", "vocalise", - "weaseled", "weaselled", - "womanize", "womanise", - "yodeling", "yodelling", - "agonize", "agonise", - "analyze", "analyse", - "appalls", "appals", - "armored", "armoured", - "armorer", "armourer", - "baptize", "baptise", - "behoove", "behove", - "belabor", "belabour", - "beveled", "bevelled", - "caliber", "calibre", - "caroled", "carolled", - "caviled", "cavilled", - "centers", "centres", - "clamors", "clamours", - "clangor", "clangour", - "colored", "coloured", - "coziest", "cosiest", - "crueler", "crueller", - "defense", "defence", - "dialing", "dialling", - "dialogs", "dialogues", - "distill", "distil", - "dueling", "duelling", - "enrolls", "enrols", - "epaulet", "epaulette", - "favored", "favoured", - "flavors", "flavours", - "flutist", "flautist", - "fueling", "fuelling", - "fulfill", "fulfil", - "goiters", "goitres", - "harbors", "harbours", - "honored", "honoured", - "humored", "humoured", - "idolize", "idolise", - "ionized", "ionised", - "ionizes", "ionises", - "itemize", "itemise", - "jeweled", "jewelled", - "jeweler", "jeweller", - "jewelry", "jewellery", - "labeled", "labelled", - "labored", "laboured", - "laborer", "labourer", - "leveled", "levelled", - "leveler", "leveller", - "libeled", "libelled", - "lionize", "lionise", - "louvers", "louvres", - "modeled", "modelled", - "modeler", "modeller", - "molders", "moulders", - "moldier", "mouldier", - "molding", "moulding", - "molting", "moulting", - "offense", "offence", - "oxidize", "oxidise", - "pajamas", "pyjamas", - "paneled", "panelled", - "parlors", "parlours", - "pedaled", "pedalled", - "plowing", "ploughing", - "plowman", "ploughman", - "plowmen", "ploughmen", - "realize", "realise", - "remolds", "remoulds", - "reveled", "revelled", - "reveler", "reveller", - "rivaled", "rivalled", - "rumored", "rumoured", - "saviors", "saviours", - "savored", "savoured", - "scepter", "sceptre", - "skeptic", "sceptic", - "specter", "spectre", - "succors", "succours", - "sulfate", "sulphate", - "sulfide", "sulphide", - "theater", "theatre", - "toweled", "towelled", - "toxemia", "toxaemia", - "trialed", "trialled", - "utilize", "utilise", - "yodeled", "yodelled", - "anemia", "anaemia", - "anemic", "anaemic", - "appall", "appal", - "arbors", "arbours", - "armory", "armoury", - "candor", "candour", - "center", "centre", - "clamor", "clamour", - "colors", "colours", - "cozier", "cosier", - "cozies", "cosies", - "cozily", "cosily", - "dialed", "dialled", - "drafty", "draughty", - "dueled", "duelled", - "favors", "favours", - "fervor", "fervour", - "fibers", "fibres", - "flavor", "flavour", - "fueled", "fuelled", - "goiter", "goitre", - "harbor", "harbour", - "honors", "honours", - "humors", "humours", - "labors", "labours", - "liters", "litres", - "louver", "louvre", - "luster", "lustre", - "meager", "meagre", - "miters", "mitres", - "molded", "moulded", - "molder", "moulder", - "molted", "moulted", - "pajama", "pyjama", - "parlor", "parlour", - "plowed", "ploughed", - "rancor", "rancour", - "remold", "remould", - "rigors", "rigours", - "rumors", "rumours", - "savors", "savours", - "savory", "savoury", - "succor", "succour", - "tumors", "tumours", - "vapors", "vapours", - "aging", "ageing", - "arbor", "arbour", - "ardor", "ardour", - "armor", "armour", - "chili", "chilli", - "color", "colour", - "edema", "edoema", - "favor", "favour", - "fecal", "faecal", - "feces", "faeces", - "fiber", "fibre", - "honor", "honour", - "humor", "humour", - "labor", "labour", - "liter", "litre", - "miter", "mitre", - "molds", "moulds", - "moldy", "mouldy", - "molts", "moults", - "odors", "odours", - "plows", "ploughs", - "rigor", "rigour", - "rumor", "rumour", - "savor", "savour", - "valor", "valour", - "vapor", "vapour", - "vigor", "vigour", - "cozy", "cosy", - "mold", "mould", - "molt", "moult", - "odor", "odour", - "plow", "plough", -} diff --git a/vendor/github.com/fatih/color/.travis.yml b/vendor/github.com/fatih/color/.travis.yml deleted file mode 100644 index 95f8a1ff5c7..00000000000 --- a/vendor/github.com/fatih/color/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: go -go: - - 1.8.x - - tip - diff --git a/vendor/github.com/fatih/color/BUILD b/vendor/github.com/fatih/color/BUILD deleted file mode 100644 index bc7cce1c473..00000000000 --- a/vendor/github.com/fatih/color/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "color.go", - "doc.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/fatih/color", - importpath = "github.com/fatih/color", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/mattn/go-colorable:go_default_library", - "//vendor/github.com/mattn/go-isatty:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/fatih/color/Gopkg.lock b/vendor/github.com/fatih/color/Gopkg.lock deleted file mode 100644 index 7d879e9caf0..00000000000 --- a/vendor/github.com/fatih/color/Gopkg.lock +++ /dev/null @@ -1,27 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - name = "github.com/mattn/go-colorable" - packages = ["."] - revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072" - version = "v0.0.9" - -[[projects]] - name = "github.com/mattn/go-isatty" - packages = ["."] - revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" - version = "v0.0.3" - -[[projects]] - branch = "master" - name = "golang.org/x/sys" - packages = ["unix"] - revision = "37707fdb30a5b38865cfb95e5aab41707daec7fd" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "e8a50671c3cb93ea935bf210b1cd20702876b9d9226129be581ef646d1565cdc" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/fatih/color/Gopkg.toml b/vendor/github.com/fatih/color/Gopkg.toml deleted file mode 100644 index ff1617f71da..00000000000 --- a/vendor/github.com/fatih/color/Gopkg.toml +++ /dev/null @@ -1,30 +0,0 @@ - -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" - - -[[constraint]] - name = "github.com/mattn/go-colorable" - version = "0.0.9" - -[[constraint]] - name = "github.com/mattn/go-isatty" - version = "0.0.3" diff --git a/vendor/github.com/fatih/color/LICENSE.md b/vendor/github.com/fatih/color/LICENSE.md deleted file mode 100644 index 25fdaf639df..00000000000 --- a/vendor/github.com/fatih/color/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Fatih Arslan - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/fatih/color/README.md b/vendor/github.com/fatih/color/README.md deleted file mode 100644 index 3fc95446028..00000000000 --- a/vendor/github.com/fatih/color/README.md +++ /dev/null @@ -1,179 +0,0 @@ -# Color [![GoDoc](https://godoc.org/github.com/fatih/color?status.svg)](https://godoc.org/github.com/fatih/color) [![Build Status](https://img.shields.io/travis/fatih/color.svg?style=flat-square)](https://travis-ci.org/fatih/color) - - - -Color lets you use colorized outputs in terms of [ANSI Escape -Codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors) in Go (Golang). It -has support for Windows too! The API can be used in several ways, pick one that -suits you. - - -![Color](https://i.imgur.com/c1JI0lA.png) - - -## Install - -```bash -go get github.com/fatih/color -``` - -Note that the `vendor` folder is here for stability. Remove the folder if you -already have the dependencies in your GOPATH. - -## Examples - -### Standard colors - -```go -// Print with default helper functions -color.Cyan("Prints text in cyan.") - -// A newline will be appended automatically -color.Blue("Prints %s in blue.", "text") - -// These are using the default foreground colors -color.Red("We have red") -color.Magenta("And many others ..") - -``` - -### Mix and reuse colors - -```go -// Create a new color object -c := color.New(color.FgCyan).Add(color.Underline) -c.Println("Prints cyan text with an underline.") - -// Or just add them to New() -d := color.New(color.FgCyan, color.Bold) -d.Printf("This prints bold cyan %s\n", "too!.") - -// Mix up foreground and background colors, create new mixes! -red := color.New(color.FgRed) - -boldRed := red.Add(color.Bold) -boldRed.Println("This will print text in bold red.") - -whiteBackground := red.Add(color.BgWhite) -whiteBackground.Println("Red text with white background.") -``` - -### Use your own output (io.Writer) - -```go -// Use your own io.Writer output -color.New(color.FgBlue).Fprintln(myWriter, "blue color!") - -blue := color.New(color.FgBlue) -blue.Fprint(writer, "This will print text in blue.") -``` - -### Custom print functions (PrintFunc) - -```go -// Create a custom print function for convenience -red := color.New(color.FgRed).PrintfFunc() -red("Warning") -red("Error: %s", err) - -// Mix up multiple attributes -notice := color.New(color.Bold, color.FgGreen).PrintlnFunc() -notice("Don't forget this...") -``` - -### Custom fprint functions (FprintFunc) - -```go -blue := color.New(FgBlue).FprintfFunc() -blue(myWriter, "important notice: %s", stars) - -// Mix up with multiple attributes -success := color.New(color.Bold, color.FgGreen).FprintlnFunc() -success(myWriter, "Don't forget this...") -``` - -### Insert into noncolor strings (SprintFunc) - -```go -// Create SprintXxx functions to mix strings with other non-colorized strings: -yellow := color.New(color.FgYellow).SprintFunc() -red := color.New(color.FgRed).SprintFunc() -fmt.Printf("This is a %s and this is %s.\n", yellow("warning"), red("error")) - -info := color.New(color.FgWhite, color.BgGreen).SprintFunc() -fmt.Printf("This %s rocks!\n", info("package")) - -// Use helper functions -fmt.Println("This", color.RedString("warning"), "should be not neglected.") -fmt.Printf("%v %v\n", color.GreenString("Info:"), "an important message.") - -// Windows supported too! Just don't forget to change the output to color.Output -fmt.Fprintf(color.Output, "Windows support: %s", color.GreenString("PASS")) -``` - -### Plug into existing code - -```go -// Use handy standard colors -color.Set(color.FgYellow) - -fmt.Println("Existing text will now be in yellow") -fmt.Printf("This one %s\n", "too") - -color.Unset() // Don't forget to unset - -// You can mix up parameters -color.Set(color.FgMagenta, color.Bold) -defer color.Unset() // Use it in your function - -fmt.Println("All text will now be bold magenta.") -``` - -### Disable/Enable color - -There might be a case where you want to explicitly disable/enable color output. the -`go-isatty` package will automatically disable color output for non-tty output streams -(for example if the output were piped directly to `less`) - -`Color` has support to disable/enable colors both globally and for single color -definitions. For example suppose you have a CLI app and a `--no-color` bool flag. You -can easily disable the color output with: - -```go - -var flagNoColor = flag.Bool("no-color", false, "Disable color output") - -if *flagNoColor { - color.NoColor = true // disables colorized output -} -``` - -It also has support for single color definitions (local). You can -disable/enable color output on the fly: - -```go -c := color.New(color.FgCyan) -c.Println("Prints cyan text") - -c.DisableColor() -c.Println("This is printed without any color") - -c.EnableColor() -c.Println("This prints again cyan...") -``` - -## Todo - -* Save/Return previous values -* Evaluate fmt.Formatter interface - - -## Credits - - * [Fatih Arslan](https://github.com/fatih) - * Windows support via @mattn: [colorable](https://github.com/mattn/go-colorable) - -## License - -The MIT License (MIT) - see [`LICENSE.md`](https://github.com/fatih/color/blob/master/LICENSE.md) for more details - diff --git a/vendor/github.com/fatih/color/color.go b/vendor/github.com/fatih/color/color.go deleted file mode 100644 index 91c8e9f0620..00000000000 --- a/vendor/github.com/fatih/color/color.go +++ /dev/null @@ -1,603 +0,0 @@ -package color - -import ( - "fmt" - "io" - "os" - "strconv" - "strings" - "sync" - - "github.com/mattn/go-colorable" - "github.com/mattn/go-isatty" -) - -var ( - // NoColor defines if the output is colorized or not. It's dynamically set to - // false or true based on the stdout's file descriptor referring to a terminal - // or not. This is a global option and affects all colors. For more control - // over each color block use the methods DisableColor() individually. - NoColor = os.Getenv("TERM") == "dumb" || - (!isatty.IsTerminal(os.Stdout.Fd()) && !isatty.IsCygwinTerminal(os.Stdout.Fd())) - - // Output defines the standard output of the print functions. By default - // os.Stdout is used. - Output = colorable.NewColorableStdout() - - // Error defines a color supporting writer for os.Stderr. - Error = colorable.NewColorableStderr() - - // colorsCache is used to reduce the count of created Color objects and - // allows to reuse already created objects with required Attribute. - colorsCache = make(map[Attribute]*Color) - colorsCacheMu sync.Mutex // protects colorsCache -) - -// Color defines a custom color object which is defined by SGR parameters. -type Color struct { - params []Attribute - noColor *bool -} - -// Attribute defines a single SGR Code -type Attribute int - -const escape = "\x1b" - -// Base attributes -const ( - Reset Attribute = iota - Bold - Faint - Italic - Underline - BlinkSlow - BlinkRapid - ReverseVideo - Concealed - CrossedOut -) - -// Foreground text colors -const ( - FgBlack Attribute = iota + 30 - FgRed - FgGreen - FgYellow - FgBlue - FgMagenta - FgCyan - FgWhite -) - -// Foreground Hi-Intensity text colors -const ( - FgHiBlack Attribute = iota + 90 - FgHiRed - FgHiGreen - FgHiYellow - FgHiBlue - FgHiMagenta - FgHiCyan - FgHiWhite -) - -// Background text colors -const ( - BgBlack Attribute = iota + 40 - BgRed - BgGreen - BgYellow - BgBlue - BgMagenta - BgCyan - BgWhite -) - -// Background Hi-Intensity text colors -const ( - BgHiBlack Attribute = iota + 100 - BgHiRed - BgHiGreen - BgHiYellow - BgHiBlue - BgHiMagenta - BgHiCyan - BgHiWhite -) - -// New returns a newly created color object. -func New(value ...Attribute) *Color { - c := &Color{params: make([]Attribute, 0)} - c.Add(value...) - return c -} - -// Set sets the given parameters immediately. It will change the color of -// output with the given SGR parameters until color.Unset() is called. -func Set(p ...Attribute) *Color { - c := New(p...) - c.Set() - return c -} - -// Unset resets all escape attributes and clears the output. Usually should -// be called after Set(). -func Unset() { - if NoColor { - return - } - - fmt.Fprintf(Output, "%s[%dm", escape, Reset) -} - -// Set sets the SGR sequence. -func (c *Color) Set() *Color { - if c.isNoColorSet() { - return c - } - - fmt.Fprintf(Output, c.format()) - return c -} - -func (c *Color) unset() { - if c.isNoColorSet() { - return - } - - Unset() -} - -func (c *Color) setWriter(w io.Writer) *Color { - if c.isNoColorSet() { - return c - } - - fmt.Fprintf(w, c.format()) - return c -} - -func (c *Color) unsetWriter(w io.Writer) { - if c.isNoColorSet() { - return - } - - if NoColor { - return - } - - fmt.Fprintf(w, "%s[%dm", escape, Reset) -} - -// Add is used to chain SGR parameters. Use as many as parameters to combine -// and create custom color objects. Example: Add(color.FgRed, color.Underline). -func (c *Color) Add(value ...Attribute) *Color { - c.params = append(c.params, value...) - return c -} - -func (c *Color) prepend(value Attribute) { - c.params = append(c.params, 0) - copy(c.params[1:], c.params[0:]) - c.params[0] = value -} - -// Fprint formats using the default formats for its operands and writes to w. -// Spaces are added between operands when neither is a string. -// It returns the number of bytes written and any write error encountered. -// On Windows, users should wrap w with colorable.NewColorable() if w is of -// type *os.File. -func (c *Color) Fprint(w io.Writer, a ...interface{}) (n int, err error) { - c.setWriter(w) - defer c.unsetWriter(w) - - return fmt.Fprint(w, a...) -} - -// Print formats using the default formats for its operands and writes to -// standard output. Spaces are added between operands when neither is a -// string. It returns the number of bytes written and any write error -// encountered. This is the standard fmt.Print() method wrapped with the given -// color. -func (c *Color) Print(a ...interface{}) (n int, err error) { - c.Set() - defer c.unset() - - return fmt.Fprint(Output, a...) -} - -// Fprintf formats according to a format specifier and writes to w. -// It returns the number of bytes written and any write error encountered. -// On Windows, users should wrap w with colorable.NewColorable() if w is of -// type *os.File. -func (c *Color) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { - c.setWriter(w) - defer c.unsetWriter(w) - - return fmt.Fprintf(w, format, a...) -} - -// Printf formats according to a format specifier and writes to standard output. -// It returns the number of bytes written and any write error encountered. -// This is the standard fmt.Printf() method wrapped with the given color. -func (c *Color) Printf(format string, a ...interface{}) (n int, err error) { - c.Set() - defer c.unset() - - return fmt.Fprintf(Output, format, a...) -} - -// Fprintln formats using the default formats for its operands and writes to w. -// Spaces are always added between operands and a newline is appended. -// On Windows, users should wrap w with colorable.NewColorable() if w is of -// type *os.File. -func (c *Color) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { - c.setWriter(w) - defer c.unsetWriter(w) - - return fmt.Fprintln(w, a...) -} - -// Println formats using the default formats for its operands and writes to -// standard output. Spaces are always added between operands and a newline is -// appended. It returns the number of bytes written and any write error -// encountered. This is the standard fmt.Print() method wrapped with the given -// color. -func (c *Color) Println(a ...interface{}) (n int, err error) { - c.Set() - defer c.unset() - - return fmt.Fprintln(Output, a...) -} - -// Sprint is just like Print, but returns a string instead of printing it. -func (c *Color) Sprint(a ...interface{}) string { - return c.wrap(fmt.Sprint(a...)) -} - -// Sprintln is just like Println, but returns a string instead of printing it. -func (c *Color) Sprintln(a ...interface{}) string { - return c.wrap(fmt.Sprintln(a...)) -} - -// Sprintf is just like Printf, but returns a string instead of printing it. -func (c *Color) Sprintf(format string, a ...interface{}) string { - return c.wrap(fmt.Sprintf(format, a...)) -} - -// FprintFunc returns a new function that prints the passed arguments as -// colorized with color.Fprint(). -func (c *Color) FprintFunc() func(w io.Writer, a ...interface{}) { - return func(w io.Writer, a ...interface{}) { - c.Fprint(w, a...) - } -} - -// PrintFunc returns a new function that prints the passed arguments as -// colorized with color.Print(). -func (c *Color) PrintFunc() func(a ...interface{}) { - return func(a ...interface{}) { - c.Print(a...) - } -} - -// FprintfFunc returns a new function that prints the passed arguments as -// colorized with color.Fprintf(). -func (c *Color) FprintfFunc() func(w io.Writer, format string, a ...interface{}) { - return func(w io.Writer, format string, a ...interface{}) { - c.Fprintf(w, format, a...) - } -} - -// PrintfFunc returns a new function that prints the passed arguments as -// colorized with color.Printf(). -func (c *Color) PrintfFunc() func(format string, a ...interface{}) { - return func(format string, a ...interface{}) { - c.Printf(format, a...) - } -} - -// FprintlnFunc returns a new function that prints the passed arguments as -// colorized with color.Fprintln(). -func (c *Color) FprintlnFunc() func(w io.Writer, a ...interface{}) { - return func(w io.Writer, a ...interface{}) { - c.Fprintln(w, a...) - } -} - -// PrintlnFunc returns a new function that prints the passed arguments as -// colorized with color.Println(). -func (c *Color) PrintlnFunc() func(a ...interface{}) { - return func(a ...interface{}) { - c.Println(a...) - } -} - -// SprintFunc returns a new function that returns colorized strings for the -// given arguments with fmt.Sprint(). Useful to put into or mix into other -// string. Windows users should use this in conjunction with color.Output, example: -// -// put := New(FgYellow).SprintFunc() -// fmt.Fprintf(color.Output, "This is a %s", put("warning")) -func (c *Color) SprintFunc() func(a ...interface{}) string { - return func(a ...interface{}) string { - return c.wrap(fmt.Sprint(a...)) - } -} - -// SprintfFunc returns a new function that returns colorized strings for the -// given arguments with fmt.Sprintf(). Useful to put into or mix into other -// string. Windows users should use this in conjunction with color.Output. -func (c *Color) SprintfFunc() func(format string, a ...interface{}) string { - return func(format string, a ...interface{}) string { - return c.wrap(fmt.Sprintf(format, a...)) - } -} - -// SprintlnFunc returns a new function that returns colorized strings for the -// given arguments with fmt.Sprintln(). Useful to put into or mix into other -// string. Windows users should use this in conjunction with color.Output. -func (c *Color) SprintlnFunc() func(a ...interface{}) string { - return func(a ...interface{}) string { - return c.wrap(fmt.Sprintln(a...)) - } -} - -// sequence returns a formatted SGR sequence to be plugged into a "\x1b[...m" -// an example output might be: "1;36" -> bold cyan -func (c *Color) sequence() string { - format := make([]string, len(c.params)) - for i, v := range c.params { - format[i] = strconv.Itoa(int(v)) - } - - return strings.Join(format, ";") -} - -// wrap wraps the s string with the colors attributes. The string is ready to -// be printed. -func (c *Color) wrap(s string) string { - if c.isNoColorSet() { - return s - } - - return c.format() + s + c.unformat() -} - -func (c *Color) format() string { - return fmt.Sprintf("%s[%sm", escape, c.sequence()) -} - -func (c *Color) unformat() string { - return fmt.Sprintf("%s[%dm", escape, Reset) -} - -// DisableColor disables the color output. Useful to not change any existing -// code and still being able to output. Can be used for flags like -// "--no-color". To enable back use EnableColor() method. -func (c *Color) DisableColor() { - c.noColor = boolPtr(true) -} - -// EnableColor enables the color output. Use it in conjunction with -// DisableColor(). Otherwise this method has no side effects. -func (c *Color) EnableColor() { - c.noColor = boolPtr(false) -} - -func (c *Color) isNoColorSet() bool { - // check first if we have user setted action - if c.noColor != nil { - return *c.noColor - } - - // if not return the global option, which is disabled by default - return NoColor -} - -// Equals returns a boolean value indicating whether two colors are equal. -func (c *Color) Equals(c2 *Color) bool { - if len(c.params) != len(c2.params) { - return false - } - - for _, attr := range c.params { - if !c2.attrExists(attr) { - return false - } - } - - return true -} - -func (c *Color) attrExists(a Attribute) bool { - for _, attr := range c.params { - if attr == a { - return true - } - } - - return false -} - -func boolPtr(v bool) *bool { - return &v -} - -func getCachedColor(p Attribute) *Color { - colorsCacheMu.Lock() - defer colorsCacheMu.Unlock() - - c, ok := colorsCache[p] - if !ok { - c = New(p) - colorsCache[p] = c - } - - return c -} - -func colorPrint(format string, p Attribute, a ...interface{}) { - c := getCachedColor(p) - - if !strings.HasSuffix(format, "\n") { - format += "\n" - } - - if len(a) == 0 { - c.Print(format) - } else { - c.Printf(format, a...) - } -} - -func colorString(format string, p Attribute, a ...interface{}) string { - c := getCachedColor(p) - - if len(a) == 0 { - return c.SprintFunc()(format) - } - - return c.SprintfFunc()(format, a...) -} - -// Black is a convenient helper function to print with black foreground. A -// newline is appended to format by default. -func Black(format string, a ...interface{}) { colorPrint(format, FgBlack, a...) } - -// Red is a convenient helper function to print with red foreground. A -// newline is appended to format by default. -func Red(format string, a ...interface{}) { colorPrint(format, FgRed, a...) } - -// Green is a convenient helper function to print with green foreground. A -// newline is appended to format by default. -func Green(format string, a ...interface{}) { colorPrint(format, FgGreen, a...) } - -// Yellow is a convenient helper function to print with yellow foreground. -// A newline is appended to format by default. -func Yellow(format string, a ...interface{}) { colorPrint(format, FgYellow, a...) } - -// Blue is a convenient helper function to print with blue foreground. A -// newline is appended to format by default. -func Blue(format string, a ...interface{}) { colorPrint(format, FgBlue, a...) } - -// Magenta is a convenient helper function to print with magenta foreground. -// A newline is appended to format by default. -func Magenta(format string, a ...interface{}) { colorPrint(format, FgMagenta, a...) } - -// Cyan is a convenient helper function to print with cyan foreground. A -// newline is appended to format by default. -func Cyan(format string, a ...interface{}) { colorPrint(format, FgCyan, a...) } - -// White is a convenient helper function to print with white foreground. A -// newline is appended to format by default. -func White(format string, a ...interface{}) { colorPrint(format, FgWhite, a...) } - -// BlackString is a convenient helper function to return a string with black -// foreground. -func BlackString(format string, a ...interface{}) string { return colorString(format, FgBlack, a...) } - -// RedString is a convenient helper function to return a string with red -// foreground. -func RedString(format string, a ...interface{}) string { return colorString(format, FgRed, a...) } - -// GreenString is a convenient helper function to return a string with green -// foreground. -func GreenString(format string, a ...interface{}) string { return colorString(format, FgGreen, a...) } - -// YellowString is a convenient helper function to return a string with yellow -// foreground. -func YellowString(format string, a ...interface{}) string { return colorString(format, FgYellow, a...) } - -// BlueString is a convenient helper function to return a string with blue -// foreground. -func BlueString(format string, a ...interface{}) string { return colorString(format, FgBlue, a...) } - -// MagentaString is a convenient helper function to return a string with magenta -// foreground. -func MagentaString(format string, a ...interface{}) string { - return colorString(format, FgMagenta, a...) -} - -// CyanString is a convenient helper function to return a string with cyan -// foreground. -func CyanString(format string, a ...interface{}) string { return colorString(format, FgCyan, a...) } - -// WhiteString is a convenient helper function to return a string with white -// foreground. -func WhiteString(format string, a ...interface{}) string { return colorString(format, FgWhite, a...) } - -// HiBlack is a convenient helper function to print with hi-intensity black foreground. A -// newline is appended to format by default. -func HiBlack(format string, a ...interface{}) { colorPrint(format, FgHiBlack, a...) } - -// HiRed is a convenient helper function to print with hi-intensity red foreground. A -// newline is appended to format by default. -func HiRed(format string, a ...interface{}) { colorPrint(format, FgHiRed, a...) } - -// HiGreen is a convenient helper function to print with hi-intensity green foreground. A -// newline is appended to format by default. -func HiGreen(format string, a ...interface{}) { colorPrint(format, FgHiGreen, a...) } - -// HiYellow is a convenient helper function to print with hi-intensity yellow foreground. -// A newline is appended to format by default. -func HiYellow(format string, a ...interface{}) { colorPrint(format, FgHiYellow, a...) } - -// HiBlue is a convenient helper function to print with hi-intensity blue foreground. A -// newline is appended to format by default. -func HiBlue(format string, a ...interface{}) { colorPrint(format, FgHiBlue, a...) } - -// HiMagenta is a convenient helper function to print with hi-intensity magenta foreground. -// A newline is appended to format by default. -func HiMagenta(format string, a ...interface{}) { colorPrint(format, FgHiMagenta, a...) } - -// HiCyan is a convenient helper function to print with hi-intensity cyan foreground. A -// newline is appended to format by default. -func HiCyan(format string, a ...interface{}) { colorPrint(format, FgHiCyan, a...) } - -// HiWhite is a convenient helper function to print with hi-intensity white foreground. A -// newline is appended to format by default. -func HiWhite(format string, a ...interface{}) { colorPrint(format, FgHiWhite, a...) } - -// HiBlackString is a convenient helper function to return a string with hi-intensity black -// foreground. -func HiBlackString(format string, a ...interface{}) string { - return colorString(format, FgHiBlack, a...) -} - -// HiRedString is a convenient helper function to return a string with hi-intensity red -// foreground. -func HiRedString(format string, a ...interface{}) string { return colorString(format, FgHiRed, a...) } - -// HiGreenString is a convenient helper function to return a string with hi-intensity green -// foreground. -func HiGreenString(format string, a ...interface{}) string { - return colorString(format, FgHiGreen, a...) -} - -// HiYellowString is a convenient helper function to return a string with hi-intensity yellow -// foreground. -func HiYellowString(format string, a ...interface{}) string { - return colorString(format, FgHiYellow, a...) -} - -// HiBlueString is a convenient helper function to return a string with hi-intensity blue -// foreground. -func HiBlueString(format string, a ...interface{}) string { return colorString(format, FgHiBlue, a...) } - -// HiMagentaString is a convenient helper function to return a string with hi-intensity magenta -// foreground. -func HiMagentaString(format string, a ...interface{}) string { - return colorString(format, FgHiMagenta, a...) -} - -// HiCyanString is a convenient helper function to return a string with hi-intensity cyan -// foreground. -func HiCyanString(format string, a ...interface{}) string { return colorString(format, FgHiCyan, a...) } - -// HiWhiteString is a convenient helper function to return a string with hi-intensity white -// foreground. -func HiWhiteString(format string, a ...interface{}) string { - return colorString(format, FgHiWhite, a...) -} diff --git a/vendor/github.com/fatih/color/doc.go b/vendor/github.com/fatih/color/doc.go deleted file mode 100644 index cf1e96500f4..00000000000 --- a/vendor/github.com/fatih/color/doc.go +++ /dev/null @@ -1,133 +0,0 @@ -/* -Package color is an ANSI color package to output colorized or SGR defined -output to the standard output. The API can be used in several way, pick one -that suits you. - -Use simple and default helper functions with predefined foreground colors: - - color.Cyan("Prints text in cyan.") - - // a newline will be appended automatically - color.Blue("Prints %s in blue.", "text") - - // More default foreground colors.. - color.Red("We have red") - color.Yellow("Yellow color too!") - color.Magenta("And many others ..") - - // Hi-intensity colors - color.HiGreen("Bright green color.") - color.HiBlack("Bright black means gray..") - color.HiWhite("Shiny white color!") - -However there are times where custom color mixes are required. Below are some -examples to create custom color objects and use the print functions of each -separate color object. - - // Create a new color object - c := color.New(color.FgCyan).Add(color.Underline) - c.Println("Prints cyan text with an underline.") - - // Or just add them to New() - d := color.New(color.FgCyan, color.Bold) - d.Printf("This prints bold cyan %s\n", "too!.") - - - // Mix up foreground and background colors, create new mixes! - red := color.New(color.FgRed) - - boldRed := red.Add(color.Bold) - boldRed.Println("This will print text in bold red.") - - whiteBackground := red.Add(color.BgWhite) - whiteBackground.Println("Red text with White background.") - - // Use your own io.Writer output - color.New(color.FgBlue).Fprintln(myWriter, "blue color!") - - blue := color.New(color.FgBlue) - blue.Fprint(myWriter, "This will print text in blue.") - -You can create PrintXxx functions to simplify even more: - - // Create a custom print function for convenient - red := color.New(color.FgRed).PrintfFunc() - red("warning") - red("error: %s", err) - - // Mix up multiple attributes - notice := color.New(color.Bold, color.FgGreen).PrintlnFunc() - notice("don't forget this...") - -You can also FprintXxx functions to pass your own io.Writer: - - blue := color.New(FgBlue).FprintfFunc() - blue(myWriter, "important notice: %s", stars) - - // Mix up with multiple attributes - success := color.New(color.Bold, color.FgGreen).FprintlnFunc() - success(myWriter, don't forget this...") - - -Or create SprintXxx functions to mix strings with other non-colorized strings: - - yellow := New(FgYellow).SprintFunc() - red := New(FgRed).SprintFunc() - - fmt.Printf("this is a %s and this is %s.\n", yellow("warning"), red("error")) - - info := New(FgWhite, BgGreen).SprintFunc() - fmt.Printf("this %s rocks!\n", info("package")) - -Windows support is enabled by default. All Print functions work as intended. -However only for color.SprintXXX functions, user should use fmt.FprintXXX and -set the output to color.Output: - - fmt.Fprintf(color.Output, "Windows support: %s", color.GreenString("PASS")) - - info := New(FgWhite, BgGreen).SprintFunc() - fmt.Fprintf(color.Output, "this %s rocks!\n", info("package")) - -Using with existing code is possible. Just use the Set() method to set the -standard output to the given parameters. That way a rewrite of an existing -code is not required. - - // Use handy standard colors. - color.Set(color.FgYellow) - - fmt.Println("Existing text will be now in Yellow") - fmt.Printf("This one %s\n", "too") - - color.Unset() // don't forget to unset - - // You can mix up parameters - color.Set(color.FgMagenta, color.Bold) - defer color.Unset() // use it in your function - - fmt.Println("All text will be now bold magenta.") - -There might be a case where you want to disable color output (for example to -pipe the standard output of your app to somewhere else). `Color` has support to -disable colors both globally and for single color definition. For example -suppose you have a CLI app and a `--no-color` bool flag. You can easily disable -the color output with: - - var flagNoColor = flag.Bool("no-color", false, "Disable color output") - - if *flagNoColor { - color.NoColor = true // disables colorized output - } - -It also has support for single color definitions (local). You can -disable/enable color output on the fly: - - c := color.New(color.FgCyan) - c.Println("Prints cyan text") - - c.DisableColor() - c.Println("This is printed without any color") - - c.EnableColor() - c.Println("This prints again cyan...") -*/ -package color diff --git a/vendor/github.com/mattn/go-colorable/.travis.yml b/vendor/github.com/mattn/go-colorable/.travis.yml deleted file mode 100644 index 98db8f060bd..00000000000 --- a/vendor/github.com/mattn/go-colorable/.travis.yml +++ /dev/null @@ -1,9 +0,0 @@ -language: go -go: - - tip - -before_install: - - go get github.com/mattn/goveralls - - go get golang.org/x/tools/cmd/cover -script: - - $HOME/gopath/bin/goveralls -repotoken xnXqRGwgW3SXIguzxf90ZSK1GPYZPaGrw diff --git a/vendor/github.com/mattn/go-colorable/BUILD b/vendor/github.com/mattn/go-colorable/BUILD deleted file mode 100644 index cf0203d9c8e..00000000000 --- a/vendor/github.com/mattn/go-colorable/BUILD +++ /dev/null @@ -1,66 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "colorable_others.go", - "colorable_windows.go", - "noncolorable.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/mattn/go-colorable", - importpath = "github.com/mattn/go-colorable", - visibility = ["//visibility:public"], - deps = select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/github.com/mattn/go-isatty:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//vendor/github.com/mattn/go-isatty:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//vendor/github.com/mattn/go-isatty:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//vendor/github.com/mattn/go-isatty:go_default_library", - ], - "@io_bazel_rules_go//go/platform:ios": [ - "//vendor/github.com/mattn/go-isatty:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/github.com/mattn/go-isatty:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//vendor/github.com/mattn/go-isatty:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//vendor/github.com/mattn/go-isatty:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//vendor/github.com/mattn/go-isatty:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//vendor/github.com/mattn/go-isatty:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//vendor/github.com/mattn/go-isatty:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/github.com/mattn/go-isatty:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/mattn/go-colorable/LICENSE b/vendor/github.com/mattn/go-colorable/LICENSE deleted file mode 100644 index 91b5cef30eb..00000000000 --- a/vendor/github.com/mattn/go-colorable/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Yasuhiro Matsumoto - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/github.com/mattn/go-colorable/README.md b/vendor/github.com/mattn/go-colorable/README.md deleted file mode 100644 index 56729a92ca6..00000000000 --- a/vendor/github.com/mattn/go-colorable/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# go-colorable - -[![Godoc Reference](https://godoc.org/github.com/mattn/go-colorable?status.svg)](http://godoc.org/github.com/mattn/go-colorable) -[![Build Status](https://travis-ci.org/mattn/go-colorable.svg?branch=master)](https://travis-ci.org/mattn/go-colorable) -[![Coverage Status](https://coveralls.io/repos/github/mattn/go-colorable/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-colorable?branch=master) -[![Go Report Card](https://goreportcard.com/badge/mattn/go-colorable)](https://goreportcard.com/report/mattn/go-colorable) - -Colorable writer for windows. - -For example, most of logger packages doesn't show colors on windows. (I know we can do it with ansicon. But I don't want.) -This package is possible to handle escape sequence for ansi color on windows. - -## Too Bad! - -![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/bad.png) - - -## So Good! - -![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/good.png) - -## Usage - -```go -logrus.SetFormatter(&logrus.TextFormatter{ForceColors: true}) -logrus.SetOutput(colorable.NewColorableStdout()) - -logrus.Info("succeeded") -logrus.Warn("not correct") -logrus.Error("something error") -logrus.Fatal("panic") -``` - -You can compile above code on non-windows OSs. - -## Installation - -``` -$ go get github.com/mattn/go-colorable -``` - -# License - -MIT - -# Author - -Yasuhiro Matsumoto (a.k.a mattn) diff --git a/vendor/github.com/mattn/go-colorable/colorable_appengine.go b/vendor/github.com/mattn/go-colorable/colorable_appengine.go deleted file mode 100644 index 1f28d773d74..00000000000 --- a/vendor/github.com/mattn/go-colorable/colorable_appengine.go +++ /dev/null @@ -1,29 +0,0 @@ -// +build appengine - -package colorable - -import ( - "io" - "os" - - _ "github.com/mattn/go-isatty" -) - -// NewColorable return new instance of Writer which handle escape sequence. -func NewColorable(file *os.File) io.Writer { - if file == nil { - panic("nil passed instead of *os.File to NewColorable()") - } - - return file -} - -// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. -func NewColorableStdout() io.Writer { - return os.Stdout -} - -// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. -func NewColorableStderr() io.Writer { - return os.Stderr -} diff --git a/vendor/github.com/mattn/go-colorable/colorable_others.go b/vendor/github.com/mattn/go-colorable/colorable_others.go deleted file mode 100644 index 887f203dc7f..00000000000 --- a/vendor/github.com/mattn/go-colorable/colorable_others.go +++ /dev/null @@ -1,30 +0,0 @@ -// +build !windows -// +build !appengine - -package colorable - -import ( - "io" - "os" - - _ "github.com/mattn/go-isatty" -) - -// NewColorable return new instance of Writer which handle escape sequence. -func NewColorable(file *os.File) io.Writer { - if file == nil { - panic("nil passed instead of *os.File to NewColorable()") - } - - return file -} - -// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. -func NewColorableStdout() io.Writer { - return os.Stdout -} - -// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. -func NewColorableStderr() io.Writer { - return os.Stderr -} diff --git a/vendor/github.com/mattn/go-colorable/colorable_windows.go b/vendor/github.com/mattn/go-colorable/colorable_windows.go deleted file mode 100644 index e17a5474e98..00000000000 --- a/vendor/github.com/mattn/go-colorable/colorable_windows.go +++ /dev/null @@ -1,884 +0,0 @@ -// +build windows -// +build !appengine - -package colorable - -import ( - "bytes" - "io" - "math" - "os" - "strconv" - "strings" - "syscall" - "unsafe" - - "github.com/mattn/go-isatty" -) - -const ( - foregroundBlue = 0x1 - foregroundGreen = 0x2 - foregroundRed = 0x4 - foregroundIntensity = 0x8 - foregroundMask = (foregroundRed | foregroundBlue | foregroundGreen | foregroundIntensity) - backgroundBlue = 0x10 - backgroundGreen = 0x20 - backgroundRed = 0x40 - backgroundIntensity = 0x80 - backgroundMask = (backgroundRed | backgroundBlue | backgroundGreen | backgroundIntensity) -) - -type wchar uint16 -type short int16 -type dword uint32 -type word uint16 - -type coord struct { - x short - y short -} - -type smallRect struct { - left short - top short - right short - bottom short -} - -type consoleScreenBufferInfo struct { - size coord - cursorPosition coord - attributes word - window smallRect - maximumWindowSize coord -} - -type consoleCursorInfo struct { - size dword - visible int32 -} - -var ( - kernel32 = syscall.NewLazyDLL("kernel32.dll") - procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo") - procSetConsoleTextAttribute = kernel32.NewProc("SetConsoleTextAttribute") - procSetConsoleCursorPosition = kernel32.NewProc("SetConsoleCursorPosition") - procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW") - procFillConsoleOutputAttribute = kernel32.NewProc("FillConsoleOutputAttribute") - procGetConsoleCursorInfo = kernel32.NewProc("GetConsoleCursorInfo") - procSetConsoleCursorInfo = kernel32.NewProc("SetConsoleCursorInfo") - procSetConsoleTitle = kernel32.NewProc("SetConsoleTitleW") -) - -// Writer provide colorable Writer to the console -type Writer struct { - out io.Writer - handle syscall.Handle - oldattr word - oldpos coord -} - -// NewColorable return new instance of Writer which handle escape sequence from File. -func NewColorable(file *os.File) io.Writer { - if file == nil { - panic("nil passed instead of *os.File to NewColorable()") - } - - if isatty.IsTerminal(file.Fd()) { - var csbi consoleScreenBufferInfo - handle := syscall.Handle(file.Fd()) - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - return &Writer{out: file, handle: handle, oldattr: csbi.attributes, oldpos: coord{0, 0}} - } - return file -} - -// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. -func NewColorableStdout() io.Writer { - return NewColorable(os.Stdout) -} - -// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. -func NewColorableStderr() io.Writer { - return NewColorable(os.Stderr) -} - -var color256 = map[int]int{ - 0: 0x000000, - 1: 0x800000, - 2: 0x008000, - 3: 0x808000, - 4: 0x000080, - 5: 0x800080, - 6: 0x008080, - 7: 0xc0c0c0, - 8: 0x808080, - 9: 0xff0000, - 10: 0x00ff00, - 11: 0xffff00, - 12: 0x0000ff, - 13: 0xff00ff, - 14: 0x00ffff, - 15: 0xffffff, - 16: 0x000000, - 17: 0x00005f, - 18: 0x000087, - 19: 0x0000af, - 20: 0x0000d7, - 21: 0x0000ff, - 22: 0x005f00, - 23: 0x005f5f, - 24: 0x005f87, - 25: 0x005faf, - 26: 0x005fd7, - 27: 0x005fff, - 28: 0x008700, - 29: 0x00875f, - 30: 0x008787, - 31: 0x0087af, - 32: 0x0087d7, - 33: 0x0087ff, - 34: 0x00af00, - 35: 0x00af5f, - 36: 0x00af87, - 37: 0x00afaf, - 38: 0x00afd7, - 39: 0x00afff, - 40: 0x00d700, - 41: 0x00d75f, - 42: 0x00d787, - 43: 0x00d7af, - 44: 0x00d7d7, - 45: 0x00d7ff, - 46: 0x00ff00, - 47: 0x00ff5f, - 48: 0x00ff87, - 49: 0x00ffaf, - 50: 0x00ffd7, - 51: 0x00ffff, - 52: 0x5f0000, - 53: 0x5f005f, - 54: 0x5f0087, - 55: 0x5f00af, - 56: 0x5f00d7, - 57: 0x5f00ff, - 58: 0x5f5f00, - 59: 0x5f5f5f, - 60: 0x5f5f87, - 61: 0x5f5faf, - 62: 0x5f5fd7, - 63: 0x5f5fff, - 64: 0x5f8700, - 65: 0x5f875f, - 66: 0x5f8787, - 67: 0x5f87af, - 68: 0x5f87d7, - 69: 0x5f87ff, - 70: 0x5faf00, - 71: 0x5faf5f, - 72: 0x5faf87, - 73: 0x5fafaf, - 74: 0x5fafd7, - 75: 0x5fafff, - 76: 0x5fd700, - 77: 0x5fd75f, - 78: 0x5fd787, - 79: 0x5fd7af, - 80: 0x5fd7d7, - 81: 0x5fd7ff, - 82: 0x5fff00, - 83: 0x5fff5f, - 84: 0x5fff87, - 85: 0x5fffaf, - 86: 0x5fffd7, - 87: 0x5fffff, - 88: 0x870000, - 89: 0x87005f, - 90: 0x870087, - 91: 0x8700af, - 92: 0x8700d7, - 93: 0x8700ff, - 94: 0x875f00, - 95: 0x875f5f, - 96: 0x875f87, - 97: 0x875faf, - 98: 0x875fd7, - 99: 0x875fff, - 100: 0x878700, - 101: 0x87875f, - 102: 0x878787, - 103: 0x8787af, - 104: 0x8787d7, - 105: 0x8787ff, - 106: 0x87af00, - 107: 0x87af5f, - 108: 0x87af87, - 109: 0x87afaf, - 110: 0x87afd7, - 111: 0x87afff, - 112: 0x87d700, - 113: 0x87d75f, - 114: 0x87d787, - 115: 0x87d7af, - 116: 0x87d7d7, - 117: 0x87d7ff, - 118: 0x87ff00, - 119: 0x87ff5f, - 120: 0x87ff87, - 121: 0x87ffaf, - 122: 0x87ffd7, - 123: 0x87ffff, - 124: 0xaf0000, - 125: 0xaf005f, - 126: 0xaf0087, - 127: 0xaf00af, - 128: 0xaf00d7, - 129: 0xaf00ff, - 130: 0xaf5f00, - 131: 0xaf5f5f, - 132: 0xaf5f87, - 133: 0xaf5faf, - 134: 0xaf5fd7, - 135: 0xaf5fff, - 136: 0xaf8700, - 137: 0xaf875f, - 138: 0xaf8787, - 139: 0xaf87af, - 140: 0xaf87d7, - 141: 0xaf87ff, - 142: 0xafaf00, - 143: 0xafaf5f, - 144: 0xafaf87, - 145: 0xafafaf, - 146: 0xafafd7, - 147: 0xafafff, - 148: 0xafd700, - 149: 0xafd75f, - 150: 0xafd787, - 151: 0xafd7af, - 152: 0xafd7d7, - 153: 0xafd7ff, - 154: 0xafff00, - 155: 0xafff5f, - 156: 0xafff87, - 157: 0xafffaf, - 158: 0xafffd7, - 159: 0xafffff, - 160: 0xd70000, - 161: 0xd7005f, - 162: 0xd70087, - 163: 0xd700af, - 164: 0xd700d7, - 165: 0xd700ff, - 166: 0xd75f00, - 167: 0xd75f5f, - 168: 0xd75f87, - 169: 0xd75faf, - 170: 0xd75fd7, - 171: 0xd75fff, - 172: 0xd78700, - 173: 0xd7875f, - 174: 0xd78787, - 175: 0xd787af, - 176: 0xd787d7, - 177: 0xd787ff, - 178: 0xd7af00, - 179: 0xd7af5f, - 180: 0xd7af87, - 181: 0xd7afaf, - 182: 0xd7afd7, - 183: 0xd7afff, - 184: 0xd7d700, - 185: 0xd7d75f, - 186: 0xd7d787, - 187: 0xd7d7af, - 188: 0xd7d7d7, - 189: 0xd7d7ff, - 190: 0xd7ff00, - 191: 0xd7ff5f, - 192: 0xd7ff87, - 193: 0xd7ffaf, - 194: 0xd7ffd7, - 195: 0xd7ffff, - 196: 0xff0000, - 197: 0xff005f, - 198: 0xff0087, - 199: 0xff00af, - 200: 0xff00d7, - 201: 0xff00ff, - 202: 0xff5f00, - 203: 0xff5f5f, - 204: 0xff5f87, - 205: 0xff5faf, - 206: 0xff5fd7, - 207: 0xff5fff, - 208: 0xff8700, - 209: 0xff875f, - 210: 0xff8787, - 211: 0xff87af, - 212: 0xff87d7, - 213: 0xff87ff, - 214: 0xffaf00, - 215: 0xffaf5f, - 216: 0xffaf87, - 217: 0xffafaf, - 218: 0xffafd7, - 219: 0xffafff, - 220: 0xffd700, - 221: 0xffd75f, - 222: 0xffd787, - 223: 0xffd7af, - 224: 0xffd7d7, - 225: 0xffd7ff, - 226: 0xffff00, - 227: 0xffff5f, - 228: 0xffff87, - 229: 0xffffaf, - 230: 0xffffd7, - 231: 0xffffff, - 232: 0x080808, - 233: 0x121212, - 234: 0x1c1c1c, - 235: 0x262626, - 236: 0x303030, - 237: 0x3a3a3a, - 238: 0x444444, - 239: 0x4e4e4e, - 240: 0x585858, - 241: 0x626262, - 242: 0x6c6c6c, - 243: 0x767676, - 244: 0x808080, - 245: 0x8a8a8a, - 246: 0x949494, - 247: 0x9e9e9e, - 248: 0xa8a8a8, - 249: 0xb2b2b2, - 250: 0xbcbcbc, - 251: 0xc6c6c6, - 252: 0xd0d0d0, - 253: 0xdadada, - 254: 0xe4e4e4, - 255: 0xeeeeee, -} - -// `\033]0;TITLESTR\007` -func doTitleSequence(er *bytes.Reader) error { - var c byte - var err error - - c, err = er.ReadByte() - if err != nil { - return err - } - if c != '0' && c != '2' { - return nil - } - c, err = er.ReadByte() - if err != nil { - return err - } - if c != ';' { - return nil - } - title := make([]byte, 0, 80) - for { - c, err = er.ReadByte() - if err != nil { - return err - } - if c == 0x07 || c == '\n' { - break - } - title = append(title, c) - } - if len(title) > 0 { - title8, err := syscall.UTF16PtrFromString(string(title)) - if err == nil { - procSetConsoleTitle.Call(uintptr(unsafe.Pointer(title8))) - } - } - return nil -} - -// Write write data on console -func (w *Writer) Write(data []byte) (n int, err error) { - var csbi consoleScreenBufferInfo - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - - er := bytes.NewReader(data) - var bw [1]byte -loop: - for { - c1, err := er.ReadByte() - if err != nil { - break loop - } - if c1 != 0x1b { - bw[0] = c1 - w.out.Write(bw[:]) - continue - } - c2, err := er.ReadByte() - if err != nil { - break loop - } - - if c2 == ']' { - if err := doTitleSequence(er); err != nil { - break loop - } - continue - } - if c2 != 0x5b { - continue - } - - var buf bytes.Buffer - var m byte - for { - c, err := er.ReadByte() - if err != nil { - break loop - } - if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' { - m = c - break - } - buf.Write([]byte(string(c))) - } - - switch m { - case 'A': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.y -= short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'B': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.y += short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'C': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x += short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'D': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x -= short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'E': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x = 0 - csbi.cursorPosition.y += short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'F': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x = 0 - csbi.cursorPosition.y -= short(n) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'G': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x = short(n - 1) - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'H', 'f': - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - if buf.Len() > 0 { - token := strings.Split(buf.String(), ";") - switch len(token) { - case 1: - n1, err := strconv.Atoi(token[0]) - if err != nil { - continue - } - csbi.cursorPosition.y = short(n1 - 1) - case 2: - n1, err := strconv.Atoi(token[0]) - if err != nil { - continue - } - n2, err := strconv.Atoi(token[1]) - if err != nil { - continue - } - csbi.cursorPosition.x = short(n2 - 1) - csbi.cursorPosition.y = short(n1 - 1) - } - } else { - csbi.cursorPosition.y = 0 - } - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'J': - n := 0 - if buf.Len() > 0 { - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - } - var count, written dword - var cursor coord - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - switch n { - case 0: - cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} - count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.size.y-csbi.cursorPosition.y)*csbi.size.x) - case 1: - cursor = coord{x: csbi.window.left, y: csbi.window.top} - count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.window.top-csbi.cursorPosition.y)*csbi.size.x) - case 2: - cursor = coord{x: csbi.window.left, y: csbi.window.top} - count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.size.y-csbi.cursorPosition.y)*csbi.size.x) - } - procFillConsoleOutputCharacter.Call(uintptr(w.handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - procFillConsoleOutputAttribute.Call(uintptr(w.handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - case 'K': - n := 0 - if buf.Len() > 0 { - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - } - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - var cursor coord - var count, written dword - switch n { - case 0: - cursor = coord{x: csbi.cursorPosition.x + 1, y: csbi.cursorPosition.y} - count = dword(csbi.size.x - csbi.cursorPosition.x - 1) - case 1: - cursor = coord{x: csbi.window.left, y: csbi.window.top + csbi.cursorPosition.y} - count = dword(csbi.size.x - csbi.cursorPosition.x) - case 2: - cursor = coord{x: csbi.window.left, y: csbi.window.top + csbi.cursorPosition.y} - count = dword(csbi.size.x) - } - procFillConsoleOutputCharacter.Call(uintptr(w.handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - procFillConsoleOutputAttribute.Call(uintptr(w.handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - case 'm': - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - attr := csbi.attributes - cs := buf.String() - if cs == "" { - procSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(w.oldattr)) - continue - } - token := strings.Split(cs, ";") - for i := 0; i < len(token); i++ { - ns := token[i] - if n, err = strconv.Atoi(ns); err == nil { - switch { - case n == 0 || n == 100: - attr = w.oldattr - case 1 <= n && n <= 5: - attr |= foregroundIntensity - case n == 7: - attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4) - case n == 22 || n == 25: - attr |= foregroundIntensity - case n == 27: - attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4) - case 30 <= n && n <= 37: - attr &= backgroundMask - if (n-30)&1 != 0 { - attr |= foregroundRed - } - if (n-30)&2 != 0 { - attr |= foregroundGreen - } - if (n-30)&4 != 0 { - attr |= foregroundBlue - } - case n == 38: // set foreground color. - if i < len(token)-2 && (token[i+1] == "5" || token[i+1] == "05") { - if n256, err := strconv.Atoi(token[i+2]); err == nil { - if n256foreAttr == nil { - n256setup() - } - attr &= backgroundMask - attr |= n256foreAttr[n256] - i += 2 - } - } else { - attr = attr & (w.oldattr & backgroundMask) - } - case n == 39: // reset foreground color. - attr &= backgroundMask - attr |= w.oldattr & foregroundMask - case 40 <= n && n <= 47: - attr &= foregroundMask - if (n-40)&1 != 0 { - attr |= backgroundRed - } - if (n-40)&2 != 0 { - attr |= backgroundGreen - } - if (n-40)&4 != 0 { - attr |= backgroundBlue - } - case n == 48: // set background color. - if i < len(token)-2 && token[i+1] == "5" { - if n256, err := strconv.Atoi(token[i+2]); err == nil { - if n256backAttr == nil { - n256setup() - } - attr &= foregroundMask - attr |= n256backAttr[n256] - i += 2 - } - } else { - attr = attr & (w.oldattr & foregroundMask) - } - case n == 49: // reset foreground color. - attr &= foregroundMask - attr |= w.oldattr & backgroundMask - case 90 <= n && n <= 97: - attr = (attr & backgroundMask) - attr |= foregroundIntensity - if (n-90)&1 != 0 { - attr |= foregroundRed - } - if (n-90)&2 != 0 { - attr |= foregroundGreen - } - if (n-90)&4 != 0 { - attr |= foregroundBlue - } - case 100 <= n && n <= 107: - attr = (attr & foregroundMask) - attr |= backgroundIntensity - if (n-100)&1 != 0 { - attr |= backgroundRed - } - if (n-100)&2 != 0 { - attr |= backgroundGreen - } - if (n-100)&4 != 0 { - attr |= backgroundBlue - } - } - procSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(attr)) - } - } - case 'h': - var ci consoleCursorInfo - cs := buf.String() - if cs == "5>" { - procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) - ci.visible = 0 - procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) - } else if cs == "?25" { - procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) - ci.visible = 1 - procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) - } - case 'l': - var ci consoleCursorInfo - cs := buf.String() - if cs == "5>" { - procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) - ci.visible = 1 - procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) - } else if cs == "?25" { - procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) - ci.visible = 0 - procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci))) - } - case 's': - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - w.oldpos = csbi.cursorPosition - case 'u': - procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&w.oldpos))) - } - } - - return len(data), nil -} - -type consoleColor struct { - rgb int - red bool - green bool - blue bool - intensity bool -} - -func (c consoleColor) foregroundAttr() (attr word) { - if c.red { - attr |= foregroundRed - } - if c.green { - attr |= foregroundGreen - } - if c.blue { - attr |= foregroundBlue - } - if c.intensity { - attr |= foregroundIntensity - } - return -} - -func (c consoleColor) backgroundAttr() (attr word) { - if c.red { - attr |= backgroundRed - } - if c.green { - attr |= backgroundGreen - } - if c.blue { - attr |= backgroundBlue - } - if c.intensity { - attr |= backgroundIntensity - } - return -} - -var color16 = []consoleColor{ - {0x000000, false, false, false, false}, - {0x000080, false, false, true, false}, - {0x008000, false, true, false, false}, - {0x008080, false, true, true, false}, - {0x800000, true, false, false, false}, - {0x800080, true, false, true, false}, - {0x808000, true, true, false, false}, - {0xc0c0c0, true, true, true, false}, - {0x808080, false, false, false, true}, - {0x0000ff, false, false, true, true}, - {0x00ff00, false, true, false, true}, - {0x00ffff, false, true, true, true}, - {0xff0000, true, false, false, true}, - {0xff00ff, true, false, true, true}, - {0xffff00, true, true, false, true}, - {0xffffff, true, true, true, true}, -} - -type hsv struct { - h, s, v float32 -} - -func (a hsv) dist(b hsv) float32 { - dh := a.h - b.h - switch { - case dh > 0.5: - dh = 1 - dh - case dh < -0.5: - dh = -1 - dh - } - ds := a.s - b.s - dv := a.v - b.v - return float32(math.Sqrt(float64(dh*dh + ds*ds + dv*dv))) -} - -func toHSV(rgb int) hsv { - r, g, b := float32((rgb&0xFF0000)>>16)/256.0, - float32((rgb&0x00FF00)>>8)/256.0, - float32(rgb&0x0000FF)/256.0 - min, max := minmax3f(r, g, b) - h := max - min - if h > 0 { - if max == r { - h = (g - b) / h - if h < 0 { - h += 6 - } - } else if max == g { - h = 2 + (b-r)/h - } else { - h = 4 + (r-g)/h - } - } - h /= 6.0 - s := max - min - if max != 0 { - s /= max - } - v := max - return hsv{h: h, s: s, v: v} -} - -type hsvTable []hsv - -func toHSVTable(rgbTable []consoleColor) hsvTable { - t := make(hsvTable, len(rgbTable)) - for i, c := range rgbTable { - t[i] = toHSV(c.rgb) - } - return t -} - -func (t hsvTable) find(rgb int) consoleColor { - hsv := toHSV(rgb) - n := 7 - l := float32(5.0) - for i, p := range t { - d := hsv.dist(p) - if d < l { - l, n = d, i - } - } - return color16[n] -} - -func minmax3f(a, b, c float32) (min, max float32) { - if a < b { - if b < c { - return a, c - } else if a < c { - return a, b - } else { - return c, b - } - } else { - if a < c { - return b, c - } else if b < c { - return b, a - } else { - return c, a - } - } -} - -var n256foreAttr []word -var n256backAttr []word - -func n256setup() { - n256foreAttr = make([]word, 256) - n256backAttr = make([]word, 256) - t := toHSVTable(color16) - for i, rgb := range color256 { - c := t.find(rgb) - n256foreAttr[i] = c.foregroundAttr() - n256backAttr[i] = c.backgroundAttr() - } -} diff --git a/vendor/github.com/mattn/go-colorable/noncolorable.go b/vendor/github.com/mattn/go-colorable/noncolorable.go deleted file mode 100644 index 9721e16f4bf..00000000000 --- a/vendor/github.com/mattn/go-colorable/noncolorable.go +++ /dev/null @@ -1,55 +0,0 @@ -package colorable - -import ( - "bytes" - "io" -) - -// NonColorable hold writer but remove escape sequence. -type NonColorable struct { - out io.Writer -} - -// NewNonColorable return new instance of Writer which remove escape sequence from Writer. -func NewNonColorable(w io.Writer) io.Writer { - return &NonColorable{out: w} -} - -// Write write data on console -func (w *NonColorable) Write(data []byte) (n int, err error) { - er := bytes.NewReader(data) - var bw [1]byte -loop: - for { - c1, err := er.ReadByte() - if err != nil { - break loop - } - if c1 != 0x1b { - bw[0] = c1 - w.out.Write(bw[:]) - continue - } - c2, err := er.ReadByte() - if err != nil { - break loop - } - if c2 != 0x5b { - continue - } - - var buf bytes.Buffer - for { - c, err := er.ReadByte() - if err != nil { - break loop - } - if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' { - break - } - buf.Write([]byte(string(c))) - } - } - - return len(data), nil -} diff --git a/vendor/github.com/mattn/go-isatty/.travis.yml b/vendor/github.com/mattn/go-isatty/.travis.yml deleted file mode 100644 index 5597e026ddf..00000000000 --- a/vendor/github.com/mattn/go-isatty/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: go -go: - - tip - -os: - - linux - - osx - -before_install: - - go get github.com/mattn/goveralls - - go get golang.org/x/tools/cmd/cover -script: - - $HOME/gopath/bin/goveralls -repotoken 3gHdORO5k5ziZcWMBxnd9LrMZaJs8m9x5 diff --git a/vendor/github.com/mattn/go-isatty/BUILD b/vendor/github.com/mattn/go-isatty/BUILD deleted file mode 100644 index 8c3b826f60c..00000000000 --- a/vendor/github.com/mattn/go-isatty/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "isatty_android.go", - "isatty_bsd.go", - "isatty_others.go", - "isatty_solaris.go", - "isatty_tcgets.go", - "isatty_windows.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/mattn/go-isatty", - importpath = "github.com/mattn/go-isatty", - visibility = ["//visibility:public"], - deps = select({ - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/mattn/go-isatty/LICENSE b/vendor/github.com/mattn/go-isatty/LICENSE deleted file mode 100644 index 65dc692b6b1..00000000000 --- a/vendor/github.com/mattn/go-isatty/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -Copyright (c) Yasuhiro MATSUMOTO - -MIT License (Expat) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/mattn/go-isatty/README.md b/vendor/github.com/mattn/go-isatty/README.md deleted file mode 100644 index 1e69004bb03..00000000000 --- a/vendor/github.com/mattn/go-isatty/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# go-isatty - -[![Godoc Reference](https://godoc.org/github.com/mattn/go-isatty?status.svg)](http://godoc.org/github.com/mattn/go-isatty) -[![Build Status](https://travis-ci.org/mattn/go-isatty.svg?branch=master)](https://travis-ci.org/mattn/go-isatty) -[![Coverage Status](https://coveralls.io/repos/github/mattn/go-isatty/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-isatty?branch=master) -[![Go Report Card](https://goreportcard.com/badge/mattn/go-isatty)](https://goreportcard.com/report/mattn/go-isatty) - -isatty for golang - -## Usage - -```go -package main - -import ( - "fmt" - "github.com/mattn/go-isatty" - "os" -) - -func main() { - if isatty.IsTerminal(os.Stdout.Fd()) { - fmt.Println("Is Terminal") - } else if isatty.IsCygwinTerminal(os.Stdout.Fd()) { - fmt.Println("Is Cygwin/MSYS2 Terminal") - } else { - fmt.Println("Is Not Terminal") - } -} -``` - -## Installation - -``` -$ go get github.com/mattn/go-isatty -``` - -## License - -MIT - -## Author - -Yasuhiro Matsumoto (a.k.a mattn) - -## Thanks - -* k-takata: base idea for IsCygwinTerminal - - https://github.com/k-takata/go-iscygpty diff --git a/vendor/github.com/mattn/go-isatty/doc.go b/vendor/github.com/mattn/go-isatty/doc.go deleted file mode 100644 index 17d4f90ebcc..00000000000 --- a/vendor/github.com/mattn/go-isatty/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package isatty implements interface to isatty -package isatty diff --git a/vendor/github.com/mattn/go-isatty/go.mod b/vendor/github.com/mattn/go-isatty/go.mod deleted file mode 100644 index 3b9b9abfb99..00000000000 --- a/vendor/github.com/mattn/go-isatty/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/mattn/go-isatty - -require golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a diff --git a/vendor/github.com/mattn/go-isatty/go.sum b/vendor/github.com/mattn/go-isatty/go.sum deleted file mode 100644 index b1bd14d21de..00000000000 --- a/vendor/github.com/mattn/go-isatty/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/mattn/go-isatty/isatty_android.go b/vendor/github.com/mattn/go-isatty/isatty_android.go deleted file mode 100644 index d3567cb5bf2..00000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_android.go +++ /dev/null @@ -1,23 +0,0 @@ -// +build android - -package isatty - -import ( - "syscall" - "unsafe" -) - -const ioctlReadTermios = syscall.TCGETS - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_bsd.go b/vendor/github.com/mattn/go-isatty/isatty_bsd.go deleted file mode 100644 index 07e93039dbe..00000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_bsd.go +++ /dev/null @@ -1,24 +0,0 @@ -// +build darwin freebsd openbsd netbsd dragonfly -// +build !appengine - -package isatty - -import ( - "syscall" - "unsafe" -) - -const ioctlReadTermios = syscall.TIOCGETA - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_others.go b/vendor/github.com/mattn/go-isatty/isatty_others.go deleted file mode 100644 index ff714a37615..00000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_others.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build appengine js nacl - -package isatty - -// IsTerminal returns true if the file descriptor is terminal which -// is always false on js and appengine classic which is a sandboxed PaaS. -func IsTerminal(fd uintptr) bool { - return false -} - -// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_solaris.go b/vendor/github.com/mattn/go-isatty/isatty_solaris.go deleted file mode 100644 index bdd5c79a07f..00000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_solaris.go +++ /dev/null @@ -1,22 +0,0 @@ -// +build solaris -// +build !appengine - -package isatty - -import ( - "golang.org/x/sys/unix" -) - -// IsTerminal returns true if the given file descriptor is a terminal. -// see: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libbc/libc/gen/common/isatty.c -func IsTerminal(fd uintptr) bool { - var termio unix.Termio - err := unix.IoctlSetTermio(int(fd), unix.TCGETA, &termio) - return err == nil -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_tcgets.go b/vendor/github.com/mattn/go-isatty/isatty_tcgets.go deleted file mode 100644 index 453b025d0df..00000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_tcgets.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build linux aix -// +build !appengine -// +build !android - -package isatty - -import "golang.org/x/sys/unix" - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - _, err := unix.IoctlGetTermios(int(fd), unix.TCGETS) - return err == nil -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_windows.go b/vendor/github.com/mattn/go-isatty/isatty_windows.go deleted file mode 100644 index af51cbcaa48..00000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_windows.go +++ /dev/null @@ -1,94 +0,0 @@ -// +build windows -// +build !appengine - -package isatty - -import ( - "strings" - "syscall" - "unicode/utf16" - "unsafe" -) - -const ( - fileNameInfo uintptr = 2 - fileTypePipe = 3 -) - -var ( - kernel32 = syscall.NewLazyDLL("kernel32.dll") - procGetConsoleMode = kernel32.NewProc("GetConsoleMode") - procGetFileInformationByHandleEx = kernel32.NewProc("GetFileInformationByHandleEx") - procGetFileType = kernel32.NewProc("GetFileType") -) - -func init() { - // Check if GetFileInformationByHandleEx is available. - if procGetFileInformationByHandleEx.Find() != nil { - procGetFileInformationByHandleEx = nil - } -} - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var st uint32 - r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, fd, uintptr(unsafe.Pointer(&st)), 0) - return r != 0 && e == 0 -} - -// Check pipe name is used for cygwin/msys2 pty. -// Cygwin/MSYS2 PTY has a name like: -// \{cygwin,msys}-XXXXXXXXXXXXXXXX-ptyN-{from,to}-master -func isCygwinPipeName(name string) bool { - token := strings.Split(name, "-") - if len(token) < 5 { - return false - } - - if token[0] != `\msys` && token[0] != `\cygwin` { - return false - } - - if token[1] == "" { - return false - } - - if !strings.HasPrefix(token[2], "pty") { - return false - } - - if token[3] != `from` && token[3] != `to` { - return false - } - - if token[4] != "master" { - return false - } - - return true -} - -// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 -// terminal. -func IsCygwinTerminal(fd uintptr) bool { - if procGetFileInformationByHandleEx == nil { - return false - } - - // Cygwin/msys's pty is a pipe. - ft, _, e := syscall.Syscall(procGetFileType.Addr(), 1, fd, 0, 0) - if ft != fileTypePipe || e != 0 { - return false - } - - var buf [2 + syscall.MAX_PATH]uint16 - r, _, e := syscall.Syscall6(procGetFileInformationByHandleEx.Addr(), - 4, fd, fileNameInfo, uintptr(unsafe.Pointer(&buf)), - uintptr(len(buf)*2), 0, 0) - if r == 0 || e != 0 { - return false - } - - l := *(*uint32)(unsafe.Pointer(&buf)) - return isCygwinPipeName(string(utf16.Decode(buf[2 : 2+l/2]))) -} diff --git a/vendor/golang.org/x/lint/.travis.yml b/vendor/golang.org/x/lint/.travis.yml deleted file mode 100644 index 50553ebd004..00000000000 --- a/vendor/golang.org/x/lint/.travis.yml +++ /dev/null @@ -1,19 +0,0 @@ -sudo: false -language: go -go: - - 1.10.x - - 1.11.x - - master - -go_import_path: golang.org/x/lint - -install: - - go get -t -v ./... - -script: - - go test -v -race ./... - -matrix: - allow_failures: - - go: master - fast_finish: true diff --git a/vendor/golang.org/x/lint/BUILD b/vendor/golang.org/x/lint/BUILD deleted file mode 100644 index d81a1c029d5..00000000000 --- a/vendor/golang.org/x/lint/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["lint.go"], - importmap = "k8s.io/kubernetes/vendor/golang.org/x/lint", - importpath = "golang.org/x/lint", - visibility = ["//visibility:public"], - deps = [ - "//vendor/golang.org/x/tools/go/ast/astutil:go_default_library", - "//vendor/golang.org/x/tools/go/gcexportdata:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//vendor/golang.org/x/lint/golint:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/golang.org/x/lint/CONTRIBUTING.md b/vendor/golang.org/x/lint/CONTRIBUTING.md deleted file mode 100644 index 1fadda62d2f..00000000000 --- a/vendor/golang.org/x/lint/CONTRIBUTING.md +++ /dev/null @@ -1,15 +0,0 @@ -# Contributing to Golint - -## Before filing an issue: - -### Are you having trouble building golint? - -Check you have the latest version of its dependencies. Run -``` -go get -u golang.org/x/lint/golint -``` -If you still have problems, consider searching for existing issues before filing a new issue. - -## Before sending a pull request: - -Have you understood the purpose of golint? Make sure to carefully read `README`. diff --git a/vendor/golang.org/x/lint/LICENSE b/vendor/golang.org/x/lint/LICENSE deleted file mode 100644 index 65d761bc9f2..00000000000 --- a/vendor/golang.org/x/lint/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2013 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/golang.org/x/lint/README.md b/vendor/golang.org/x/lint/README.md deleted file mode 100644 index 487eba71073..00000000000 --- a/vendor/golang.org/x/lint/README.md +++ /dev/null @@ -1,88 +0,0 @@ -Golint is a linter for Go source code. - -[![Build Status](https://travis-ci.org/golang/lint.svg?branch=master)](https://travis-ci.org/golang/lint) - -## Installation - -Golint requires a -[supported release of Go](https://golang.org/doc/devel/release.html#policy). - - go get -u golang.org/x/lint/golint - -To find out where `golint` was installed you can run `go list -f {{.Target}} golang.org/x/lint/golint`. For `golint` to be used globally add that directory to the `$PATH` environment setting. - -## Usage - -Invoke `golint` with one or more filenames, directories, or packages named -by its import path. Golint uses the same -[import path syntax](https://golang.org/cmd/go/#hdr-Import_path_syntax) as -the `go` command and therefore -also supports relative import paths like `./...`. Additionally the `...` -wildcard can be used as suffix on relative and absolute file paths to recurse -into them. - -The output of this tool is a list of suggestions in Vim quickfix format, -which is accepted by lots of different editors. - -## Purpose - -Golint differs from gofmt. Gofmt reformats Go source code, whereas -golint prints out style mistakes. - -Golint differs from govet. Govet is concerned with correctness, whereas -golint is concerned with coding style. Golint is in use at Google, and it -seeks to match the accepted style of the open source Go project. - -The suggestions made by golint are exactly that: suggestions. -Golint is not perfect, and has both false positives and false negatives. -Do not treat its output as a gold standard. We will not be adding pragmas -or other knobs to suppress specific warnings, so do not expect or require -code to be completely "lint-free". -In short, this tool is not, and will never be, trustworthy enough for its -suggestions to be enforced automatically, for example as part of a build process. -Golint makes suggestions for many of the mechanically checkable items listed in -[Effective Go](https://golang.org/doc/effective_go.html) and the -[CodeReviewComments wiki page](https://golang.org/wiki/CodeReviewComments). - -## Scope - -Golint is meant to carry out the stylistic conventions put forth in -[Effective Go](https://golang.org/doc/effective_go.html) and -[CodeReviewComments](https://golang.org/wiki/CodeReviewComments). -Changes that are not aligned with those documents will not be considered. - -## Contributions - -Contributions to this project are welcome provided they are [in scope](#scope), -though please send mail before starting work on anything major. -Contributors retain their copyright, so we need you to fill out -[a short form](https://developers.google.com/open-source/cla/individual) -before we can accept your contribution. - -## Vim - -Add this to your ~/.vimrc: - - set rtp+=$GOPATH/src/golang.org/x/lint/misc/vim - -If you have multiple entries in your GOPATH, replace `$GOPATH` with the right value. - -Running `:Lint` will run golint on the current file and populate the quickfix list. - -Optionally, add this to your `~/.vimrc` to automatically run `golint` on `:w` - - autocmd BufWritePost,FileWritePost *.go execute 'Lint' | cwindow - - -## Emacs - -Add this to your `.emacs` file: - - (add-to-list 'load-path (concat (getenv "GOPATH") "/src/github.com/golang/lint/misc/emacs")) - (require 'golint) - -If you have multiple entries in your GOPATH, replace `$GOPATH` with the right value. - -Running M-x golint will run golint on the current file. - -For more usage, see [Compilation-Mode](http://www.gnu.org/software/emacs/manual/html_node/emacs/Compilation-Mode.html). diff --git a/vendor/golang.org/x/lint/go.mod b/vendor/golang.org/x/lint/go.mod deleted file mode 100644 index d5ba4dbfd6c..00000000000 --- a/vendor/golang.org/x/lint/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module golang.org/x/lint - -require golang.org/x/tools v0.0.0-20190311212946-11955173bddd diff --git a/vendor/golang.org/x/lint/go.sum b/vendor/golang.org/x/lint/go.sum deleted file mode 100644 index 7d0e2e61884..00000000000 --- a/vendor/golang.org/x/lint/go.sum +++ /dev/null @@ -1,6 +0,0 @@ -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd h1:/e+gpKk9r3dJobndpTytxS2gOy6m5uvpg+ISQoEcusQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= diff --git a/vendor/golang.org/x/lint/golint/BUILD b/vendor/golang.org/x/lint/golint/BUILD deleted file mode 100644 index 2f4b66435a0..00000000000 --- a/vendor/golang.org/x/lint/golint/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "golint.go", - "import.go", - "importcomment.go", - ], - importmap = "k8s.io/kubernetes/vendor/golang.org/x/lint/golint", - importpath = "golang.org/x/lint/golint", - visibility = ["//visibility:private"], - deps = ["//vendor/golang.org/x/lint:go_default_library"], -) - -go_binary( - name = "golint", - embed = [":go_default_library"], - tags = ["manual"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/golang.org/x/lint/golint/golint.go b/vendor/golang.org/x/lint/golint/golint.go deleted file mode 100644 index ac024b6d26f..00000000000 --- a/vendor/golang.org/x/lint/golint/golint.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (c) 2013 The Go Authors. All rights reserved. -// -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file or at -// https://developers.google.com/open-source/licenses/bsd. - -// golint lints the Go source files named on its command line. -package main - -import ( - "flag" - "fmt" - "go/build" - "io/ioutil" - "os" - "path/filepath" - "strings" - - "golang.org/x/lint" -) - -var ( - minConfidence = flag.Float64("min_confidence", 0.8, "minimum confidence of a problem to print it") - setExitStatus = flag.Bool("set_exit_status", false, "set exit status to 1 if any issues are found") - suggestions int -) - -func usage() { - fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0]) - fmt.Fprintf(os.Stderr, "\tgolint [flags] # runs on package in current directory\n") - fmt.Fprintf(os.Stderr, "\tgolint [flags] [packages]\n") - fmt.Fprintf(os.Stderr, "\tgolint [flags] [directories] # where a '/...' suffix includes all sub-directories\n") - fmt.Fprintf(os.Stderr, "\tgolint [flags] [files] # all must belong to a single package\n") - fmt.Fprintf(os.Stderr, "Flags:\n") - flag.PrintDefaults() -} - -func main() { - flag.Usage = usage - flag.Parse() - - if flag.NArg() == 0 { - lintDir(".") - } else { - // dirsRun, filesRun, and pkgsRun indicate whether golint is applied to - // directory, file or package targets. The distinction affects which - // checks are run. It is no valid to mix target types. - var dirsRun, filesRun, pkgsRun int - var args []string - for _, arg := range flag.Args() { - if strings.HasSuffix(arg, "/...") && isDir(arg[:len(arg)-len("/...")]) { - dirsRun = 1 - for _, dirname := range allPackagesInFS(arg) { - args = append(args, dirname) - } - } else if isDir(arg) { - dirsRun = 1 - args = append(args, arg) - } else if exists(arg) { - filesRun = 1 - args = append(args, arg) - } else { - pkgsRun = 1 - args = append(args, arg) - } - } - - if dirsRun+filesRun+pkgsRun != 1 { - usage() - os.Exit(2) - } - switch { - case dirsRun == 1: - for _, dir := range args { - lintDir(dir) - } - case filesRun == 1: - lintFiles(args...) - case pkgsRun == 1: - for _, pkg := range importPaths(args) { - lintPackage(pkg) - } - } - } - - if *setExitStatus && suggestions > 0 { - fmt.Fprintf(os.Stderr, "Found %d lint suggestions; failing.\n", suggestions) - os.Exit(1) - } -} - -func isDir(filename string) bool { - fi, err := os.Stat(filename) - return err == nil && fi.IsDir() -} - -func exists(filename string) bool { - _, err := os.Stat(filename) - return err == nil -} - -func lintFiles(filenames ...string) { - files := make(map[string][]byte) - for _, filename := range filenames { - src, err := ioutil.ReadFile(filename) - if err != nil { - fmt.Fprintln(os.Stderr, err) - continue - } - files[filename] = src - } - - l := new(lint.Linter) - ps, err := l.LintFiles(files) - if err != nil { - fmt.Fprintf(os.Stderr, "%v\n", err) - return - } - for _, p := range ps { - if p.Confidence >= *minConfidence { - fmt.Printf("%v: %s\n", p.Position, p.Text) - suggestions++ - } - } -} - -func lintDir(dirname string) { - pkg, err := build.ImportDir(dirname, 0) - lintImportedPackage(pkg, err) -} - -func lintPackage(pkgname string) { - pkg, err := build.Import(pkgname, ".", 0) - lintImportedPackage(pkg, err) -} - -func lintImportedPackage(pkg *build.Package, err error) { - if err != nil { - if _, nogo := err.(*build.NoGoError); nogo { - // Don't complain if the failure is due to no Go source files. - return - } - fmt.Fprintln(os.Stderr, err) - return - } - - var files []string - files = append(files, pkg.GoFiles...) - files = append(files, pkg.CgoFiles...) - files = append(files, pkg.TestGoFiles...) - if pkg.Dir != "." { - for i, f := range files { - files[i] = filepath.Join(pkg.Dir, f) - } - } - // TODO(dsymonds): Do foo_test too (pkg.XTestGoFiles) - - lintFiles(files...) -} diff --git a/vendor/golang.org/x/lint/golint/import.go b/vendor/golang.org/x/lint/golint/import.go deleted file mode 100644 index 2ba9dea7792..00000000000 --- a/vendor/golang.org/x/lint/golint/import.go +++ /dev/null @@ -1,309 +0,0 @@ -package main - -/* - -This file holds a direct copy of the import path matching code of -https://github.com/golang/go/blob/master/src/cmd/go/main.go. It can be -replaced when https://golang.org/issue/8768 is resolved. - -It has been updated to follow upstream changes in a few ways. - -*/ - -import ( - "fmt" - "go/build" - "log" - "os" - "path" - "path/filepath" - "regexp" - "runtime" - "strings" -) - -var ( - buildContext = build.Default - goroot = filepath.Clean(runtime.GOROOT()) - gorootSrc = filepath.Join(goroot, "src") -) - -// importPathsNoDotExpansion returns the import paths to use for the given -// command line, but it does no ... expansion. -func importPathsNoDotExpansion(args []string) []string { - if len(args) == 0 { - return []string{"."} - } - var out []string - for _, a := range args { - // Arguments are supposed to be import paths, but - // as a courtesy to Windows developers, rewrite \ to / - // in command-line arguments. Handles .\... and so on. - if filepath.Separator == '\\' { - a = strings.Replace(a, `\`, `/`, -1) - } - - // Put argument in canonical form, but preserve leading ./. - if strings.HasPrefix(a, "./") { - a = "./" + path.Clean(a) - if a == "./." { - a = "." - } - } else { - a = path.Clean(a) - } - if a == "all" || a == "std" { - out = append(out, allPackages(a)...) - continue - } - out = append(out, a) - } - return out -} - -// importPaths returns the import paths to use for the given command line. -func importPaths(args []string) []string { - args = importPathsNoDotExpansion(args) - var out []string - for _, a := range args { - if strings.Contains(a, "...") { - if build.IsLocalImport(a) { - out = append(out, allPackagesInFS(a)...) - } else { - out = append(out, allPackages(a)...) - } - continue - } - out = append(out, a) - } - return out -} - -// matchPattern(pattern)(name) reports whether -// name matches pattern. Pattern is a limited glob -// pattern in which '...' means 'any string' and there -// is no other special syntax. -func matchPattern(pattern string) func(name string) bool { - re := regexp.QuoteMeta(pattern) - re = strings.Replace(re, `\.\.\.`, `.*`, -1) - // Special case: foo/... matches foo too. - if strings.HasSuffix(re, `/.*`) { - re = re[:len(re)-len(`/.*`)] + `(/.*)?` - } - reg := regexp.MustCompile(`^` + re + `$`) - return func(name string) bool { - return reg.MatchString(name) - } -} - -// hasPathPrefix reports whether the path s begins with the -// elements in prefix. -func hasPathPrefix(s, prefix string) bool { - switch { - default: - return false - case len(s) == len(prefix): - return s == prefix - case len(s) > len(prefix): - if prefix != "" && prefix[len(prefix)-1] == '/' { - return strings.HasPrefix(s, prefix) - } - return s[len(prefix)] == '/' && s[:len(prefix)] == prefix - } -} - -// treeCanMatchPattern(pattern)(name) reports whether -// name or children of name can possibly match pattern. -// Pattern is the same limited glob accepted by matchPattern. -func treeCanMatchPattern(pattern string) func(name string) bool { - wildCard := false - if i := strings.Index(pattern, "..."); i >= 0 { - wildCard = true - pattern = pattern[:i] - } - return func(name string) bool { - return len(name) <= len(pattern) && hasPathPrefix(pattern, name) || - wildCard && strings.HasPrefix(name, pattern) - } -} - -// allPackages returns all the packages that can be found -// under the $GOPATH directories and $GOROOT matching pattern. -// The pattern is either "all" (all packages), "std" (standard packages) -// or a path including "...". -func allPackages(pattern string) []string { - pkgs := matchPackages(pattern) - if len(pkgs) == 0 { - fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern) - } - return pkgs -} - -func matchPackages(pattern string) []string { - match := func(string) bool { return true } - treeCanMatch := func(string) bool { return true } - if pattern != "all" && pattern != "std" { - match = matchPattern(pattern) - treeCanMatch = treeCanMatchPattern(pattern) - } - - have := map[string]bool{ - "builtin": true, // ignore pseudo-package that exists only for documentation - } - if !buildContext.CgoEnabled { - have["runtime/cgo"] = true // ignore during walk - } - var pkgs []string - - // Commands - cmd := filepath.Join(goroot, "src/cmd") + string(filepath.Separator) - filepath.Walk(cmd, func(path string, fi os.FileInfo, err error) error { - if err != nil || !fi.IsDir() || path == cmd { - return nil - } - name := path[len(cmd):] - if !treeCanMatch(name) { - return filepath.SkipDir - } - // Commands are all in cmd/, not in subdirectories. - if strings.Contains(name, string(filepath.Separator)) { - return filepath.SkipDir - } - - // We use, e.g., cmd/gofmt as the pseudo import path for gofmt. - name = "cmd/" + name - if have[name] { - return nil - } - have[name] = true - if !match(name) { - return nil - } - _, err = buildContext.ImportDir(path, 0) - if err != nil { - if _, noGo := err.(*build.NoGoError); !noGo { - log.Print(err) - } - return nil - } - pkgs = append(pkgs, name) - return nil - }) - - for _, src := range buildContext.SrcDirs() { - if (pattern == "std" || pattern == "cmd") && src != gorootSrc { - continue - } - src = filepath.Clean(src) + string(filepath.Separator) - root := src - if pattern == "cmd" { - root += "cmd" + string(filepath.Separator) - } - filepath.Walk(root, func(path string, fi os.FileInfo, err error) error { - if err != nil || !fi.IsDir() || path == src { - return nil - } - - // Avoid .foo, _foo, and testdata directory trees. - _, elem := filepath.Split(path) - if strings.HasPrefix(elem, ".") || strings.HasPrefix(elem, "_") || elem == "testdata" { - return filepath.SkipDir - } - - name := filepath.ToSlash(path[len(src):]) - if pattern == "std" && (strings.Contains(name, ".") || name == "cmd") { - // The name "std" is only the standard library. - // If the name is cmd, it's the root of the command tree. - return filepath.SkipDir - } - if !treeCanMatch(name) { - return filepath.SkipDir - } - if have[name] { - return nil - } - have[name] = true - if !match(name) { - return nil - } - _, err = buildContext.ImportDir(path, 0) - if err != nil { - if _, noGo := err.(*build.NoGoError); noGo { - return nil - } - } - pkgs = append(pkgs, name) - return nil - }) - } - return pkgs -} - -// allPackagesInFS is like allPackages but is passed a pattern -// beginning ./ or ../, meaning it should scan the tree rooted -// at the given directory. There are ... in the pattern too. -func allPackagesInFS(pattern string) []string { - pkgs := matchPackagesInFS(pattern) - if len(pkgs) == 0 { - fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern) - } - return pkgs -} - -func matchPackagesInFS(pattern string) []string { - // Find directory to begin the scan. - // Could be smarter but this one optimization - // is enough for now, since ... is usually at the - // end of a path. - i := strings.Index(pattern, "...") - dir, _ := path.Split(pattern[:i]) - - // pattern begins with ./ or ../. - // path.Clean will discard the ./ but not the ../. - // We need to preserve the ./ for pattern matching - // and in the returned import paths. - prefix := "" - if strings.HasPrefix(pattern, "./") { - prefix = "./" - } - match := matchPattern(pattern) - - var pkgs []string - filepath.Walk(dir, func(path string, fi os.FileInfo, err error) error { - if err != nil || !fi.IsDir() { - return nil - } - if path == dir { - // filepath.Walk starts at dir and recurses. For the recursive case, - // the path is the result of filepath.Join, which calls filepath.Clean. - // The initial case is not Cleaned, though, so we do this explicitly. - // - // This converts a path like "./io/" to "io". Without this step, running - // "cd $GOROOT/src/pkg; go list ./io/..." would incorrectly skip the io - // package, because prepending the prefix "./" to the unclean path would - // result in "././io", and match("././io") returns false. - path = filepath.Clean(path) - } - - // Avoid .foo, _foo, and testdata directory trees, but do not avoid "." or "..". - _, elem := filepath.Split(path) - dot := strings.HasPrefix(elem, ".") && elem != "." && elem != ".." - if dot || strings.HasPrefix(elem, "_") || elem == "testdata" { - return filepath.SkipDir - } - - name := prefix + filepath.ToSlash(path) - if !match(name) { - return nil - } - if _, err = build.ImportDir(path, 0); err != nil { - if _, noGo := err.(*build.NoGoError); !noGo { - log.Print(err) - } - return nil - } - pkgs = append(pkgs, name) - return nil - }) - return pkgs -} diff --git a/vendor/golang.org/x/lint/golint/importcomment.go b/vendor/golang.org/x/lint/golint/importcomment.go deleted file mode 100644 index d5b32f73464..00000000000 --- a/vendor/golang.org/x/lint/golint/importcomment.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) 2018 The Go Authors. All rights reserved. -// -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file or at -// https://developers.google.com/open-source/licenses/bsd. - -// +build go1.12 - -// Require use of the correct import path only for Go 1.12+ users, so -// any breakages coincide with people updating their CI configs or -// whatnot. - -package main // import "golang.org/x/lint/golint" diff --git a/vendor/golang.org/x/lint/lint.go b/vendor/golang.org/x/lint/lint.go deleted file mode 100644 index 6b9fd6e2b62..00000000000 --- a/vendor/golang.org/x/lint/lint.go +++ /dev/null @@ -1,1693 +0,0 @@ -// Copyright (c) 2013 The Go Authors. All rights reserved. -// -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file or at -// https://developers.google.com/open-source/licenses/bsd. - -// Package lint contains a linter for Go source code. -package lint // import "golang.org/x/lint" - -import ( - "bufio" - "bytes" - "fmt" - "go/ast" - "go/parser" - "go/printer" - "go/token" - "go/types" - "regexp" - "sort" - "strconv" - "strings" - "unicode" - "unicode/utf8" - - "golang.org/x/tools/go/ast/astutil" - "golang.org/x/tools/go/gcexportdata" -) - -const styleGuideBase = "https://golang.org/wiki/CodeReviewComments" - -// A Linter lints Go source code. -type Linter struct { -} - -// Problem represents a problem in some source code. -type Problem struct { - Position token.Position // position in source file - Text string // the prose that describes the problem - Link string // (optional) the link to the style guide for the problem - Confidence float64 // a value in (0,1] estimating the confidence in this problem's correctness - LineText string // the source line - Category string // a short name for the general category of the problem - - // If the problem has a suggested fix (the minority case), - // ReplacementLine is a full replacement for the relevant line of the source file. - ReplacementLine string -} - -func (p *Problem) String() string { - if p.Link != "" { - return p.Text + "\n\n" + p.Link - } - return p.Text -} - -type byPosition []Problem - -func (p byPosition) Len() int { return len(p) } -func (p byPosition) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -func (p byPosition) Less(i, j int) bool { - pi, pj := p[i].Position, p[j].Position - - if pi.Filename != pj.Filename { - return pi.Filename < pj.Filename - } - if pi.Line != pj.Line { - return pi.Line < pj.Line - } - if pi.Column != pj.Column { - return pi.Column < pj.Column - } - - return p[i].Text < p[j].Text -} - -// Lint lints src. -func (l *Linter) Lint(filename string, src []byte) ([]Problem, error) { - return l.LintFiles(map[string][]byte{filename: src}) -} - -// LintFiles lints a set of files of a single package. -// The argument is a map of filename to source. -func (l *Linter) LintFiles(files map[string][]byte) ([]Problem, error) { - pkg := &pkg{ - fset: token.NewFileSet(), - files: make(map[string]*file), - } - var pkgName string - for filename, src := range files { - if isGenerated(src) { - continue // See issue #239 - } - f, err := parser.ParseFile(pkg.fset, filename, src, parser.ParseComments) - if err != nil { - return nil, err - } - if pkgName == "" { - pkgName = f.Name.Name - } else if f.Name.Name != pkgName { - return nil, fmt.Errorf("%s is in package %s, not %s", filename, f.Name.Name, pkgName) - } - pkg.files[filename] = &file{ - pkg: pkg, - f: f, - fset: pkg.fset, - src: src, - filename: filename, - } - } - if len(pkg.files) == 0 { - return nil, nil - } - return pkg.lint(), nil -} - -var ( - genHdr = []byte("// Code generated ") - genFtr = []byte(" DO NOT EDIT.") -) - -// isGenerated reports whether the source file is generated code -// according the rules from https://golang.org/s/generatedcode. -func isGenerated(src []byte) bool { - sc := bufio.NewScanner(bytes.NewReader(src)) - for sc.Scan() { - b := sc.Bytes() - if bytes.HasPrefix(b, genHdr) && bytes.HasSuffix(b, genFtr) && len(b) >= len(genHdr)+len(genFtr) { - return true - } - } - return false -} - -// pkg represents a package being linted. -type pkg struct { - fset *token.FileSet - files map[string]*file - - typesPkg *types.Package - typesInfo *types.Info - - // sortable is the set of types in the package that implement sort.Interface. - sortable map[string]bool - // main is whether this is a "main" package. - main bool - - problems []Problem -} - -func (p *pkg) lint() []Problem { - if err := p.typeCheck(); err != nil { - /* TODO(dsymonds): Consider reporting these errors when golint operates on entire packages. - if e, ok := err.(types.Error); ok { - pos := p.fset.Position(e.Pos) - conf := 1.0 - if strings.Contains(e.Msg, "can't find import: ") { - // Golint is probably being run in a context that doesn't support - // typechecking (e.g. package files aren't found), so don't warn about it. - conf = 0 - } - if conf > 0 { - p.errorfAt(pos, conf, category("typechecking"), e.Msg) - } - - // TODO(dsymonds): Abort if !e.Soft? - } - */ - } - - p.scanSortable() - p.main = p.isMain() - - for _, f := range p.files { - f.lint() - } - - sort.Sort(byPosition(p.problems)) - - return p.problems -} - -// file represents a file being linted. -type file struct { - pkg *pkg - f *ast.File - fset *token.FileSet - src []byte - filename string -} - -func (f *file) isTest() bool { return strings.HasSuffix(f.filename, "_test.go") } - -func (f *file) lint() { - f.lintPackageComment() - f.lintImports() - f.lintBlankImports() - f.lintExported() - f.lintNames() - f.lintVarDecls() - f.lintElses() - f.lintRanges() - f.lintErrorf() - f.lintErrors() - f.lintErrorStrings() - f.lintReceiverNames() - f.lintIncDec() - f.lintErrorReturn() - f.lintUnexportedReturn() - f.lintTimeNames() - f.lintContextKeyTypes() - f.lintContextArgs() -} - -type link string -type category string - -// The variadic arguments may start with link and category types, -// and must end with a format string and any arguments. -// It returns the new Problem. -func (f *file) errorf(n ast.Node, confidence float64, args ...interface{}) *Problem { - pos := f.fset.Position(n.Pos()) - if pos.Filename == "" { - pos.Filename = f.filename - } - return f.pkg.errorfAt(pos, confidence, args...) -} - -func (p *pkg) errorfAt(pos token.Position, confidence float64, args ...interface{}) *Problem { - problem := Problem{ - Position: pos, - Confidence: confidence, - } - if pos.Filename != "" { - // The file might not exist in our mapping if a //line directive was encountered. - if f, ok := p.files[pos.Filename]; ok { - problem.LineText = srcLine(f.src, pos) - } - } - -argLoop: - for len(args) > 1 { // always leave at least the format string in args - switch v := args[0].(type) { - case link: - problem.Link = string(v) - case category: - problem.Category = string(v) - default: - break argLoop - } - args = args[1:] - } - - problem.Text = fmt.Sprintf(args[0].(string), args[1:]...) - - p.problems = append(p.problems, problem) - return &p.problems[len(p.problems)-1] -} - -var newImporter = func(fset *token.FileSet) types.ImporterFrom { - return gcexportdata.NewImporter(fset, make(map[string]*types.Package)) -} - -func (p *pkg) typeCheck() error { - config := &types.Config{ - // By setting a no-op error reporter, the type checker does as much work as possible. - Error: func(error) {}, - Importer: newImporter(p.fset), - } - info := &types.Info{ - Types: make(map[ast.Expr]types.TypeAndValue), - Defs: make(map[*ast.Ident]types.Object), - Uses: make(map[*ast.Ident]types.Object), - Scopes: make(map[ast.Node]*types.Scope), - } - var anyFile *file - var astFiles []*ast.File - for _, f := range p.files { - anyFile = f - astFiles = append(astFiles, f.f) - } - pkg, err := config.Check(anyFile.f.Name.Name, p.fset, astFiles, info) - // Remember the typechecking info, even if config.Check failed, - // since we will get partial information. - p.typesPkg = pkg - p.typesInfo = info - return err -} - -func (p *pkg) typeOf(expr ast.Expr) types.Type { - if p.typesInfo == nil { - return nil - } - return p.typesInfo.TypeOf(expr) -} - -func (p *pkg) isNamedType(typ types.Type, importPath, name string) bool { - n, ok := typ.(*types.Named) - if !ok { - return false - } - tn := n.Obj() - return tn != nil && tn.Pkg() != nil && tn.Pkg().Path() == importPath && tn.Name() == name -} - -// scopeOf returns the tightest scope encompassing id. -func (p *pkg) scopeOf(id *ast.Ident) *types.Scope { - var scope *types.Scope - if obj := p.typesInfo.ObjectOf(id); obj != nil { - scope = obj.Parent() - } - if scope == p.typesPkg.Scope() { - // We were given a top-level identifier. - // Use the file-level scope instead of the package-level scope. - pos := id.Pos() - for _, f := range p.files { - if f.f.Pos() <= pos && pos < f.f.End() { - scope = p.typesInfo.Scopes[f.f] - break - } - } - } - return scope -} - -func (p *pkg) scanSortable() { - p.sortable = make(map[string]bool) - - // bitfield for which methods exist on each type. - const ( - Len = 1 << iota - Less - Swap - ) - nmap := map[string]int{"Len": Len, "Less": Less, "Swap": Swap} - has := make(map[string]int) - for _, f := range p.files { - f.walk(func(n ast.Node) bool { - fn, ok := n.(*ast.FuncDecl) - if !ok || fn.Recv == nil || len(fn.Recv.List) == 0 { - return true - } - // TODO(dsymonds): We could check the signature to be more precise. - recv := receiverType(fn) - if i, ok := nmap[fn.Name.Name]; ok { - has[recv] |= i - } - return false - }) - } - for typ, ms := range has { - if ms == Len|Less|Swap { - p.sortable[typ] = true - } - } -} - -func (p *pkg) isMain() bool { - for _, f := range p.files { - if f.isMain() { - return true - } - } - return false -} - -func (f *file) isMain() bool { - if f.f.Name.Name == "main" { - return true - } - return false -} - -// lintPackageComment checks package comments. It complains if -// there is no package comment, or if it is not of the right form. -// This has a notable false positive in that a package comment -// could rightfully appear in a different file of the same package, -// but that's not easy to fix since this linter is file-oriented. -func (f *file) lintPackageComment() { - if f.isTest() { - return - } - - const ref = styleGuideBase + "#package-comments" - prefix := "Package " + f.f.Name.Name + " " - - // Look for a detached package comment. - // First, scan for the last comment that occurs before the "package" keyword. - var lastCG *ast.CommentGroup - for _, cg := range f.f.Comments { - if cg.Pos() > f.f.Package { - // Gone past "package" keyword. - break - } - lastCG = cg - } - if lastCG != nil && strings.HasPrefix(lastCG.Text(), prefix) { - endPos := f.fset.Position(lastCG.End()) - pkgPos := f.fset.Position(f.f.Package) - if endPos.Line+1 < pkgPos.Line { - // There isn't a great place to anchor this error; - // the start of the blank lines between the doc and the package statement - // is at least pointing at the location of the problem. - pos := token.Position{ - Filename: endPos.Filename, - // Offset not set; it is non-trivial, and doesn't appear to be needed. - Line: endPos.Line + 1, - Column: 1, - } - f.pkg.errorfAt(pos, 0.9, link(ref), category("comments"), "package comment is detached; there should be no blank lines between it and the package statement") - return - } - } - - if f.f.Doc == nil { - f.errorf(f.f, 0.2, link(ref), category("comments"), "should have a package comment, unless it's in another file for this package") - return - } - s := f.f.Doc.Text() - if ts := strings.TrimLeft(s, " \t"); ts != s { - f.errorf(f.f.Doc, 1, link(ref), category("comments"), "package comment should not have leading space") - s = ts - } - // Only non-main packages need to keep to this form. - if !f.pkg.main && !strings.HasPrefix(s, prefix) { - f.errorf(f.f.Doc, 1, link(ref), category("comments"), `package comment should be of the form "%s..."`, prefix) - } -} - -// lintBlankImports complains if a non-main package has blank imports that are -// not documented. -func (f *file) lintBlankImports() { - // In package main and in tests, we don't complain about blank imports. - if f.pkg.main || f.isTest() { - return - } - - // The first element of each contiguous group of blank imports should have - // an explanatory comment of some kind. - for i, imp := range f.f.Imports { - pos := f.fset.Position(imp.Pos()) - - if !isBlank(imp.Name) { - continue // Ignore non-blank imports. - } - if i > 0 { - prev := f.f.Imports[i-1] - prevPos := f.fset.Position(prev.Pos()) - if isBlank(prev.Name) && prevPos.Line+1 == pos.Line { - continue // A subsequent blank in a group. - } - } - - // This is the first blank import of a group. - if imp.Doc == nil && imp.Comment == nil { - ref := "" - f.errorf(imp, 1, link(ref), category("imports"), "a blank import should be only in a main or test package, or have a comment justifying it") - } - } -} - -// lintImports examines import blocks. -func (f *file) lintImports() { - for i, is := range f.f.Imports { - _ = i - if is.Name != nil && is.Name.Name == "." && !f.isTest() { - f.errorf(is, 1, link(styleGuideBase+"#import-dot"), category("imports"), "should not use dot imports") - } - - } -} - -const docCommentsLink = styleGuideBase + "#doc-comments" - -// lintExported examines the exported names. -// It complains if any required doc comments are missing, -// or if they are not of the right form. The exact rules are in -// lintFuncDoc, lintTypeDoc and lintValueSpecDoc; this function -// also tracks the GenDecl structure being traversed to permit -// doc comments for constants to be on top of the const block. -// It also complains if the names stutter when combined with -// the package name. -func (f *file) lintExported() { - if f.isTest() { - return - } - - var lastGen *ast.GenDecl // last GenDecl entered. - - // Set of GenDecls that have already had missing comments flagged. - genDeclMissingComments := make(map[*ast.GenDecl]bool) - - f.walk(func(node ast.Node) bool { - switch v := node.(type) { - case *ast.GenDecl: - if v.Tok == token.IMPORT { - return false - } - // token.CONST, token.TYPE or token.VAR - lastGen = v - return true - case *ast.FuncDecl: - f.lintFuncDoc(v) - if v.Recv == nil { - // Only check for stutter on functions, not methods. - // Method names are not used package-qualified. - f.checkStutter(v.Name, "func") - } - // Don't proceed inside funcs. - return false - case *ast.TypeSpec: - // inside a GenDecl, which usually has the doc - doc := v.Doc - if doc == nil { - doc = lastGen.Doc - } - f.lintTypeDoc(v, doc) - f.checkStutter(v.Name, "type") - // Don't proceed inside types. - return false - case *ast.ValueSpec: - f.lintValueSpecDoc(v, lastGen, genDeclMissingComments) - return false - } - return true - }) -} - -var ( - allCapsRE = regexp.MustCompile(`^[A-Z0-9_]+$`) - anyCapsRE = regexp.MustCompile(`[A-Z]`) -) - -// knownNameExceptions is a set of names that are known to be exempt from naming checks. -// This is usually because they are constrained by having to match names in the -// standard library. -var knownNameExceptions = map[string]bool{ - "LastInsertId": true, // must match database/sql - "kWh": true, -} - -func isInTopLevel(f *ast.File, ident *ast.Ident) bool { - path, _ := astutil.PathEnclosingInterval(f, ident.Pos(), ident.End()) - for _, f := range path { - switch f.(type) { - case *ast.File, *ast.GenDecl, *ast.ValueSpec, *ast.Ident: - continue - } - return false - } - return true -} - -// lintNames examines all names in the file. -// It complains if any use underscores or incorrect known initialisms. -func (f *file) lintNames() { - // Package names need slightly different handling than other names. - if strings.Contains(f.f.Name.Name, "_") && !strings.HasSuffix(f.f.Name.Name, "_test") { - f.errorf(f.f, 1, link("http://golang.org/doc/effective_go.html#package-names"), category("naming"), "don't use an underscore in package name") - } - if anyCapsRE.MatchString(f.f.Name.Name) { - f.errorf(f.f, 1, link("http://golang.org/doc/effective_go.html#package-names"), category("mixed-caps"), "don't use MixedCaps in package name; %s should be %s", f.f.Name.Name, strings.ToLower(f.f.Name.Name)) - } - - check := func(id *ast.Ident, thing string) { - if id.Name == "_" { - return - } - if knownNameExceptions[id.Name] { - return - } - - // Handle two common styles from other languages that don't belong in Go. - if len(id.Name) >= 5 && allCapsRE.MatchString(id.Name) && strings.Contains(id.Name, "_") { - capCount := 0 - for _, c := range id.Name { - if 'A' <= c && c <= 'Z' { - capCount++ - } - } - if capCount >= 2 { - f.errorf(id, 0.8, link(styleGuideBase+"#mixed-caps"), category("naming"), "don't use ALL_CAPS in Go names; use CamelCase") - return - } - } - if thing == "const" || (thing == "var" && isInTopLevel(f.f, id)) { - if len(id.Name) > 2 && id.Name[0] == 'k' && id.Name[1] >= 'A' && id.Name[1] <= 'Z' { - should := string(id.Name[1]+'a'-'A') + id.Name[2:] - f.errorf(id, 0.8, link(styleGuideBase+"#mixed-caps"), category("naming"), "don't use leading k in Go names; %s %s should be %s", thing, id.Name, should) - } - } - - should := lintName(id.Name) - if id.Name == should { - return - } - - if len(id.Name) > 2 && strings.Contains(id.Name[1:], "_") { - f.errorf(id, 0.9, link("http://golang.org/doc/effective_go.html#mixed-caps"), category("naming"), "don't use underscores in Go names; %s %s should be %s", thing, id.Name, should) - return - } - f.errorf(id, 0.8, link(styleGuideBase+"#initialisms"), category("naming"), "%s %s should be %s", thing, id.Name, should) - } - checkList := func(fl *ast.FieldList, thing string) { - if fl == nil { - return - } - for _, f := range fl.List { - for _, id := range f.Names { - check(id, thing) - } - } - } - f.walk(func(node ast.Node) bool { - switch v := node.(type) { - case *ast.AssignStmt: - if v.Tok == token.ASSIGN { - return true - } - for _, exp := range v.Lhs { - if id, ok := exp.(*ast.Ident); ok { - check(id, "var") - } - } - case *ast.FuncDecl: - if f.isTest() && (strings.HasPrefix(v.Name.Name, "Example") || strings.HasPrefix(v.Name.Name, "Test") || strings.HasPrefix(v.Name.Name, "Benchmark")) { - return true - } - - thing := "func" - if v.Recv != nil { - thing = "method" - } - - // Exclude naming warnings for functions that are exported to C but - // not exported in the Go API. - // See https://github.com/golang/lint/issues/144. - if ast.IsExported(v.Name.Name) || !isCgoExported(v) { - check(v.Name, thing) - } - - checkList(v.Type.Params, thing+" parameter") - checkList(v.Type.Results, thing+" result") - case *ast.GenDecl: - if v.Tok == token.IMPORT { - return true - } - var thing string - switch v.Tok { - case token.CONST: - thing = "const" - case token.TYPE: - thing = "type" - case token.VAR: - thing = "var" - } - for _, spec := range v.Specs { - switch s := spec.(type) { - case *ast.TypeSpec: - check(s.Name, thing) - case *ast.ValueSpec: - for _, id := range s.Names { - check(id, thing) - } - } - } - case *ast.InterfaceType: - // Do not check interface method names. - // They are often constrainted by the method names of concrete types. - for _, x := range v.Methods.List { - ft, ok := x.Type.(*ast.FuncType) - if !ok { // might be an embedded interface name - continue - } - checkList(ft.Params, "interface method parameter") - checkList(ft.Results, "interface method result") - } - case *ast.RangeStmt: - if v.Tok == token.ASSIGN { - return true - } - if id, ok := v.Key.(*ast.Ident); ok { - check(id, "range var") - } - if id, ok := v.Value.(*ast.Ident); ok { - check(id, "range var") - } - case *ast.StructType: - for _, f := range v.Fields.List { - for _, id := range f.Names { - check(id, "struct field") - } - } - } - return true - }) -} - -// lintName returns a different name if it should be different. -func lintName(name string) (should string) { - // Fast path for simple cases: "_" and all lowercase. - if name == "_" { - return name - } - allLower := true - for _, r := range name { - if !unicode.IsLower(r) { - allLower = false - break - } - } - if allLower { - return name - } - - // Split camelCase at any lower->upper transition, and split on underscores. - // Check each word for common initialisms. - runes := []rune(name) - w, i := 0, 0 // index of start of word, scan - for i+1 <= len(runes) { - eow := false // whether we hit the end of a word - if i+1 == len(runes) { - eow = true - } else if runes[i+1] == '_' { - // underscore; shift the remainder forward over any run of underscores - eow = true - n := 1 - for i+n+1 < len(runes) && runes[i+n+1] == '_' { - n++ - } - - // Leave at most one underscore if the underscore is between two digits - if i+n+1 < len(runes) && unicode.IsDigit(runes[i]) && unicode.IsDigit(runes[i+n+1]) { - n-- - } - - copy(runes[i+1:], runes[i+n+1:]) - runes = runes[:len(runes)-n] - } else if unicode.IsLower(runes[i]) && !unicode.IsLower(runes[i+1]) { - // lower->non-lower - eow = true - } - i++ - if !eow { - continue - } - - // [w,i) is a word. - word := string(runes[w:i]) - if u := strings.ToUpper(word); commonInitialisms[u] { - // Keep consistent case, which is lowercase only at the start. - if w == 0 && unicode.IsLower(runes[w]) { - u = strings.ToLower(u) - } - // All the common initialisms are ASCII, - // so we can replace the bytes exactly. - copy(runes[w:], []rune(u)) - } else if w > 0 && strings.ToLower(word) == word { - // already all lowercase, and not the first word, so uppercase the first character. - runes[w] = unicode.ToUpper(runes[w]) - } - w = i - } - return string(runes) -} - -// commonInitialisms is a set of common initialisms. -// Only add entries that are highly unlikely to be non-initialisms. -// For instance, "ID" is fine (Freudian code is rare), but "AND" is not. -var commonInitialisms = map[string]bool{ - "ACL": true, - "API": true, - "ASCII": true, - "CPU": true, - "CSS": true, - "DNS": true, - "EOF": true, - "GUID": true, - "HTML": true, - "HTTP": true, - "HTTPS": true, - "ID": true, - "IP": true, - "JSON": true, - "LHS": true, - "QPS": true, - "RAM": true, - "RHS": true, - "RPC": true, - "SLA": true, - "SMTP": true, - "SQL": true, - "SSH": true, - "TCP": true, - "TLS": true, - "TTL": true, - "UDP": true, - "UI": true, - "UID": true, - "UUID": true, - "URI": true, - "URL": true, - "UTF8": true, - "VM": true, - "XML": true, - "XMPP": true, - "XSRF": true, - "XSS": true, -} - -// lintTypeDoc examines the doc comment on a type. -// It complains if they are missing from an exported type, -// or if they are not of the standard form. -func (f *file) lintTypeDoc(t *ast.TypeSpec, doc *ast.CommentGroup) { - if !ast.IsExported(t.Name.Name) { - return - } - if doc == nil { - f.errorf(t, 1, link(docCommentsLink), category("comments"), "exported type %v should have comment or be unexported", t.Name) - return - } - - s := doc.Text() - articles := [...]string{"A", "An", "The"} - for _, a := range articles { - if strings.HasPrefix(s, a+" ") { - s = s[len(a)+1:] - break - } - } - if !strings.HasPrefix(s, t.Name.Name+" ") { - f.errorf(doc, 1, link(docCommentsLink), category("comments"), `comment on exported type %v should be of the form "%v ..." (with optional leading article)`, t.Name, t.Name) - } -} - -var commonMethods = map[string]bool{ - "Error": true, - "Read": true, - "ServeHTTP": true, - "String": true, - "Write": true, -} - -// lintFuncDoc examines doc comments on functions and methods. -// It complains if they are missing, or not of the right form. -// It has specific exclusions for well-known methods (see commonMethods above). -func (f *file) lintFuncDoc(fn *ast.FuncDecl) { - if !ast.IsExported(fn.Name.Name) { - // func is unexported - return - } - kind := "function" - name := fn.Name.Name - if fn.Recv != nil && len(fn.Recv.List) > 0 { - // method - kind = "method" - recv := receiverType(fn) - if !ast.IsExported(recv) { - // receiver is unexported - return - } - if commonMethods[name] { - return - } - switch name { - case "Len", "Less", "Swap": - if f.pkg.sortable[recv] { - return - } - } - name = recv + "." + name - } - if fn.Doc == nil { - f.errorf(fn, 1, link(docCommentsLink), category("comments"), "exported %s %s should have comment or be unexported", kind, name) - return - } - s := fn.Doc.Text() - prefix := fn.Name.Name + " " - if !strings.HasPrefix(s, prefix) { - f.errorf(fn.Doc, 1, link(docCommentsLink), category("comments"), `comment on exported %s %s should be of the form "%s..."`, kind, name, prefix) - } -} - -// lintValueSpecDoc examines package-global variables and constants. -// It complains if they are not individually declared, -// or if they are not suitably documented in the right form (unless they are in a block that is commented). -func (f *file) lintValueSpecDoc(vs *ast.ValueSpec, gd *ast.GenDecl, genDeclMissingComments map[*ast.GenDecl]bool) { - kind := "var" - if gd.Tok == token.CONST { - kind = "const" - } - - if len(vs.Names) > 1 { - // Check that none are exported except for the first. - for _, n := range vs.Names[1:] { - if ast.IsExported(n.Name) { - f.errorf(vs, 1, category("comments"), "exported %s %s should have its own declaration", kind, n.Name) - return - } - } - } - - // Only one name. - name := vs.Names[0].Name - if !ast.IsExported(name) { - return - } - - if vs.Doc == nil && gd.Doc == nil { - if genDeclMissingComments[gd] { - return - } - block := "" - if kind == "const" && gd.Lparen.IsValid() { - block = " (or a comment on this block)" - } - f.errorf(vs, 1, link(docCommentsLink), category("comments"), "exported %s %s should have comment%s or be unexported", kind, name, block) - genDeclMissingComments[gd] = true - return - } - // If this GenDecl has parens and a comment, we don't check its comment form. - if gd.Lparen.IsValid() && gd.Doc != nil { - return - } - // The relevant text to check will be on either vs.Doc or gd.Doc. - // Use vs.Doc preferentially. - doc := vs.Doc - if doc == nil { - doc = gd.Doc - } - prefix := name + " " - if !strings.HasPrefix(doc.Text(), prefix) { - f.errorf(doc, 1, link(docCommentsLink), category("comments"), `comment on exported %s %s should be of the form "%s..."`, kind, name, prefix) - } -} - -func (f *file) checkStutter(id *ast.Ident, thing string) { - pkg, name := f.f.Name.Name, id.Name - if !ast.IsExported(name) { - // unexported name - return - } - // A name stutters if the package name is a strict prefix - // and the next character of the name starts a new word. - if len(name) <= len(pkg) { - // name is too short to stutter. - // This permits the name to be the same as the package name. - return - } - if !strings.EqualFold(pkg, name[:len(pkg)]) { - return - } - // We can assume the name is well-formed UTF-8. - // If the next rune after the package name is uppercase or an underscore - // the it's starting a new word and thus this name stutters. - rem := name[len(pkg):] - if next, _ := utf8.DecodeRuneInString(rem); next == '_' || unicode.IsUpper(next) { - f.errorf(id, 0.8, link(styleGuideBase+"#package-names"), category("naming"), "%s name will be used as %s.%s by other packages, and that stutters; consider calling this %s", thing, pkg, name, rem) - } -} - -// zeroLiteral is a set of ast.BasicLit values that are zero values. -// It is not exhaustive. -var zeroLiteral = map[string]bool{ - "false": true, // bool - // runes - `'\x00'`: true, - `'\000'`: true, - // strings - `""`: true, - "``": true, - // numerics - "0": true, - "0.": true, - "0.0": true, - "0i": true, -} - -// lintVarDecls examines variable declarations. It complains about declarations with -// redundant LHS types that can be inferred from the RHS. -func (f *file) lintVarDecls() { - var lastGen *ast.GenDecl // last GenDecl entered. - - f.walk(func(node ast.Node) bool { - switch v := node.(type) { - case *ast.GenDecl: - if v.Tok != token.CONST && v.Tok != token.VAR { - return false - } - lastGen = v - return true - case *ast.ValueSpec: - if lastGen.Tok == token.CONST { - return false - } - if len(v.Names) > 1 || v.Type == nil || len(v.Values) == 0 { - return false - } - rhs := v.Values[0] - // An underscore var appears in a common idiom for compile-time interface satisfaction, - // as in "var _ Interface = (*Concrete)(nil)". - if isIdent(v.Names[0], "_") { - return false - } - // If the RHS is a zero value, suggest dropping it. - zero := false - if lit, ok := rhs.(*ast.BasicLit); ok { - zero = zeroLiteral[lit.Value] - } else if isIdent(rhs, "nil") { - zero = true - } - if zero { - f.errorf(rhs, 0.9, category("zero-value"), "should drop = %s from declaration of var %s; it is the zero value", f.render(rhs), v.Names[0]) - return false - } - lhsTyp := f.pkg.typeOf(v.Type) - rhsTyp := f.pkg.typeOf(rhs) - - if !validType(lhsTyp) || !validType(rhsTyp) { - // Type checking failed (often due to missing imports). - return false - } - - if !types.Identical(lhsTyp, rhsTyp) { - // Assignment to a different type is not redundant. - return false - } - - // The next three conditions are for suppressing the warning in situations - // where we were unable to typecheck. - - // If the LHS type is an interface, don't warn, since it is probably a - // concrete type on the RHS. Note that our feeble lexical check here - // will only pick up interface{} and other literal interface types; - // that covers most of the cases we care to exclude right now. - if _, ok := v.Type.(*ast.InterfaceType); ok { - return false - } - // If the RHS is an untyped const, only warn if the LHS type is its default type. - if defType, ok := f.isUntypedConst(rhs); ok && !isIdent(v.Type, defType) { - return false - } - - f.errorf(v.Type, 0.8, category("type-inference"), "should omit type %s from declaration of var %s; it will be inferred from the right-hand side", f.render(v.Type), v.Names[0]) - return false - } - return true - }) -} - -func validType(T types.Type) bool { - return T != nil && - T != types.Typ[types.Invalid] && - !strings.Contains(T.String(), "invalid type") // good but not foolproof -} - -// lintElses examines else blocks. It complains about any else block whose if block ends in a return. -func (f *file) lintElses() { - // We don't want to flag if { } else if { } else { } constructions. - // They will appear as an IfStmt whose Else field is also an IfStmt. - // Record such a node so we ignore it when we visit it. - ignore := make(map[*ast.IfStmt]bool) - - f.walk(func(node ast.Node) bool { - ifStmt, ok := node.(*ast.IfStmt) - if !ok || ifStmt.Else == nil { - return true - } - if elseif, ok := ifStmt.Else.(*ast.IfStmt); ok { - ignore[elseif] = true - return true - } - if ignore[ifStmt] { - return true - } - if _, ok := ifStmt.Else.(*ast.BlockStmt); !ok { - // only care about elses without conditions - return true - } - if len(ifStmt.Body.List) == 0 { - return true - } - shortDecl := false // does the if statement have a ":=" initialization statement? - if ifStmt.Init != nil { - if as, ok := ifStmt.Init.(*ast.AssignStmt); ok && as.Tok == token.DEFINE { - shortDecl = true - } - } - lastStmt := ifStmt.Body.List[len(ifStmt.Body.List)-1] - if _, ok := lastStmt.(*ast.ReturnStmt); ok { - extra := "" - if shortDecl { - extra = " (move short variable declaration to its own line if necessary)" - } - f.errorf(ifStmt.Else, 1, link(styleGuideBase+"#indent-error-flow"), category("indent"), "if block ends with a return statement, so drop this else and outdent its block"+extra) - } - return true - }) -} - -// lintRanges examines range clauses. It complains about redundant constructions. -func (f *file) lintRanges() { - f.walk(func(node ast.Node) bool { - rs, ok := node.(*ast.RangeStmt) - if !ok { - return true - } - - if isIdent(rs.Key, "_") && (rs.Value == nil || isIdent(rs.Value, "_")) { - p := f.errorf(rs.Key, 1, category("range-loop"), "should omit values from range; this loop is equivalent to `for range ...`") - - newRS := *rs // shallow copy - newRS.Value = nil - newRS.Key = nil - p.ReplacementLine = f.firstLineOf(&newRS, rs) - - return true - } - - if isIdent(rs.Value, "_") { - p := f.errorf(rs.Value, 1, category("range-loop"), "should omit 2nd value from range; this loop is equivalent to `for %s %s range ...`", f.render(rs.Key), rs.Tok) - - newRS := *rs // shallow copy - newRS.Value = nil - p.ReplacementLine = f.firstLineOf(&newRS, rs) - } - - return true - }) -} - -// lintErrorf examines errors.New and testing.Error calls. It complains if its only argument is an fmt.Sprintf invocation. -func (f *file) lintErrorf() { - f.walk(func(node ast.Node) bool { - ce, ok := node.(*ast.CallExpr) - if !ok || len(ce.Args) != 1 { - return true - } - isErrorsNew := isPkgDot(ce.Fun, "errors", "New") - var isTestingError bool - se, ok := ce.Fun.(*ast.SelectorExpr) - if ok && se.Sel.Name == "Error" { - if typ := f.pkg.typeOf(se.X); typ != nil { - isTestingError = typ.String() == "*testing.T" - } - } - if !isErrorsNew && !isTestingError { - return true - } - if !f.imports("errors") { - return true - } - arg := ce.Args[0] - ce, ok = arg.(*ast.CallExpr) - if !ok || !isPkgDot(ce.Fun, "fmt", "Sprintf") { - return true - } - errorfPrefix := "fmt" - if isTestingError { - errorfPrefix = f.render(se.X) - } - p := f.errorf(node, 1, category("errors"), "should replace %s(fmt.Sprintf(...)) with %s.Errorf(...)", f.render(se), errorfPrefix) - - m := f.srcLineWithMatch(ce, `^(.*)`+f.render(se)+`\(fmt\.Sprintf\((.*)\)\)(.*)$`) - if m != nil { - p.ReplacementLine = m[1] + errorfPrefix + ".Errorf(" + m[2] + ")" + m[3] - } - - return true - }) -} - -// lintErrors examines global error vars. It complains if they aren't named in the standard way. -func (f *file) lintErrors() { - for _, decl := range f.f.Decls { - gd, ok := decl.(*ast.GenDecl) - if !ok || gd.Tok != token.VAR { - continue - } - for _, spec := range gd.Specs { - spec := spec.(*ast.ValueSpec) - if len(spec.Names) != 1 || len(spec.Values) != 1 { - continue - } - ce, ok := spec.Values[0].(*ast.CallExpr) - if !ok { - continue - } - if !isPkgDot(ce.Fun, "errors", "New") && !isPkgDot(ce.Fun, "fmt", "Errorf") { - continue - } - - id := spec.Names[0] - prefix := "err" - if id.IsExported() { - prefix = "Err" - } - if !strings.HasPrefix(id.Name, prefix) { - f.errorf(id, 0.9, category("naming"), "error var %s should have name of the form %sFoo", id.Name, prefix) - } - } - } -} - -func lintErrorString(s string) (isClean bool, conf float64) { - const basicConfidence = 0.8 - const capConfidence = basicConfidence - 0.2 - first, firstN := utf8.DecodeRuneInString(s) - last, _ := utf8.DecodeLastRuneInString(s) - if last == '.' || last == ':' || last == '!' || last == '\n' { - return false, basicConfidence - } - if unicode.IsUpper(first) { - // People use proper nouns and exported Go identifiers in error strings, - // so decrease the confidence of warnings for capitalization. - if len(s) <= firstN { - return false, capConfidence - } - // Flag strings starting with something that doesn't look like an initialism. - if second, _ := utf8.DecodeRuneInString(s[firstN:]); !unicode.IsUpper(second) { - return false, capConfidence - } - } - return true, 0 -} - -// lintErrorStrings examines error strings. -// It complains if they are capitalized or end in punctuation or a newline. -func (f *file) lintErrorStrings() { - f.walk(func(node ast.Node) bool { - ce, ok := node.(*ast.CallExpr) - if !ok { - return true - } - if !isPkgDot(ce.Fun, "errors", "New") && !isPkgDot(ce.Fun, "fmt", "Errorf") { - return true - } - if len(ce.Args) < 1 { - return true - } - str, ok := ce.Args[0].(*ast.BasicLit) - if !ok || str.Kind != token.STRING { - return true - } - s, _ := strconv.Unquote(str.Value) // can assume well-formed Go - if s == "" { - return true - } - clean, conf := lintErrorString(s) - if clean { - return true - } - - f.errorf(str, conf, link(styleGuideBase+"#error-strings"), category("errors"), - "error strings should not be capitalized or end with punctuation or a newline") - return true - }) -} - -// lintReceiverNames examines receiver names. It complains about inconsistent -// names used for the same type and names such as "this". -func (f *file) lintReceiverNames() { - typeReceiver := map[string]string{} - f.walk(func(n ast.Node) bool { - fn, ok := n.(*ast.FuncDecl) - if !ok || fn.Recv == nil || len(fn.Recv.List) == 0 { - return true - } - names := fn.Recv.List[0].Names - if len(names) < 1 { - return true - } - name := names[0].Name - const ref = styleGuideBase + "#receiver-names" - if name == "_" { - f.errorf(n, 1, link(ref), category("naming"), `receiver name should not be an underscore, omit the name if it is unused`) - return true - } - if name == "this" || name == "self" { - f.errorf(n, 1, link(ref), category("naming"), `receiver name should be a reflection of its identity; don't use generic names such as "this" or "self"`) - return true - } - recv := receiverType(fn) - if prev, ok := typeReceiver[recv]; ok && prev != name { - f.errorf(n, 1, link(ref), category("naming"), "receiver name %s should be consistent with previous receiver name %s for %s", name, prev, recv) - return true - } - typeReceiver[recv] = name - return true - }) -} - -// lintIncDec examines statements that increment or decrement a variable. -// It complains if they don't use x++ or x--. -func (f *file) lintIncDec() { - f.walk(func(n ast.Node) bool { - as, ok := n.(*ast.AssignStmt) - if !ok { - return true - } - if len(as.Lhs) != 1 { - return true - } - if !isOne(as.Rhs[0]) { - return true - } - var suffix string - switch as.Tok { - case token.ADD_ASSIGN: - suffix = "++" - case token.SUB_ASSIGN: - suffix = "--" - default: - return true - } - f.errorf(as, 0.8, category("unary-op"), "should replace %s with %s%s", f.render(as), f.render(as.Lhs[0]), suffix) - return true - }) -} - -// lintErrorReturn examines function declarations that return an error. -// It complains if the error isn't the last parameter. -func (f *file) lintErrorReturn() { - f.walk(func(n ast.Node) bool { - fn, ok := n.(*ast.FuncDecl) - if !ok || fn.Type.Results == nil { - return true - } - ret := fn.Type.Results.List - if len(ret) <= 1 { - return true - } - if isIdent(ret[len(ret)-1].Type, "error") { - return true - } - // An error return parameter should be the last parameter. - // Flag any error parameters found before the last. - for _, r := range ret[:len(ret)-1] { - if isIdent(r.Type, "error") { - f.errorf(fn, 0.9, category("arg-order"), "error should be the last type when returning multiple items") - break // only flag one - } - } - return true - }) -} - -// lintUnexportedReturn examines exported function declarations. -// It complains if any return an unexported type. -func (f *file) lintUnexportedReturn() { - f.walk(func(n ast.Node) bool { - fn, ok := n.(*ast.FuncDecl) - if !ok { - return true - } - if fn.Type.Results == nil { - return false - } - if !fn.Name.IsExported() { - return false - } - thing := "func" - if fn.Recv != nil && len(fn.Recv.List) > 0 { - thing = "method" - if !ast.IsExported(receiverType(fn)) { - // Don't report exported methods of unexported types, - // such as private implementations of sort.Interface. - return false - } - } - for _, ret := range fn.Type.Results.List { - typ := f.pkg.typeOf(ret.Type) - if exportedType(typ) { - continue - } - f.errorf(ret.Type, 0.8, category("unexported-type-in-api"), - "exported %s %s returns unexported type %s, which can be annoying to use", - thing, fn.Name.Name, typ) - break // only flag one - } - return false - }) -} - -// exportedType reports whether typ is an exported type. -// It is imprecise, and will err on the side of returning true, -// such as for composite types. -func exportedType(typ types.Type) bool { - switch T := typ.(type) { - case *types.Named: - // Builtin types have no package. - return T.Obj().Pkg() == nil || T.Obj().Exported() - case *types.Map: - return exportedType(T.Key()) && exportedType(T.Elem()) - case interface { - Elem() types.Type - }: // array, slice, pointer, chan - return exportedType(T.Elem()) - } - // Be conservative about other types, such as struct, interface, etc. - return true -} - -// timeSuffixes is a list of name suffixes that imply a time unit. -// This is not an exhaustive list. -var timeSuffixes = []string{ - "Sec", "Secs", "Seconds", - "Msec", "Msecs", - "Milli", "Millis", "Milliseconds", - "Usec", "Usecs", "Microseconds", - "MS", "Ms", -} - -func (f *file) lintTimeNames() { - f.walk(func(node ast.Node) bool { - v, ok := node.(*ast.ValueSpec) - if !ok { - return true - } - for _, name := range v.Names { - origTyp := f.pkg.typeOf(name) - // Look for time.Duration or *time.Duration; - // the latter is common when using flag.Duration. - typ := origTyp - if pt, ok := typ.(*types.Pointer); ok { - typ = pt.Elem() - } - if !f.pkg.isNamedType(typ, "time", "Duration") { - continue - } - suffix := "" - for _, suf := range timeSuffixes { - if strings.HasSuffix(name.Name, suf) { - suffix = suf - break - } - } - if suffix == "" { - continue - } - f.errorf(v, 0.9, category("time"), "var %s is of type %v; don't use unit-specific suffix %q", name.Name, origTyp, suffix) - } - return true - }) -} - -// lintContextKeyTypes checks for call expressions to context.WithValue with -// basic types used for the key argument. -// See: https://golang.org/issue/17293 -func (f *file) lintContextKeyTypes() { - f.walk(func(node ast.Node) bool { - switch node := node.(type) { - case *ast.CallExpr: - f.checkContextKeyType(node) - } - - return true - }) -} - -// checkContextKeyType reports an error if the call expression calls -// context.WithValue with a key argument of basic type. -func (f *file) checkContextKeyType(x *ast.CallExpr) { - sel, ok := x.Fun.(*ast.SelectorExpr) - if !ok { - return - } - pkg, ok := sel.X.(*ast.Ident) - if !ok || pkg.Name != "context" { - return - } - if sel.Sel.Name != "WithValue" { - return - } - - // key is second argument to context.WithValue - if len(x.Args) != 3 { - return - } - key := f.pkg.typesInfo.Types[x.Args[1]] - - if ktyp, ok := key.Type.(*types.Basic); ok && ktyp.Kind() != types.Invalid { - f.errorf(x, 1.0, category("context"), fmt.Sprintf("should not use basic type %s as key in context.WithValue", key.Type)) - } -} - -// lintContextArgs examines function declarations that contain an -// argument with a type of context.Context -// It complains if that argument isn't the first parameter. -func (f *file) lintContextArgs() { - f.walk(func(n ast.Node) bool { - fn, ok := n.(*ast.FuncDecl) - if !ok || len(fn.Type.Params.List) <= 1 { - return true - } - // A context.Context should be the first parameter of a function. - // Flag any that show up after the first. - for _, arg := range fn.Type.Params.List[1:] { - if isPkgDot(arg.Type, "context", "Context") { - f.errorf(fn, 0.9, link("https://golang.org/pkg/context/"), category("arg-order"), "context.Context should be the first parameter of a function") - break // only flag one - } - } - return true - }) -} - -// containsComments returns whether the interval [start, end) contains any -// comments without "// MATCH " prefix. -func (f *file) containsComments(start, end token.Pos) bool { - for _, cgroup := range f.f.Comments { - comments := cgroup.List - if comments[0].Slash >= end { - // All comments starting with this group are after end pos. - return false - } - if comments[len(comments)-1].Slash < start { - // Comments group ends before start pos. - continue - } - for _, c := range comments { - if start <= c.Slash && c.Slash < end && !strings.HasPrefix(c.Text, "// MATCH ") { - return true - } - } - } - return false -} - -// receiverType returns the named type of the method receiver, sans "*", -// or "invalid-type" if fn.Recv is ill formed. -func receiverType(fn *ast.FuncDecl) string { - switch e := fn.Recv.List[0].Type.(type) { - case *ast.Ident: - return e.Name - case *ast.StarExpr: - if id, ok := e.X.(*ast.Ident); ok { - return id.Name - } - } - // The parser accepts much more than just the legal forms. - return "invalid-type" -} - -func (f *file) walk(fn func(ast.Node) bool) { - ast.Walk(walker(fn), f.f) -} - -func (f *file) render(x interface{}) string { - var buf bytes.Buffer - if err := printer.Fprint(&buf, f.fset, x); err != nil { - panic(err) - } - return buf.String() -} - -func (f *file) debugRender(x interface{}) string { - var buf bytes.Buffer - if err := ast.Fprint(&buf, f.fset, x, nil); err != nil { - panic(err) - } - return buf.String() -} - -// walker adapts a function to satisfy the ast.Visitor interface. -// The function return whether the walk should proceed into the node's children. -type walker func(ast.Node) bool - -func (w walker) Visit(node ast.Node) ast.Visitor { - if w(node) { - return w - } - return nil -} - -func isIdent(expr ast.Expr, ident string) bool { - id, ok := expr.(*ast.Ident) - return ok && id.Name == ident -} - -// isBlank returns whether id is the blank identifier "_". -// If id == nil, the answer is false. -func isBlank(id *ast.Ident) bool { return id != nil && id.Name == "_" } - -func isPkgDot(expr ast.Expr, pkg, name string) bool { - sel, ok := expr.(*ast.SelectorExpr) - return ok && isIdent(sel.X, pkg) && isIdent(sel.Sel, name) -} - -func isOne(expr ast.Expr) bool { - lit, ok := expr.(*ast.BasicLit) - return ok && lit.Kind == token.INT && lit.Value == "1" -} - -func isCgoExported(f *ast.FuncDecl) bool { - if f.Recv != nil || f.Doc == nil { - return false - } - - cgoExport := regexp.MustCompile(fmt.Sprintf("(?m)^//export %s$", regexp.QuoteMeta(f.Name.Name))) - for _, c := range f.Doc.List { - if cgoExport.MatchString(c.Text) { - return true - } - } - return false -} - -var basicTypeKinds = map[types.BasicKind]string{ - types.UntypedBool: "bool", - types.UntypedInt: "int", - types.UntypedRune: "rune", - types.UntypedFloat: "float64", - types.UntypedComplex: "complex128", - types.UntypedString: "string", -} - -// isUntypedConst reports whether expr is an untyped constant, -// and indicates what its default type is. -// scope may be nil. -func (f *file) isUntypedConst(expr ast.Expr) (defType string, ok bool) { - // Re-evaluate expr outside of its context to see if it's untyped. - // (An expr evaluated within, for example, an assignment context will get the type of the LHS.) - exprStr := f.render(expr) - tv, err := types.Eval(f.fset, f.pkg.typesPkg, expr.Pos(), exprStr) - if err != nil { - return "", false - } - if b, ok := tv.Type.(*types.Basic); ok { - if dt, ok := basicTypeKinds[b.Kind()]; ok { - return dt, true - } - } - - return "", false -} - -// firstLineOf renders the given node and returns its first line. -// It will also match the indentation of another node. -func (f *file) firstLineOf(node, match ast.Node) string { - line := f.render(node) - if i := strings.Index(line, "\n"); i >= 0 { - line = line[:i] - } - return f.indentOf(match) + line -} - -func (f *file) indentOf(node ast.Node) string { - line := srcLine(f.src, f.fset.Position(node.Pos())) - for i, r := range line { - switch r { - case ' ', '\t': - default: - return line[:i] - } - } - return line // unusual or empty line -} - -func (f *file) srcLineWithMatch(node ast.Node, pattern string) (m []string) { - line := srcLine(f.src, f.fset.Position(node.Pos())) - line = strings.TrimSuffix(line, "\n") - rx := regexp.MustCompile(pattern) - return rx.FindStringSubmatch(line) -} - -// imports returns true if the current file imports the specified package path. -func (f *file) imports(importPath string) bool { - all := astutil.Imports(f.fset, f.f) - for _, p := range all { - for _, i := range p { - uq, err := strconv.Unquote(i.Path.Value) - if err == nil && importPath == uq { - return true - } - } - } - return false -} - -// srcLine returns the complete line at p, including the terminating newline. -func srcLine(src []byte, p token.Position) string { - // Run to end of line in both directions if not at line start/end. - lo, hi := p.Offset, p.Offset+1 - for lo > 0 && src[lo-1] != '\n' { - lo-- - } - for hi < len(src) && src[hi-1] != '\n' { - hi++ - } - return string(src[lo:hi]) -} diff --git a/vendor/golang.org/x/sync/errgroup/BUILD b/vendor/golang.org/x/sync/errgroup/BUILD deleted file mode 100644 index 30f2f326cc5..00000000000 --- a/vendor/golang.org/x/sync/errgroup/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["errgroup.go"], - importmap = "k8s.io/kubernetes/vendor/golang.org/x/sync/errgroup", - importpath = "golang.org/x/sync/errgroup", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/golang.org/x/sync/errgroup/errgroup.go b/vendor/golang.org/x/sync/errgroup/errgroup.go deleted file mode 100644 index 9857fe53d3c..00000000000 --- a/vendor/golang.org/x/sync/errgroup/errgroup.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package errgroup provides synchronization, error propagation, and Context -// cancelation for groups of goroutines working on subtasks of a common task. -package errgroup - -import ( - "context" - "sync" -) - -// A Group is a collection of goroutines working on subtasks that are part of -// the same overall task. -// -// A zero Group is valid and does not cancel on error. -type Group struct { - cancel func() - - wg sync.WaitGroup - - errOnce sync.Once - err error -} - -// WithContext returns a new Group and an associated Context derived from ctx. -// -// The derived Context is canceled the first time a function passed to Go -// returns a non-nil error or the first time Wait returns, whichever occurs -// first. -func WithContext(ctx context.Context) (*Group, context.Context) { - ctx, cancel := context.WithCancel(ctx) - return &Group{cancel: cancel}, ctx -} - -// Wait blocks until all function calls from the Go method have returned, then -// returns the first non-nil error (if any) from them. -func (g *Group) Wait() error { - g.wg.Wait() - if g.cancel != nil { - g.cancel() - } - return g.err -} - -// Go calls the given function in a new goroutine. -// -// The first call to return a non-nil error cancels the group; its error will be -// returned by Wait. -func (g *Group) Go(f func() error) { - g.wg.Add(1) - - go func() { - defer g.wg.Done() - - if err := f(); err != nil { - g.errOnce.Do(func() { - g.err = err - if g.cancel != nil { - g.cancel() - } - }) - } - }() -} diff --git a/vendor/golang.org/x/tools/go/analysis/BUILD b/vendor/golang.org/x/tools/go/analysis/BUILD deleted file mode 100644 index 1a3d02dc5b4..00000000000 --- a/vendor/golang.org/x/tools/go/analysis/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "analysis.go", - "diagnostic.go", - "doc.go", - "validate.go", - ], - importmap = "k8s.io/kubernetes/vendor/golang.org/x/tools/go/analysis", - importpath = "golang.org/x/tools/go/analysis", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//vendor/golang.org/x/tools/go/analysis/passes/inspect:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/golang.org/x/tools/go/analysis/analysis.go b/vendor/golang.org/x/tools/go/analysis/analysis.go deleted file mode 100644 index bc58c31c9f0..00000000000 --- a/vendor/golang.org/x/tools/go/analysis/analysis.go +++ /dev/null @@ -1,215 +0,0 @@ -package analysis - -import ( - "flag" - "fmt" - "go/ast" - "go/token" - "go/types" - "reflect" -) - -// An Analyzer describes an analysis function and its options. -type Analyzer struct { - // The Name of the analyzer must be a valid Go identifier - // as it may appear in command-line flags, URLs, and so on. - Name string - - // Doc is the documentation for the analyzer. - // The part before the first "\n\n" is the title - // (no capital or period, max ~60 letters). - Doc string - - // Flags defines any flags accepted by the analyzer. - // The manner in which these flags are exposed to the user - // depends on the driver which runs the analyzer. - Flags flag.FlagSet - - // Run applies the analyzer to a package. - // It returns an error if the analyzer failed. - // - // On success, the Run function may return a result - // computed by the Analyzer; its type must match ResultType. - // The driver makes this result available as an input to - // another Analyzer that depends directly on this one (see - // Requires) when it analyzes the same package. - // - // To pass analysis results between packages (and thus - // potentially between address spaces), use Facts, which are - // serializable. - Run func(*Pass) (interface{}, error) - - // RunDespiteErrors allows the driver to invoke - // the Run method of this analyzer even on a - // package that contains parse or type errors. - RunDespiteErrors bool - - // Requires is a set of analyzers that must run successfully - // before this one on a given package. This analyzer may inspect - // the outputs produced by each analyzer in Requires. - // The graph over analyzers implied by Requires edges must be acyclic. - // - // Requires establishes a "horizontal" dependency between - // analysis passes (different analyzers, same package). - Requires []*Analyzer - - // ResultType is the type of the optional result of the Run function. - ResultType reflect.Type - - // FactTypes indicates that this analyzer imports and exports - // Facts of the specified concrete types. - // An analyzer that uses facts may assume that its import - // dependencies have been similarly analyzed before it runs. - // Facts must be pointers. - // - // FactTypes establishes a "vertical" dependency between - // analysis passes (same analyzer, different packages). - FactTypes []Fact -} - -func (a *Analyzer) String() string { return a.Name } - -// A Pass provides information to the Run function that -// applies a specific analyzer to a single Go package. -// -// It forms the interface between the analysis logic and the driver -// program, and has both input and an output components. -// -// As in a compiler, one pass may depend on the result computed by another. -// -// The Run function should not call any of the Pass functions concurrently. -type Pass struct { - Analyzer *Analyzer // the identity of the current analyzer - - // syntax and type information - Fset *token.FileSet // file position information - Files []*ast.File // the abstract syntax tree of each file - OtherFiles []string // names of non-Go files of this package - Pkg *types.Package // type information about the package - TypesInfo *types.Info // type information about the syntax trees - TypesSizes types.Sizes // function for computing sizes of types - - // Report reports a Diagnostic, a finding about a specific location - // in the analyzed source code such as a potential mistake. - // It may be called by the Run function. - Report func(Diagnostic) - - // ResultOf provides the inputs to this analysis pass, which are - // the corresponding results of its prerequisite analyzers. - // The map keys are the elements of Analysis.Required, - // and the type of each corresponding value is the required - // analysis's ResultType. - ResultOf map[*Analyzer]interface{} - - // -- facts -- - - // ImportObjectFact retrieves a fact associated with obj. - // Given a value ptr of type *T, where *T satisfies Fact, - // ImportObjectFact copies the value to *ptr. - // - // ImportObjectFact panics if called after the pass is complete. - // ImportObjectFact is not concurrency-safe. - ImportObjectFact func(obj types.Object, fact Fact) bool - - // ImportPackageFact retrieves a fact associated with package pkg, - // which must be this package or one of its dependencies. - // See comments for ImportObjectFact. - ImportPackageFact func(pkg *types.Package, fact Fact) bool - - // ExportObjectFact associates a fact of type *T with the obj, - // replacing any previous fact of that type. - // - // ExportObjectFact panics if it is called after the pass is - // complete, or if obj does not belong to the package being analyzed. - // ExportObjectFact is not concurrency-safe. - ExportObjectFact func(obj types.Object, fact Fact) - - // ExportPackageFact associates a fact with the current package. - // See comments for ExportObjectFact. - ExportPackageFact func(fact Fact) - - // AllPackageFacts returns a new slice containing all package facts of the analysis's FactTypes - // in unspecified order. - // WARNING: This is an experimental API and may change in the future. - AllPackageFacts func() []PackageFact - - // AllObjectFacts returns a new slice containing all object facts of the analysis's FactTypes - // in unspecified order. - // WARNING: This is an experimental API and may change in the future. - AllObjectFacts func() []ObjectFact - - /* Further fields may be added in future. */ - // For example, suggested or applied refactorings. -} - -// PackageFact is a package together with an associated fact. -// WARNING: This is an experimental API and may change in the future. -type PackageFact struct { - Package *types.Package - Fact Fact -} - -// ObjectFact is an object together with an associated fact. -// WARNING: This is an experimental API and may change in the future. -type ObjectFact struct { - Object types.Object - Fact Fact -} - -// Reportf is a helper function that reports a Diagnostic using the -// specified position and formatted error message. -func (pass *Pass) Reportf(pos token.Pos, format string, args ...interface{}) { - msg := fmt.Sprintf(format, args...) - pass.Report(Diagnostic{Pos: pos, Message: msg}) -} - -// reportNodef is a helper function that reports a Diagnostic using the -// range denoted by the AST node. -// -// WARNING: This is an experimental API and may change in the future. -func (pass *Pass) reportNodef(node ast.Node, format string, args ...interface{}) { - msg := fmt.Sprintf(format, args...) - pass.Report(Diagnostic{Pos: node.Pos(), End: node.End(), Message: msg}) -} - -func (pass *Pass) String() string { - return fmt.Sprintf("%s@%s", pass.Analyzer.Name, pass.Pkg.Path()) -} - -// A Fact is an intermediate fact produced during analysis. -// -// Each fact is associated with a named declaration (a types.Object) or -// with a package as a whole. A single object or package may have -// multiple associated facts, but only one of any particular fact type. -// -// A Fact represents a predicate such as "never returns", but does not -// represent the subject of the predicate such as "function F" or "package P". -// -// Facts may be produced in one analysis pass and consumed by another -// analysis pass even if these are in different address spaces. -// If package P imports Q, all facts about Q produced during -// analysis of that package will be available during later analysis of P. -// Facts are analogous to type export data in a build system: -// just as export data enables separate compilation of several passes, -// facts enable "separate analysis". -// -// Each pass (a, p) starts with the set of facts produced by the -// same analyzer a applied to the packages directly imported by p. -// The analysis may add facts to the set, and they may be exported in turn. -// An analysis's Run function may retrieve facts by calling -// Pass.Import{Object,Package}Fact and update them using -// Pass.Export{Object,Package}Fact. -// -// A fact is logically private to its Analysis. To pass values -// between different analyzers, use the results mechanism; -// see Analyzer.Requires, Analyzer.ResultType, and Pass.ResultOf. -// -// A Fact type must be a pointer. -// Facts are encoded and decoded using encoding/gob. -// A Fact may implement the GobEncoder/GobDecoder interfaces -// to customize its encoding. Fact encoding should not fail. -// -// A Fact should not be modified once exported. -type Fact interface { - AFact() // dummy method to avoid type errors -} diff --git a/vendor/golang.org/x/tools/go/analysis/diagnostic.go b/vendor/golang.org/x/tools/go/analysis/diagnostic.go deleted file mode 100644 index 744072cd798..00000000000 --- a/vendor/golang.org/x/tools/go/analysis/diagnostic.go +++ /dev/null @@ -1,48 +0,0 @@ -package analysis - -import "go/token" - -// A Diagnostic is a message associated with a source location or range. -// -// An Analyzer may return a variety of diagnostics; the optional Category, -// which should be a constant, may be used to classify them. -// It is primarily intended to make it easy to look up documentation. -// -// If End is provided, the diagnostic is specified to apply to the range between -// Pos and End. -type Diagnostic struct { - Pos token.Pos - End token.Pos // optional - Category string // optional - Message string - - // SuggestedFixes contains suggested fixes for a diagnostic which can be used to perform - // edits to a file that address the diagnostic. - // TODO(matloob): Should multiple SuggestedFixes be allowed for a diagnostic? - // Diagnostics should not contain SuggestedFixes that overlap. - // Experimental: This API is experimental and may change in the future. - SuggestedFixes []SuggestedFix // optional -} - -// A SuggestedFix is a code change associated with a Diagnostic that a user can choose -// to apply to their code. Usually the SuggestedFix is meant to fix the issue flagged -// by the diagnostic. -// TextEdits for a SuggestedFix should not overlap. TextEdits for a SuggestedFix -// should not contain edits for other packages. -// Experimental: This API is experimental and may change in the future. -type SuggestedFix struct { - // A description for this suggested fix to be shown to a user deciding - // whether to accept it. - Message string - TextEdits []TextEdit -} - -// A TextEdit represents the replacement of the code between Pos and End with the new text. -// Each TextEdit should apply to a single file. End should not be earlier in the file than Pos. -// Experimental: This API is experimental and may change in the future. -type TextEdit struct { - // For a pure insertion, End can either be set to Pos or token.NoPos. - Pos token.Pos - End token.Pos - NewText []byte -} diff --git a/vendor/golang.org/x/tools/go/analysis/doc.go b/vendor/golang.org/x/tools/go/analysis/doc.go deleted file mode 100644 index 2d44b0458a9..00000000000 --- a/vendor/golang.org/x/tools/go/analysis/doc.go +++ /dev/null @@ -1,336 +0,0 @@ -/* - -The analysis package defines the interface between a modular static -analysis and an analysis driver program. - -Background - -A static analysis is a function that inspects a package of Go code and -reports a set of diagnostics (typically mistakes in the code), and -perhaps produces other results as well, such as suggested refactorings -or other facts. An analysis that reports mistakes is informally called a -"checker". For example, the printf checker reports mistakes in -fmt.Printf format strings. - -A "modular" analysis is one that inspects one package at a time but can -save information from a lower-level package and use it when inspecting a -higher-level package, analogous to separate compilation in a toolchain. -The printf checker is modular: when it discovers that a function such as -log.Fatalf delegates to fmt.Printf, it records this fact, and checks -calls to that function too, including calls made from another package. - -By implementing a common interface, checkers from a variety of sources -can be easily selected, incorporated, and reused in a wide range of -driver programs including command-line tools (such as vet), text editors and -IDEs, build and test systems (such as go build, Bazel, or Buck), test -frameworks, code review tools, code-base indexers (such as SourceGraph), -documentation viewers (such as godoc), batch pipelines for large code -bases, and so on. - - -Analyzer - -The primary type in the API is Analyzer. An Analyzer statically -describes an analysis function: its name, documentation, flags, -relationship to other analyzers, and of course, its logic. - -To define an analysis, a user declares a (logically constant) variable -of type Analyzer. Here is a typical example from one of the analyzers in -the go/analysis/passes/ subdirectory: - - package unusedresult - - var Analyzer = &analysis.Analyzer{ - Name: "unusedresult", - Doc: "check for unused results of calls to some functions", - Run: run, - ... - } - - func run(pass *analysis.Pass) (interface{}, error) { - ... - } - - -An analysis driver is a program such as vet that runs a set of -analyses and prints the diagnostics that they report. -The driver program must import the list of Analyzers it needs. -Typically each Analyzer resides in a separate package. -To add a new Analyzer to an existing driver, add another item to the list: - - import ( "unusedresult"; "nilness"; "printf" ) - - var analyses = []*analysis.Analyzer{ - unusedresult.Analyzer, - nilness.Analyzer, - printf.Analyzer, - } - -A driver may use the name, flags, and documentation to provide on-line -help that describes the analyses its performs. -The doc comment contains a brief one-line summary, -optionally followed by paragraphs of explanation. -The vet command, shown below, is an example of a driver that runs -multiple analyzers. It is based on the multichecker package -(see the "Standalone commands" section for details). - - $ go build golang.org/x/tools/go/analysis/cmd/vet - $ ./vet help - vet is a tool for static analysis of Go programs. - - Usage: vet [-flag] [package] - - Registered analyzers: - - asmdecl report mismatches between assembly files and Go declarations - assign check for useless assignments - atomic check for common mistakes using the sync/atomic package - ... - unusedresult check for unused results of calls to some functions - - $ ./vet help unusedresult - unusedresult: check for unused results of calls to some functions - - Analyzer flags: - - -unusedresult.funcs value - comma-separated list of functions whose results must be used (default Error,String) - -unusedresult.stringmethods value - comma-separated list of names of methods of type func() string whose results must be used - - Some functions like fmt.Errorf return a result and have no side effects, - so it is always a mistake to discard the result. This analyzer reports - calls to certain functions in which the result of the call is ignored. - - The set of functions may be controlled using flags. - -The Analyzer type has more fields besides those shown above: - - type Analyzer struct { - Name string - Doc string - Flags flag.FlagSet - Run func(*Pass) (interface{}, error) - RunDespiteErrors bool - ResultType reflect.Type - Requires []*Analyzer - FactTypes []Fact - } - -The Flags field declares a set of named (global) flag variables that -control analysis behavior. Unlike vet, analysis flags are not declared -directly in the command line FlagSet; it is up to the driver to set the -flag variables. A driver for a single analysis, a, might expose its flag -f directly on the command line as -f, whereas a driver for multiple -analyses might prefix the flag name by the analysis name (-a.f) to avoid -ambiguity. An IDE might expose the flags through a graphical interface, -and a batch pipeline might configure them from a config file. -See the "findcall" analyzer for an example of flags in action. - -The RunDespiteErrors flag indicates whether the analysis is equipped to -handle ill-typed code. If not, the driver will skip the analysis if -there were parse or type errors. -The optional ResultType field specifies the type of the result value -computed by this analysis and made available to other analyses. -The Requires field specifies a list of analyses upon which -this one depends and whose results it may access, and it constrains the -order in which a driver may run analyses. -The FactTypes field is discussed in the section on Modularity. -The analysis package provides a Validate function to perform basic -sanity checks on an Analyzer, such as that its Requires graph is -acyclic, its fact and result types are unique, and so on. - -Finally, the Run field contains a function to be called by the driver to -execute the analysis on a single package. The driver passes it an -instance of the Pass type. - - -Pass - -A Pass describes a single unit of work: the application of a particular -Analyzer to a particular package of Go code. -The Pass provides information to the Analyzer's Run function about the -package being analyzed, and provides operations to the Run function for -reporting diagnostics and other information back to the driver. - - type Pass struct { - Fset *token.FileSet - Files []*ast.File - OtherFiles []string - Pkg *types.Package - TypesInfo *types.Info - ResultOf map[*Analyzer]interface{} - Report func(Diagnostic) - ... - } - -The Fset, Files, Pkg, and TypesInfo fields provide the syntax trees, -type information, and source positions for a single package of Go code. - -The OtherFiles field provides the names, but not the contents, of non-Go -files such as assembly that are part of this package. See the "asmdecl" -or "buildtags" analyzers for examples of loading non-Go files and report -diagnostics against them. - -The ResultOf field provides the results computed by the analyzers -required by this one, as expressed in its Analyzer.Requires field. The -driver runs the required analyzers first and makes their results -available in this map. Each Analyzer must return a value of the type -described in its Analyzer.ResultType field. -For example, the "ctrlflow" analyzer returns a *ctrlflow.CFGs, which -provides a control-flow graph for each function in the package (see -golang.org/x/tools/go/cfg); the "inspect" analyzer returns a value that -enables other Analyzers to traverse the syntax trees of the package more -efficiently; and the "buildssa" analyzer constructs an SSA-form -intermediate representation. -Each of these Analyzers extends the capabilities of later Analyzers -without adding a dependency to the core API, so an analysis tool pays -only for the extensions it needs. - -The Report function emits a diagnostic, a message associated with a -source position. For most analyses, diagnostics are their primary -result. -For convenience, Pass provides a helper method, Reportf, to report a new -diagnostic by formatting a string. -Diagnostic is defined as: - - type Diagnostic struct { - Pos token.Pos - Category string // optional - Message string - } - -The optional Category field is a short identifier that classifies the -kind of message when an analysis produces several kinds of diagnostic. - -Most Analyzers inspect typed Go syntax trees, but a few, such as asmdecl -and buildtag, inspect the raw text of Go source files or even non-Go -files such as assembly. To report a diagnostic against a line of a -raw text file, use the following sequence: - - content, err := ioutil.ReadFile(filename) - if err != nil { ... } - tf := fset.AddFile(filename, -1, len(content)) - tf.SetLinesForContent(content) - ... - pass.Reportf(tf.LineStart(line), "oops") - - -Modular analysis with Facts - -To improve efficiency and scalability, large programs are routinely -built using separate compilation: units of the program are compiled -separately, and recompiled only when one of their dependencies changes; -independent modules may be compiled in parallel. The same technique may -be applied to static analyses, for the same benefits. Such analyses are -described as "modular". - -A compiler’s type checker is an example of a modular static analysis. -Many other checkers we would like to apply to Go programs can be -understood as alternative or non-standard type systems. For example, -vet's printf checker infers whether a function has the "printf wrapper" -type, and it applies stricter checks to calls of such functions. In -addition, it records which functions are printf wrappers for use by -later analysis units to identify other printf wrappers by induction. -A result such as “f is a printf wrapper” that is not interesting by -itself but serves as a stepping stone to an interesting result (such as -a diagnostic) is called a "fact". - -The analysis API allows an analysis to define new types of facts, to -associate facts of these types with objects (named entities) declared -within the current package, or with the package as a whole, and to query -for an existing fact of a given type associated with an object or -package. - -An Analyzer that uses facts must declare their types: - - var Analyzer = &analysis.Analyzer{ - Name: "printf", - FactTypes: []analysis.Fact{new(isWrapper)}, - ... - } - - type isWrapper struct{} // => *types.Func f “is a printf wrapper” - -A driver program ensures that facts for a pass’s dependencies are -generated before analyzing the pass and are responsible for propagating -facts between from one pass to another, possibly across address spaces. -Consequently, Facts must be serializable. The API requires that drivers -use the gob encoding, an efficient, robust, self-describing binary -protocol. A fact type may implement the GobEncoder/GobDecoder interfaces -if the default encoding is unsuitable. Facts should be stateless. - -The Pass type has functions to import and export facts, -associated either with an object or with a package: - - type Pass struct { - ... - ExportObjectFact func(types.Object, Fact) - ImportObjectFact func(types.Object, Fact) bool - - ExportPackageFact func(fact Fact) - ImportPackageFact func(*types.Package, Fact) bool - } - -An Analyzer may only export facts associated with the current package or -its objects, though it may import facts from any package or object that -is an import dependency of the current package. - -Conceptually, ExportObjectFact(obj, fact) inserts fact into a hidden map keyed by -the pair (obj, TypeOf(fact)), and the ImportObjectFact function -retrieves the entry from this map and copies its value into the variable -pointed to by fact. This scheme assumes that the concrete type of fact -is a pointer; this assumption is checked by the Validate function. -See the "printf" analyzer for an example of object facts in action. - -Some driver implementations (such as those based on Bazel and Blaze) do -not currently apply analyzers to packages of the standard library. -Therefore, for best results, analyzer authors should not rely on -analysis facts being available for standard packages. -For example, although the printf checker is capable of deducing during -analysis of the log package that log.Printf is a printf-wrapper, -this fact is built in to the analyzer so that it correctly checks -calls to log.Printf even when run in a driver that does not apply -it to standard packages. We plan to remove this limitation in future. - - -Testing an Analyzer - -The analysistest subpackage provides utilities for testing an Analyzer. -In a few lines of code, it is possible to run an analyzer on a package -of testdata files and check that it reported all the expected -diagnostics and facts (and no more). Expectations are expressed using -"// want ..." comments in the input code. - - -Standalone commands - -Analyzers are provided in the form of packages that a driver program is -expected to import. The vet command imports a set of several analyzers, -but users may wish to define their own analysis commands that perform -additional checks. To simplify the task of creating an analysis command, -either for a single analyzer or for a whole suite, we provide the -singlechecker and multichecker subpackages. - -The singlechecker package provides the main function for a command that -runs one analyzer. By convention, each analyzer such as -go/passes/findcall should be accompanied by a singlechecker-based -command such as go/analysis/passes/findcall/cmd/findcall, defined in its -entirety as: - - package main - - import ( - "golang.org/x/tools/go/analysis/passes/findcall" - "golang.org/x/tools/go/analysis/singlechecker" - ) - - func main() { singlechecker.Main(findcall.Analyzer) } - -A tool that provides multiple analyzers can use multichecker in a -similar way, giving it the list of Analyzers. - - - -*/ -package analysis diff --git a/vendor/golang.org/x/tools/go/analysis/passes/inspect/BUILD b/vendor/golang.org/x/tools/go/analysis/passes/inspect/BUILD deleted file mode 100644 index f18110e34ed..00000000000 --- a/vendor/golang.org/x/tools/go/analysis/passes/inspect/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["inspect.go"], - importmap = "k8s.io/kubernetes/vendor/golang.org/x/tools/go/analysis/passes/inspect", - importpath = "golang.org/x/tools/go/analysis/passes/inspect", - visibility = ["//visibility:public"], - deps = [ - "//vendor/golang.org/x/tools/go/analysis:go_default_library", - "//vendor/golang.org/x/tools/go/ast/inspector:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/golang.org/x/tools/go/analysis/passes/inspect/inspect.go b/vendor/golang.org/x/tools/go/analysis/passes/inspect/inspect.go deleted file mode 100644 index 8213f633135..00000000000 --- a/vendor/golang.org/x/tools/go/analysis/passes/inspect/inspect.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package inspect defines an Analyzer that provides an AST inspector -// (golang.org/x/tools/go/ast/inspect.Inspect) for the syntax trees of a -// package. It is only a building block for other analyzers. -// -// Example of use in another analysis: -// -// import ( -// "golang.org/x/tools/go/analysis" -// "golang.org/x/tools/go/analysis/passes/inspect" -// "golang.org/x/tools/go/ast/inspector" -// ) -// -// var Analyzer = &analysis.Analyzer{ -// ... -// Requires: reflect.TypeOf(new(inspect.Analyzer)), -// } -// -// func run(pass *analysis.Pass) (interface{}, error) { -// inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) -// inspect.Preorder(nil, func(n ast.Node) { -// ... -// }) -// return nil -// } -// -package inspect - -import ( - "reflect" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/ast/inspector" -) - -var Analyzer = &analysis.Analyzer{ - Name: "inspect", - Doc: "optimize AST traversal for later passes", - Run: run, - RunDespiteErrors: true, - ResultType: reflect.TypeOf(new(inspector.Inspector)), -} - -func run(pass *analysis.Pass) (interface{}, error) { - return inspector.New(pass.Files), nil -} diff --git a/vendor/golang.org/x/tools/go/analysis/validate.go b/vendor/golang.org/x/tools/go/analysis/validate.go deleted file mode 100644 index 6e6cf4984fe..00000000000 --- a/vendor/golang.org/x/tools/go/analysis/validate.go +++ /dev/null @@ -1,104 +0,0 @@ -package analysis - -import ( - "fmt" - "reflect" - "unicode" -) - -// Validate reports an error if any of the analyzers are misconfigured. -// Checks include: -// that the name is a valid identifier; -// that analyzer names are unique; -// that the Requires graph is acylic; -// that analyzer fact types are unique; -// that each fact type is a pointer. -func Validate(analyzers []*Analyzer) error { - names := make(map[string]bool) - - // Map each fact type to its sole generating analyzer. - factTypes := make(map[reflect.Type]*Analyzer) - - // Traverse the Requires graph, depth first. - const ( - white = iota - grey - black - finished - ) - color := make(map[*Analyzer]uint8) - var visit func(a *Analyzer) error - visit = func(a *Analyzer) error { - if a == nil { - return fmt.Errorf("nil *Analyzer") - } - if color[a] == white { - color[a] = grey - - // names - if !validIdent(a.Name) { - return fmt.Errorf("invalid analyzer name %q", a) - } - if names[a.Name] { - return fmt.Errorf("duplicate analyzer name %q", a) - } - names[a.Name] = true - - if a.Doc == "" { - return fmt.Errorf("analyzer %q is undocumented", a) - } - - // fact types - for _, f := range a.FactTypes { - if f == nil { - return fmt.Errorf("analyzer %s has nil FactType", a) - } - t := reflect.TypeOf(f) - if prev := factTypes[t]; prev != nil { - return fmt.Errorf("fact type %s registered by two analyzers: %v, %v", - t, a, prev) - } - if t.Kind() != reflect.Ptr { - return fmt.Errorf("%s: fact type %s is not a pointer", a, t) - } - factTypes[t] = a - } - - // recursion - for i, req := range a.Requires { - if err := visit(req); err != nil { - return fmt.Errorf("%s.Requires[%d]: %v", a.Name, i, err) - } - } - color[a] = black - } - - return nil - } - for _, a := range analyzers { - if err := visit(a); err != nil { - return err - } - } - - // Reject duplicates among analyzers. - // Precondition: color[a] == black. - // Postcondition: color[a] == finished. - for _, a := range analyzers { - if color[a] == finished { - return fmt.Errorf("duplicate analyzer: %s", a.Name) - } - color[a] = finished - } - - return nil -} - -func validIdent(name string) bool { - for i, r := range name { - if !(r == '_' || unicode.IsLetter(r) || i > 0 && unicode.IsDigit(r)) { - return false - } - } - return name != "" -} diff --git a/vendor/golang.org/x/tools/go/ast/inspector/BUILD b/vendor/golang.org/x/tools/go/ast/inspector/BUILD deleted file mode 100644 index eed5dabcf55..00000000000 --- a/vendor/golang.org/x/tools/go/ast/inspector/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "inspector.go", - "typeof.go", - ], - importmap = "k8s.io/kubernetes/vendor/golang.org/x/tools/go/ast/inspector", - importpath = "golang.org/x/tools/go/ast/inspector", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/golang.org/x/tools/go/ast/inspector/inspector.go b/vendor/golang.org/x/tools/go/ast/inspector/inspector.go deleted file mode 100644 index ddbdd3f08fc..00000000000 --- a/vendor/golang.org/x/tools/go/ast/inspector/inspector.go +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package inspector provides helper functions for traversal over the -// syntax trees of a package, including node filtering by type, and -// materialization of the traversal stack. -// -// During construction, the inspector does a complete traversal and -// builds a list of push/pop events and their node type. Subsequent -// method calls that request a traversal scan this list, rather than walk -// the AST, and perform type filtering using efficient bit sets. -// -// Experiments suggest the inspector's traversals are about 2.5x faster -// than ast.Inspect, but it may take around 5 traversals for this -// benefit to amortize the inspector's construction cost. -// If efficiency is the primary concern, do not use Inspector for -// one-off traversals. -package inspector - -// There are four orthogonal features in a traversal: -// 1 type filtering -// 2 pruning -// 3 postorder calls to f -// 4 stack -// Rather than offer all of them in the API, -// only a few combinations are exposed: -// - Preorder is the fastest and has fewest features, -// but is the most commonly needed traversal. -// - Nodes and WithStack both provide pruning and postorder calls, -// even though few clients need it, because supporting two versions -// is not justified. -// More combinations could be supported by expressing them as -// wrappers around a more generic traversal, but this was measured -// and found to degrade performance significantly (30%). - -import ( - "go/ast" -) - -// An Inspector provides methods for inspecting -// (traversing) the syntax trees of a package. -type Inspector struct { - events []event -} - -// New returns an Inspector for the specified syntax trees. -func New(files []*ast.File) *Inspector { - return &Inspector{traverse(files)} -} - -// An event represents a push or a pop -// of an ast.Node during a traversal. -type event struct { - node ast.Node - typ uint64 // typeOf(node) - index int // 1 + index of corresponding pop event, or 0 if this is a pop -} - -// Preorder visits all the nodes of the files supplied to New in -// depth-first order. It calls f(n) for each node n before it visits -// n's children. -// -// The types argument, if non-empty, enables type-based filtering of -// events. The function f if is called only for nodes whose type -// matches an element of the types slice. -func (in *Inspector) Preorder(types []ast.Node, f func(ast.Node)) { - // Because it avoids postorder calls to f, and the pruning - // check, Preorder is almost twice as fast as Nodes. The two - // features seem to contribute similar slowdowns (~1.4x each). - - mask := maskOf(types) - for i := 0; i < len(in.events); { - ev := in.events[i] - if ev.typ&mask != 0 { - if ev.index > 0 { - f(ev.node) - } - } - i++ - } -} - -// Nodes visits the nodes of the files supplied to New in depth-first -// order. It calls f(n, true) for each node n before it visits n's -// children. If f returns true, Nodes invokes f recursively for each -// of the non-nil children of the node, followed by a call of -// f(n, false). -// -// The types argument, if non-empty, enables type-based filtering of -// events. The function f if is called only for nodes whose type -// matches an element of the types slice. -func (in *Inspector) Nodes(types []ast.Node, f func(n ast.Node, push bool) (prune bool)) { - mask := maskOf(types) - for i := 0; i < len(in.events); { - ev := in.events[i] - if ev.typ&mask != 0 { - if ev.index > 0 { - // push - if !f(ev.node, true) { - i = ev.index // jump to corresponding pop + 1 - continue - } - } else { - // pop - f(ev.node, false) - } - } - i++ - } -} - -// WithStack visits nodes in a similar manner to Nodes, but it -// supplies each call to f an additional argument, the current -// traversal stack. The stack's first element is the outermost node, -// an *ast.File; its last is the innermost, n. -func (in *Inspector) WithStack(types []ast.Node, f func(n ast.Node, push bool, stack []ast.Node) (prune bool)) { - mask := maskOf(types) - var stack []ast.Node - for i := 0; i < len(in.events); { - ev := in.events[i] - if ev.index > 0 { - // push - stack = append(stack, ev.node) - if ev.typ&mask != 0 { - if !f(ev.node, true, stack) { - i = ev.index - stack = stack[:len(stack)-1] - continue - } - } - } else { - // pop - if ev.typ&mask != 0 { - f(ev.node, false, stack) - } - stack = stack[:len(stack)-1] - } - i++ - } -} - -// traverse builds the table of events representing a traversal. -func traverse(files []*ast.File) []event { - // Preallocate approximate number of events - // based on source file extent. - // This makes traverse faster by 4x (!). - var extent int - for _, f := range files { - extent += int(f.End() - f.Pos()) - } - // This estimate is based on the net/http package. - events := make([]event, 0, extent*33/100) - - var stack []event - for _, f := range files { - ast.Inspect(f, func(n ast.Node) bool { - if n != nil { - // push - ev := event{ - node: n, - typ: typeOf(n), - index: len(events), // push event temporarily holds own index - } - stack = append(stack, ev) - events = append(events, ev) - } else { - // pop - ev := stack[len(stack)-1] - stack = stack[:len(stack)-1] - - events[ev.index].index = len(events) + 1 // make push refer to pop - - ev.index = 0 // turn ev into a pop event - events = append(events, ev) - } - return true - }) - } - - return events -} diff --git a/vendor/golang.org/x/tools/go/ast/inspector/typeof.go b/vendor/golang.org/x/tools/go/ast/inspector/typeof.go deleted file mode 100644 index d61301b133d..00000000000 --- a/vendor/golang.org/x/tools/go/ast/inspector/typeof.go +++ /dev/null @@ -1,216 +0,0 @@ -package inspector - -// This file defines func typeOf(ast.Node) uint64. -// -// The initial map-based implementation was too slow; -// see https://go-review.googlesource.com/c/tools/+/135655/1/go/ast/inspector/inspector.go#196 - -import "go/ast" - -const ( - nArrayType = iota - nAssignStmt - nBadDecl - nBadExpr - nBadStmt - nBasicLit - nBinaryExpr - nBlockStmt - nBranchStmt - nCallExpr - nCaseClause - nChanType - nCommClause - nComment - nCommentGroup - nCompositeLit - nDeclStmt - nDeferStmt - nEllipsis - nEmptyStmt - nExprStmt - nField - nFieldList - nFile - nForStmt - nFuncDecl - nFuncLit - nFuncType - nGenDecl - nGoStmt - nIdent - nIfStmt - nImportSpec - nIncDecStmt - nIndexExpr - nInterfaceType - nKeyValueExpr - nLabeledStmt - nMapType - nPackage - nParenExpr - nRangeStmt - nReturnStmt - nSelectStmt - nSelectorExpr - nSendStmt - nSliceExpr - nStarExpr - nStructType - nSwitchStmt - nTypeAssertExpr - nTypeSpec - nTypeSwitchStmt - nUnaryExpr - nValueSpec -) - -// typeOf returns a distinct single-bit value that represents the type of n. -// -// Various implementations were benchmarked with BenchmarkNewInspector: -// GOGC=off -// - type switch 4.9-5.5ms 2.1ms -// - binary search over a sorted list of types 5.5-5.9ms 2.5ms -// - linear scan, frequency-ordered list 5.9-6.1ms 2.7ms -// - linear scan, unordered list 6.4ms 2.7ms -// - hash table 6.5ms 3.1ms -// A perfect hash seemed like overkill. -// -// The compiler's switch statement is the clear winner -// as it produces a binary tree in code, -// with constant conditions and good branch prediction. -// (Sadly it is the most verbose in source code.) -// Binary search suffered from poor branch prediction. -// -func typeOf(n ast.Node) uint64 { - // Fast path: nearly half of all nodes are identifiers. - if _, ok := n.(*ast.Ident); ok { - return 1 << nIdent - } - - // These cases include all nodes encountered by ast.Inspect. - switch n.(type) { - case *ast.ArrayType: - return 1 << nArrayType - case *ast.AssignStmt: - return 1 << nAssignStmt - case *ast.BadDecl: - return 1 << nBadDecl - case *ast.BadExpr: - return 1 << nBadExpr - case *ast.BadStmt: - return 1 << nBadStmt - case *ast.BasicLit: - return 1 << nBasicLit - case *ast.BinaryExpr: - return 1 << nBinaryExpr - case *ast.BlockStmt: - return 1 << nBlockStmt - case *ast.BranchStmt: - return 1 << nBranchStmt - case *ast.CallExpr: - return 1 << nCallExpr - case *ast.CaseClause: - return 1 << nCaseClause - case *ast.ChanType: - return 1 << nChanType - case *ast.CommClause: - return 1 << nCommClause - case *ast.Comment: - return 1 << nComment - case *ast.CommentGroup: - return 1 << nCommentGroup - case *ast.CompositeLit: - return 1 << nCompositeLit - case *ast.DeclStmt: - return 1 << nDeclStmt - case *ast.DeferStmt: - return 1 << nDeferStmt - case *ast.Ellipsis: - return 1 << nEllipsis - case *ast.EmptyStmt: - return 1 << nEmptyStmt - case *ast.ExprStmt: - return 1 << nExprStmt - case *ast.Field: - return 1 << nField - case *ast.FieldList: - return 1 << nFieldList - case *ast.File: - return 1 << nFile - case *ast.ForStmt: - return 1 << nForStmt - case *ast.FuncDecl: - return 1 << nFuncDecl - case *ast.FuncLit: - return 1 << nFuncLit - case *ast.FuncType: - return 1 << nFuncType - case *ast.GenDecl: - return 1 << nGenDecl - case *ast.GoStmt: - return 1 << nGoStmt - case *ast.Ident: - return 1 << nIdent - case *ast.IfStmt: - return 1 << nIfStmt - case *ast.ImportSpec: - return 1 << nImportSpec - case *ast.IncDecStmt: - return 1 << nIncDecStmt - case *ast.IndexExpr: - return 1 << nIndexExpr - case *ast.InterfaceType: - return 1 << nInterfaceType - case *ast.KeyValueExpr: - return 1 << nKeyValueExpr - case *ast.LabeledStmt: - return 1 << nLabeledStmt - case *ast.MapType: - return 1 << nMapType - case *ast.Package: - return 1 << nPackage - case *ast.ParenExpr: - return 1 << nParenExpr - case *ast.RangeStmt: - return 1 << nRangeStmt - case *ast.ReturnStmt: - return 1 << nReturnStmt - case *ast.SelectStmt: - return 1 << nSelectStmt - case *ast.SelectorExpr: - return 1 << nSelectorExpr - case *ast.SendStmt: - return 1 << nSendStmt - case *ast.SliceExpr: - return 1 << nSliceExpr - case *ast.StarExpr: - return 1 << nStarExpr - case *ast.StructType: - return 1 << nStructType - case *ast.SwitchStmt: - return 1 << nSwitchStmt - case *ast.TypeAssertExpr: - return 1 << nTypeAssertExpr - case *ast.TypeSpec: - return 1 << nTypeSpec - case *ast.TypeSwitchStmt: - return 1 << nTypeSwitchStmt - case *ast.UnaryExpr: - return 1 << nUnaryExpr - case *ast.ValueSpec: - return 1 << nValueSpec - } - return 0 -} - -func maskOf(nodes []ast.Node) uint64 { - if nodes == nil { - return 1<<64 - 1 // match all node types - } - var mask uint64 - for _, n := range nodes { - mask |= typeOf(n) - } - return mask -} diff --git a/vendor/golang.org/x/tools/go/buildutil/BUILD b/vendor/golang.org/x/tools/go/buildutil/BUILD deleted file mode 100644 index 3cbf65395e0..00000000000 --- a/vendor/golang.org/x/tools/go/buildutil/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "allpackages.go", - "fakecontext.go", - "overlay.go", - "tags.go", - "util.go", - ], - importmap = "k8s.io/kubernetes/vendor/golang.org/x/tools/go/buildutil", - importpath = "golang.org/x/tools/go/buildutil", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/golang.org/x/tools/go/buildutil/allpackages.go b/vendor/golang.org/x/tools/go/buildutil/allpackages.go deleted file mode 100644 index c0cb03e7bee..00000000000 --- a/vendor/golang.org/x/tools/go/buildutil/allpackages.go +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package buildutil provides utilities related to the go/build -// package in the standard library. -// -// All I/O is done via the build.Context file system interface, which must -// be concurrency-safe. -package buildutil // import "golang.org/x/tools/go/buildutil" - -import ( - "go/build" - "os" - "path/filepath" - "sort" - "strings" - "sync" -) - -// AllPackages returns the package path of each Go package in any source -// directory of the specified build context (e.g. $GOROOT or an element -// of $GOPATH). Errors are ignored. The results are sorted. -// All package paths are canonical, and thus may contain "/vendor/". -// -// The result may include import paths for directories that contain no -// *.go files, such as "archive" (in $GOROOT/src). -// -// All I/O is done via the build.Context file system interface, -// which must be concurrency-safe. -// -func AllPackages(ctxt *build.Context) []string { - var list []string - ForEachPackage(ctxt, func(pkg string, _ error) { - list = append(list, pkg) - }) - sort.Strings(list) - return list -} - -// ForEachPackage calls the found function with the package path of -// each Go package it finds in any source directory of the specified -// build context (e.g. $GOROOT or an element of $GOPATH). -// All package paths are canonical, and thus may contain "/vendor/". -// -// If the package directory exists but could not be read, the second -// argument to the found function provides the error. -// -// All I/O is done via the build.Context file system interface, -// which must be concurrency-safe. -// -func ForEachPackage(ctxt *build.Context, found func(importPath string, err error)) { - ch := make(chan item) - - var wg sync.WaitGroup - for _, root := range ctxt.SrcDirs() { - root := root - wg.Add(1) - go func() { - allPackages(ctxt, root, ch) - wg.Done() - }() - } - go func() { - wg.Wait() - close(ch) - }() - - // All calls to found occur in the caller's goroutine. - for i := range ch { - found(i.importPath, i.err) - } -} - -type item struct { - importPath string - err error // (optional) -} - -// We use a process-wide counting semaphore to limit -// the number of parallel calls to ReadDir. -var ioLimit = make(chan bool, 20) - -func allPackages(ctxt *build.Context, root string, ch chan<- item) { - root = filepath.Clean(root) + string(os.PathSeparator) - - var wg sync.WaitGroup - - var walkDir func(dir string) - walkDir = func(dir string) { - // Avoid .foo, _foo, and testdata directory trees. - base := filepath.Base(dir) - if base == "" || base[0] == '.' || base[0] == '_' || base == "testdata" { - return - } - - pkg := filepath.ToSlash(strings.TrimPrefix(dir, root)) - - // Prune search if we encounter any of these import paths. - switch pkg { - case "builtin": - return - } - - ioLimit <- true - files, err := ReadDir(ctxt, dir) - <-ioLimit - if pkg != "" || err != nil { - ch <- item{pkg, err} - } - for _, fi := range files { - fi := fi - if fi.IsDir() { - wg.Add(1) - go func() { - walkDir(filepath.Join(dir, fi.Name())) - wg.Done() - }() - } - } - } - - walkDir(root) - wg.Wait() -} - -// ExpandPatterns returns the set of packages matched by patterns, -// which may have the following forms: -// -// golang.org/x/tools/cmd/guru # a single package -// golang.org/x/tools/... # all packages beneath dir -// ... # the entire workspace. -// -// Order is significant: a pattern preceded by '-' removes matching -// packages from the set. For example, these patterns match all encoding -// packages except encoding/xml: -// -// encoding/... -encoding/xml -// -// A trailing slash in a pattern is ignored. (Path components of Go -// package names are separated by slash, not the platform's path separator.) -// -func ExpandPatterns(ctxt *build.Context, patterns []string) map[string]bool { - // TODO(adonovan): support other features of 'go list': - // - "std"/"cmd"/"all" meta-packages - // - "..." not at the end of a pattern - // - relative patterns using "./" or "../" prefix - - pkgs := make(map[string]bool) - doPkg := func(pkg string, neg bool) { - if neg { - delete(pkgs, pkg) - } else { - pkgs[pkg] = true - } - } - - // Scan entire workspace if wildcards are present. - // TODO(adonovan): opt: scan only the necessary subtrees of the workspace. - var all []string - for _, arg := range patterns { - if strings.HasSuffix(arg, "...") { - all = AllPackages(ctxt) - break - } - } - - for _, arg := range patterns { - if arg == "" { - continue - } - - neg := arg[0] == '-' - if neg { - arg = arg[1:] - } - - if arg == "..." { - // ... matches all packages - for _, pkg := range all { - doPkg(pkg, neg) - } - } else if dir := strings.TrimSuffix(arg, "/..."); dir != arg { - // dir/... matches all packages beneath dir - for _, pkg := range all { - if strings.HasPrefix(pkg, dir) && - (len(pkg) == len(dir) || pkg[len(dir)] == '/') { - doPkg(pkg, neg) - } - } - } else { - // single package - doPkg(strings.TrimSuffix(arg, "/"), neg) - } - } - - return pkgs -} diff --git a/vendor/golang.org/x/tools/go/buildutil/fakecontext.go b/vendor/golang.org/x/tools/go/buildutil/fakecontext.go deleted file mode 100644 index 8b7f066739f..00000000000 --- a/vendor/golang.org/x/tools/go/buildutil/fakecontext.go +++ /dev/null @@ -1,109 +0,0 @@ -package buildutil - -import ( - "fmt" - "go/build" - "io" - "io/ioutil" - "os" - "path" - "path/filepath" - "sort" - "strings" - "time" -) - -// FakeContext returns a build.Context for the fake file tree specified -// by pkgs, which maps package import paths to a mapping from file base -// names to contents. -// -// The fake Context has a GOROOT of "/go" and no GOPATH, and overrides -// the necessary file access methods to read from memory instead of the -// real file system. -// -// Unlike a real file tree, the fake one has only two levels---packages -// and files---so ReadDir("/go/src/") returns all packages under -// /go/src/ including, for instance, "math" and "math/big". -// ReadDir("/go/src/math/big") would return all the files in the -// "math/big" package. -// -func FakeContext(pkgs map[string]map[string]string) *build.Context { - clean := func(filename string) string { - f := path.Clean(filepath.ToSlash(filename)) - // Removing "/go/src" while respecting segment - // boundaries has this unfortunate corner case: - if f == "/go/src" { - return "" - } - return strings.TrimPrefix(f, "/go/src/") - } - - ctxt := build.Default // copy - ctxt.GOROOT = "/go" - ctxt.GOPATH = "" - ctxt.Compiler = "gc" - ctxt.IsDir = func(dir string) bool { - dir = clean(dir) - if dir == "" { - return true // needed by (*build.Context).SrcDirs - } - return pkgs[dir] != nil - } - ctxt.ReadDir = func(dir string) ([]os.FileInfo, error) { - dir = clean(dir) - var fis []os.FileInfo - if dir == "" { - // enumerate packages - for importPath := range pkgs { - fis = append(fis, fakeDirInfo(importPath)) - } - } else { - // enumerate files of package - for basename := range pkgs[dir] { - fis = append(fis, fakeFileInfo(basename)) - } - } - sort.Sort(byName(fis)) - return fis, nil - } - ctxt.OpenFile = func(filename string) (io.ReadCloser, error) { - filename = clean(filename) - dir, base := path.Split(filename) - content, ok := pkgs[path.Clean(dir)][base] - if !ok { - return nil, fmt.Errorf("file not found: %s", filename) - } - return ioutil.NopCloser(strings.NewReader(content)), nil - } - ctxt.IsAbsPath = func(path string) bool { - path = filepath.ToSlash(path) - // Don't rely on the default (filepath.Path) since on - // Windows, it reports virtual paths as non-absolute. - return strings.HasPrefix(path, "/") - } - return &ctxt -} - -type byName []os.FileInfo - -func (s byName) Len() int { return len(s) } -func (s byName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s byName) Less(i, j int) bool { return s[i].Name() < s[j].Name() } - -type fakeFileInfo string - -func (fi fakeFileInfo) Name() string { return string(fi) } -func (fakeFileInfo) Sys() interface{} { return nil } -func (fakeFileInfo) ModTime() time.Time { return time.Time{} } -func (fakeFileInfo) IsDir() bool { return false } -func (fakeFileInfo) Size() int64 { return 0 } -func (fakeFileInfo) Mode() os.FileMode { return 0644 } - -type fakeDirInfo string - -func (fd fakeDirInfo) Name() string { return string(fd) } -func (fakeDirInfo) Sys() interface{} { return nil } -func (fakeDirInfo) ModTime() time.Time { return time.Time{} } -func (fakeDirInfo) IsDir() bool { return true } -func (fakeDirInfo) Size() int64 { return 0 } -func (fakeDirInfo) Mode() os.FileMode { return 0755 } diff --git a/vendor/golang.org/x/tools/go/buildutil/overlay.go b/vendor/golang.org/x/tools/go/buildutil/overlay.go deleted file mode 100644 index 3f71c4fef75..00000000000 --- a/vendor/golang.org/x/tools/go/buildutil/overlay.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package buildutil - -import ( - "bufio" - "bytes" - "fmt" - "go/build" - "io" - "io/ioutil" - "path/filepath" - "strconv" - "strings" -) - -// OverlayContext overlays a build.Context with additional files from -// a map. Files in the map take precedence over other files. -// -// In addition to plain string comparison, two file names are -// considered equal if their base names match and their directory -// components point at the same directory on the file system. That is, -// symbolic links are followed for directories, but not files. -// -// A common use case for OverlayContext is to allow editors to pass in -// a set of unsaved, modified files. -// -// Currently, only the Context.OpenFile function will respect the -// overlay. This may change in the future. -func OverlayContext(orig *build.Context, overlay map[string][]byte) *build.Context { - // TODO(dominikh): Implement IsDir, HasSubdir and ReadDir - - rc := func(data []byte) (io.ReadCloser, error) { - return ioutil.NopCloser(bytes.NewBuffer(data)), nil - } - - copy := *orig // make a copy - ctxt := © - ctxt.OpenFile = func(path string) (io.ReadCloser, error) { - // Fast path: names match exactly. - if content, ok := overlay[path]; ok { - return rc(content) - } - - // Slow path: check for same file under a different - // alias, perhaps due to a symbolic link. - for filename, content := range overlay { - if sameFile(path, filename) { - return rc(content) - } - } - - return OpenFile(orig, path) - } - return ctxt -} - -// ParseOverlayArchive parses an archive containing Go files and their -// contents. The result is intended to be used with OverlayContext. -// -// -// Archive format -// -// The archive consists of a series of files. Each file consists of a -// name, a decimal file size and the file contents, separated by -// newlinews. No newline follows after the file contents. -func ParseOverlayArchive(archive io.Reader) (map[string][]byte, error) { - overlay := make(map[string][]byte) - r := bufio.NewReader(archive) - for { - // Read file name. - filename, err := r.ReadString('\n') - if err != nil { - if err == io.EOF { - break // OK - } - return nil, fmt.Errorf("reading archive file name: %v", err) - } - filename = filepath.Clean(strings.TrimSpace(filename)) - - // Read file size. - sz, err := r.ReadString('\n') - if err != nil { - return nil, fmt.Errorf("reading size of archive file %s: %v", filename, err) - } - sz = strings.TrimSpace(sz) - size, err := strconv.ParseUint(sz, 10, 32) - if err != nil { - return nil, fmt.Errorf("parsing size of archive file %s: %v", filename, err) - } - - // Read file content. - content := make([]byte, size) - if _, err := io.ReadFull(r, content); err != nil { - return nil, fmt.Errorf("reading archive file %s: %v", filename, err) - } - overlay[filename] = content - } - - return overlay, nil -} diff --git a/vendor/golang.org/x/tools/go/buildutil/tags.go b/vendor/golang.org/x/tools/go/buildutil/tags.go deleted file mode 100644 index 486606f3768..00000000000 --- a/vendor/golang.org/x/tools/go/buildutil/tags.go +++ /dev/null @@ -1,75 +0,0 @@ -package buildutil - -// This logic was copied from stringsFlag from $GOROOT/src/cmd/go/build.go. - -import "fmt" - -const TagsFlagDoc = "a list of `build tags` to consider satisfied during the build. " + - "For more information about build tags, see the description of " + - "build constraints in the documentation for the go/build package" - -// TagsFlag is an implementation of the flag.Value and flag.Getter interfaces that parses -// a flag value in the same manner as go build's -tags flag and -// populates a []string slice. -// -// See $GOROOT/src/go/build/doc.go for description of build tags. -// See $GOROOT/src/cmd/go/doc.go for description of 'go build -tags' flag. -// -// Example: -// flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc) -type TagsFlag []string - -func (v *TagsFlag) Set(s string) error { - var err error - *v, err = splitQuotedFields(s) - if *v == nil { - *v = []string{} - } - return err -} - -func (v *TagsFlag) Get() interface{} { return *v } - -func splitQuotedFields(s string) ([]string, error) { - // Split fields allowing '' or "" around elements. - // Quotes further inside the string do not count. - var f []string - for len(s) > 0 { - for len(s) > 0 && isSpaceByte(s[0]) { - s = s[1:] - } - if len(s) == 0 { - break - } - // Accepted quoted string. No unescaping inside. - if s[0] == '"' || s[0] == '\'' { - quote := s[0] - s = s[1:] - i := 0 - for i < len(s) && s[i] != quote { - i++ - } - if i >= len(s) { - return nil, fmt.Errorf("unterminated %c string", quote) - } - f = append(f, s[:i]) - s = s[i+1:] - continue - } - i := 0 - for i < len(s) && !isSpaceByte(s[i]) { - i++ - } - f = append(f, s[:i]) - s = s[i:] - } - return f, nil -} - -func (v *TagsFlag) String() string { - return "" -} - -func isSpaceByte(c byte) bool { - return c == ' ' || c == '\t' || c == '\n' || c == '\r' -} diff --git a/vendor/golang.org/x/tools/go/buildutil/util.go b/vendor/golang.org/x/tools/go/buildutil/util.go deleted file mode 100644 index fc923d7a702..00000000000 --- a/vendor/golang.org/x/tools/go/buildutil/util.go +++ /dev/null @@ -1,212 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package buildutil - -import ( - "fmt" - "go/ast" - "go/build" - "go/parser" - "go/token" - "io" - "io/ioutil" - "os" - "path" - "path/filepath" - "strings" -) - -// ParseFile behaves like parser.ParseFile, -// but uses the build context's file system interface, if any. -// -// If file is not absolute (as defined by IsAbsPath), the (dir, file) -// components are joined using JoinPath; dir must be absolute. -// -// The displayPath function, if provided, is used to transform the -// filename that will be attached to the ASTs. -// -// TODO(adonovan): call this from go/loader.parseFiles when the tree thaws. -// -func ParseFile(fset *token.FileSet, ctxt *build.Context, displayPath func(string) string, dir string, file string, mode parser.Mode) (*ast.File, error) { - if !IsAbsPath(ctxt, file) { - file = JoinPath(ctxt, dir, file) - } - rd, err := OpenFile(ctxt, file) - if err != nil { - return nil, err - } - defer rd.Close() // ignore error - if displayPath != nil { - file = displayPath(file) - } - return parser.ParseFile(fset, file, rd, mode) -} - -// ContainingPackage returns the package containing filename. -// -// If filename is not absolute, it is interpreted relative to working directory dir. -// All I/O is via the build context's file system interface, if any. -// -// The '...Files []string' fields of the resulting build.Package are not -// populated (build.FindOnly mode). -// -func ContainingPackage(ctxt *build.Context, dir, filename string) (*build.Package, error) { - if !IsAbsPath(ctxt, filename) { - filename = JoinPath(ctxt, dir, filename) - } - - // We must not assume the file tree uses - // "/" always, - // `\` always, - // or os.PathSeparator (which varies by platform), - // but to make any progress, we are forced to assume that - // paths will not use `\` unless the PathSeparator - // is also `\`, thus we can rely on filepath.ToSlash for some sanity. - - dirSlash := path.Dir(filepath.ToSlash(filename)) + "/" - - // We assume that no source root (GOPATH[i] or GOROOT) contains any other. - for _, srcdir := range ctxt.SrcDirs() { - srcdirSlash := filepath.ToSlash(srcdir) + "/" - if importPath, ok := HasSubdir(ctxt, srcdirSlash, dirSlash); ok { - return ctxt.Import(importPath, dir, build.FindOnly) - } - } - - return nil, fmt.Errorf("can't find package containing %s", filename) -} - -// -- Effective methods of file system interface ------------------------- - -// (go/build.Context defines these as methods, but does not export them.) - -// hasSubdir calls ctxt.HasSubdir (if not nil) or else uses -// the local file system to answer the question. -func HasSubdir(ctxt *build.Context, root, dir string) (rel string, ok bool) { - if f := ctxt.HasSubdir; f != nil { - return f(root, dir) - } - - // Try using paths we received. - if rel, ok = hasSubdir(root, dir); ok { - return - } - - // Try expanding symlinks and comparing - // expanded against unexpanded and - // expanded against expanded. - rootSym, _ := filepath.EvalSymlinks(root) - dirSym, _ := filepath.EvalSymlinks(dir) - - if rel, ok = hasSubdir(rootSym, dir); ok { - return - } - if rel, ok = hasSubdir(root, dirSym); ok { - return - } - return hasSubdir(rootSym, dirSym) -} - -func hasSubdir(root, dir string) (rel string, ok bool) { - const sep = string(filepath.Separator) - root = filepath.Clean(root) - if !strings.HasSuffix(root, sep) { - root += sep - } - - dir = filepath.Clean(dir) - if !strings.HasPrefix(dir, root) { - return "", false - } - - return filepath.ToSlash(dir[len(root):]), true -} - -// FileExists returns true if the specified file exists, -// using the build context's file system interface. -func FileExists(ctxt *build.Context, path string) bool { - if ctxt.OpenFile != nil { - r, err := ctxt.OpenFile(path) - if err != nil { - return false - } - r.Close() // ignore error - return true - } - _, err := os.Stat(path) - return err == nil -} - -// OpenFile behaves like os.Open, -// but uses the build context's file system interface, if any. -func OpenFile(ctxt *build.Context, path string) (io.ReadCloser, error) { - if ctxt.OpenFile != nil { - return ctxt.OpenFile(path) - } - return os.Open(path) -} - -// IsAbsPath behaves like filepath.IsAbs, -// but uses the build context's file system interface, if any. -func IsAbsPath(ctxt *build.Context, path string) bool { - if ctxt.IsAbsPath != nil { - return ctxt.IsAbsPath(path) - } - return filepath.IsAbs(path) -} - -// JoinPath behaves like filepath.Join, -// but uses the build context's file system interface, if any. -func JoinPath(ctxt *build.Context, path ...string) string { - if ctxt.JoinPath != nil { - return ctxt.JoinPath(path...) - } - return filepath.Join(path...) -} - -// IsDir behaves like os.Stat plus IsDir, -// but uses the build context's file system interface, if any. -func IsDir(ctxt *build.Context, path string) bool { - if ctxt.IsDir != nil { - return ctxt.IsDir(path) - } - fi, err := os.Stat(path) - return err == nil && fi.IsDir() -} - -// ReadDir behaves like ioutil.ReadDir, -// but uses the build context's file system interface, if any. -func ReadDir(ctxt *build.Context, path string) ([]os.FileInfo, error) { - if ctxt.ReadDir != nil { - return ctxt.ReadDir(path) - } - return ioutil.ReadDir(path) -} - -// SplitPathList behaves like filepath.SplitList, -// but uses the build context's file system interface, if any. -func SplitPathList(ctxt *build.Context, s string) []string { - if ctxt.SplitPathList != nil { - return ctxt.SplitPathList(s) - } - return filepath.SplitList(s) -} - -// sameFile returns true if x and y have the same basename and denote -// the same file. -// -func sameFile(x, y string) bool { - if path.Clean(x) == path.Clean(y) { - return true - } - if filepath.Base(x) == filepath.Base(y) { // (optimisation) - if xi, err := os.Stat(x); err == nil { - if yi, err := os.Stat(y); err == nil { - return os.SameFile(xi, yi) - } - } - } - return false -} diff --git a/vendor/golang.org/x/tools/go/types/objectpath/BUILD b/vendor/golang.org/x/tools/go/types/objectpath/BUILD deleted file mode 100644 index 352706e96e6..00000000000 --- a/vendor/golang.org/x/tools/go/types/objectpath/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["objectpath.go"], - importmap = "k8s.io/kubernetes/vendor/golang.org/x/tools/go/types/objectpath", - importpath = "golang.org/x/tools/go/types/objectpath", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go deleted file mode 100644 index 0d85488efb6..00000000000 --- a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go +++ /dev/null @@ -1,523 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package objectpath defines a naming scheme for types.Objects -// (that is, named entities in Go programs) relative to their enclosing -// package. -// -// Type-checker objects are canonical, so they are usually identified by -// their address in memory (a pointer), but a pointer has meaning only -// within one address space. By contrast, objectpath names allow the -// identity of an object to be sent from one program to another, -// establishing a correspondence between types.Object variables that are -// distinct but logically equivalent. -// -// A single object may have multiple paths. In this example, -// type A struct{ X int } -// type B A -// the field X has two paths due to its membership of both A and B. -// The For(obj) function always returns one of these paths, arbitrarily -// but consistently. -package objectpath - -import ( - "fmt" - "strconv" - "strings" - - "go/types" -) - -// A Path is an opaque name that identifies a types.Object -// relative to its package. Conceptually, the name consists of a -// sequence of destructuring operations applied to the package scope -// to obtain the original object. -// The name does not include the package itself. -type Path string - -// Encoding -// -// An object path is a textual and (with training) human-readable encoding -// of a sequence of destructuring operators, starting from a types.Package. -// The sequences represent a path through the package/object/type graph. -// We classify these operators by their type: -// -// PO package->object Package.Scope.Lookup -// OT object->type Object.Type -// TT type->type Type.{Elem,Key,Params,Results,Underlying} [EKPRU] -// TO type->object Type.{At,Field,Method,Obj} [AFMO] -// -// All valid paths start with a package and end at an object -// and thus may be defined by the regular language: -// -// objectpath = PO (OT TT* TO)* -// -// The concrete encoding follows directly: -// - The only PO operator is Package.Scope.Lookup, which requires an identifier. -// - The only OT operator is Object.Type, -// which we encode as '.' because dot cannot appear in an identifier. -// - The TT operators are encoded as [EKPRU]. -// - The OT operators are encoded as [AFMO]; -// three of these (At,Field,Method) require an integer operand, -// which is encoded as a string of decimal digits. -// These indices are stable across different representations -// of the same package, even source and export data. -// -// In the example below, -// -// package p -// -// type T interface { -// f() (a string, b struct{ X int }) -// } -// -// field X has the path "T.UM0.RA1.F0", -// representing the following sequence of operations: -// -// p.Lookup("T") T -// .Type().Underlying().Method(0). f -// .Type().Results().At(1) b -// .Type().Field(0) X -// -// The encoding is not maximally compact---every R or P is -// followed by an A, for example---but this simplifies the -// encoder and decoder. -// -const ( - // object->type operators - opType = '.' // .Type() (Object) - - // type->type operators - opElem = 'E' // .Elem() (Pointer, Slice, Array, Chan, Map) - opKey = 'K' // .Key() (Map) - opParams = 'P' // .Params() (Signature) - opResults = 'R' // .Results() (Signature) - opUnderlying = 'U' // .Underlying() (Named) - - // type->object operators - opAt = 'A' // .At(i) (Tuple) - opField = 'F' // .Field(i) (Struct) - opMethod = 'M' // .Method(i) (Named or Interface; not Struct: "promoted" names are ignored) - opObj = 'O' // .Obj() (Named) -) - -// The For function returns the path to an object relative to its package, -// or an error if the object is not accessible from the package's Scope. -// -// The For function guarantees to return a path only for the following objects: -// - package-level types -// - exported package-level non-types -// - methods -// - parameter and result variables -// - struct fields -// These objects are sufficient to define the API of their package. -// The objects described by a package's export data are drawn from this set. -// -// For does not return a path for predeclared names, imported package -// names, local names, and unexported package-level names (except -// types). -// -// Example: given this definition, -// -// package p -// -// type T interface { -// f() (a string, b struct{ X int }) -// } -// -// For(X) would return a path that denotes the following sequence of operations: -// -// p.Scope().Lookup("T") (TypeName T) -// .Type().Underlying().Method(0). (method Func f) -// .Type().Results().At(1) (field Var b) -// .Type().Field(0) (field Var X) -// -// where p is the package (*types.Package) to which X belongs. -func For(obj types.Object) (Path, error) { - pkg := obj.Pkg() - - // This table lists the cases of interest. - // - // Object Action - // ------ ------ - // nil reject - // builtin reject - // pkgname reject - // label reject - // var - // package-level accept - // func param/result accept - // local reject - // struct field accept - // const - // package-level accept - // local reject - // func - // package-level accept - // init functions reject - // concrete method accept - // interface method accept - // type - // package-level accept - // local reject - // - // The only accessible package-level objects are members of pkg itself. - // - // The cases are handled in four steps: - // - // 1. reject nil and builtin - // 2. accept package-level objects - // 3. reject obviously invalid objects - // 4. search the API for the path to the param/result/field/method. - - // 1. reference to nil or builtin? - if pkg == nil { - return "", fmt.Errorf("predeclared %s has no path", obj) - } - scope := pkg.Scope() - - // 2. package-level object? - if scope.Lookup(obj.Name()) == obj { - // Only exported objects (and non-exported types) have a path. - // Non-exported types may be referenced by other objects. - if _, ok := obj.(*types.TypeName); !ok && !obj.Exported() { - return "", fmt.Errorf("no path for non-exported %v", obj) - } - return Path(obj.Name()), nil - } - - // 3. Not a package-level object. - // Reject obviously non-viable cases. - switch obj := obj.(type) { - case *types.Const, // Only package-level constants have a path. - *types.TypeName, // Only package-level types have a path. - *types.Label, // Labels are function-local. - *types.PkgName: // PkgNames are file-local. - return "", fmt.Errorf("no path for %v", obj) - - case *types.Var: - // Could be: - // - a field (obj.IsField()) - // - a func parameter or result - // - a local var. - // Sadly there is no way to distinguish - // a param/result from a local - // so we must proceed to the find. - - case *types.Func: - // A func, if not package-level, must be a method. - if recv := obj.Type().(*types.Signature).Recv(); recv == nil { - return "", fmt.Errorf("func is not a method: %v", obj) - } - // TODO(adonovan): opt: if the method is concrete, - // do a specialized version of the rest of this function so - // that it's O(1) not O(|scope|). Basically 'find' is needed - // only for struct fields and interface methods. - - default: - panic(obj) - } - - // 4. Search the API for the path to the var (field/param/result) or method. - - // First inspect package-level named types. - // In the presence of path aliases, these give - // the best paths because non-types may - // refer to types, but not the reverse. - empty := make([]byte, 0, 48) // initial space - for _, name := range scope.Names() { - o := scope.Lookup(name) - tname, ok := o.(*types.TypeName) - if !ok { - continue // handle non-types in second pass - } - - path := append(empty, name...) - path = append(path, opType) - - T := o.Type() - - if tname.IsAlias() { - // type alias - if r := find(obj, T, path); r != nil { - return Path(r), nil - } - } else { - // defined (named) type - if r := find(obj, T.Underlying(), append(path, opUnderlying)); r != nil { - return Path(r), nil - } - } - } - - // Then inspect everything else: - // non-types, and declared methods of defined types. - for _, name := range scope.Names() { - o := scope.Lookup(name) - path := append(empty, name...) - if _, ok := o.(*types.TypeName); !ok { - if o.Exported() { - // exported non-type (const, var, func) - if r := find(obj, o.Type(), append(path, opType)); r != nil { - return Path(r), nil - } - } - continue - } - - // Inspect declared methods of defined types. - if T, ok := o.Type().(*types.Named); ok { - path = append(path, opType) - for i := 0; i < T.NumMethods(); i++ { - m := T.Method(i) - path2 := appendOpArg(path, opMethod, i) - if m == obj { - return Path(path2), nil // found declared method - } - if r := find(obj, m.Type(), append(path2, opType)); r != nil { - return Path(r), nil - } - } - } - } - - return "", fmt.Errorf("can't find path for %v in %s", obj, pkg.Path()) -} - -func appendOpArg(path []byte, op byte, arg int) []byte { - path = append(path, op) - path = strconv.AppendInt(path, int64(arg), 10) - return path -} - -// find finds obj within type T, returning the path to it, or nil if not found. -func find(obj types.Object, T types.Type, path []byte) []byte { - switch T := T.(type) { - case *types.Basic, *types.Named: - // Named types belonging to pkg were handled already, - // so T must belong to another package. No path. - return nil - case *types.Pointer: - return find(obj, T.Elem(), append(path, opElem)) - case *types.Slice: - return find(obj, T.Elem(), append(path, opElem)) - case *types.Array: - return find(obj, T.Elem(), append(path, opElem)) - case *types.Chan: - return find(obj, T.Elem(), append(path, opElem)) - case *types.Map: - if r := find(obj, T.Key(), append(path, opKey)); r != nil { - return r - } - return find(obj, T.Elem(), append(path, opElem)) - case *types.Signature: - if r := find(obj, T.Params(), append(path, opParams)); r != nil { - return r - } - return find(obj, T.Results(), append(path, opResults)) - case *types.Struct: - for i := 0; i < T.NumFields(); i++ { - f := T.Field(i) - path2 := appendOpArg(path, opField, i) - if f == obj { - return path2 // found field var - } - if r := find(obj, f.Type(), append(path2, opType)); r != nil { - return r - } - } - return nil - case *types.Tuple: - for i := 0; i < T.Len(); i++ { - v := T.At(i) - path2 := appendOpArg(path, opAt, i) - if v == obj { - return path2 // found param/result var - } - if r := find(obj, v.Type(), append(path2, opType)); r != nil { - return r - } - } - return nil - case *types.Interface: - for i := 0; i < T.NumMethods(); i++ { - m := T.Method(i) - path2 := appendOpArg(path, opMethod, i) - if m == obj { - return path2 // found interface method - } - if r := find(obj, m.Type(), append(path2, opType)); r != nil { - return r - } - } - return nil - } - panic(T) -} - -// Object returns the object denoted by path p within the package pkg. -func Object(pkg *types.Package, p Path) (types.Object, error) { - if p == "" { - return nil, fmt.Errorf("empty path") - } - - pathstr := string(p) - var pkgobj, suffix string - if dot := strings.IndexByte(pathstr, opType); dot < 0 { - pkgobj = pathstr - } else { - pkgobj = pathstr[:dot] - suffix = pathstr[dot:] // suffix starts with "." - } - - obj := pkg.Scope().Lookup(pkgobj) - if obj == nil { - return nil, fmt.Errorf("package %s does not contain %q", pkg.Path(), pkgobj) - } - - // abtraction of *types.{Pointer,Slice,Array,Chan,Map} - type hasElem interface { - Elem() types.Type - } - // abstraction of *types.{Interface,Named} - type hasMethods interface { - Method(int) *types.Func - NumMethods() int - } - - // The loop state is the pair (t, obj), - // exactly one of which is non-nil, initially obj. - // All suffixes start with '.' (the only object->type operation), - // followed by optional type->type operations, - // then a type->object operation. - // The cycle then repeats. - var t types.Type - for suffix != "" { - code := suffix[0] - suffix = suffix[1:] - - // Codes [AFM] have an integer operand. - var index int - switch code { - case opAt, opField, opMethod: - rest := strings.TrimLeft(suffix, "0123456789") - numerals := suffix[:len(suffix)-len(rest)] - suffix = rest - i, err := strconv.Atoi(numerals) - if err != nil { - return nil, fmt.Errorf("invalid path: bad numeric operand %q for code %q", numerals, code) - } - index = int(i) - case opObj: - // no operand - default: - // The suffix must end with a type->object operation. - if suffix == "" { - return nil, fmt.Errorf("invalid path: ends with %q, want [AFMO]", code) - } - } - - if code == opType { - if t != nil { - return nil, fmt.Errorf("invalid path: unexpected %q in type context", opType) - } - t = obj.Type() - obj = nil - continue - } - - if t == nil { - return nil, fmt.Errorf("invalid path: code %q in object context", code) - } - - // Inv: t != nil, obj == nil - - switch code { - case opElem: - hasElem, ok := t.(hasElem) // Pointer, Slice, Array, Chan, Map - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %T, want pointer, slice, array, chan or map)", code, t, t) - } - t = hasElem.Elem() - - case opKey: - mapType, ok := t.(*types.Map) - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %T, want map)", code, t, t) - } - t = mapType.Key() - - case opParams: - sig, ok := t.(*types.Signature) - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %T, want signature)", code, t, t) - } - t = sig.Params() - - case opResults: - sig, ok := t.(*types.Signature) - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %T, want signature)", code, t, t) - } - t = sig.Results() - - case opUnderlying: - named, ok := t.(*types.Named) - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %s, want named)", code, t, t) - } - t = named.Underlying() - - case opAt: - tuple, ok := t.(*types.Tuple) - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %s, want tuple)", code, t, t) - } - if n := tuple.Len(); index >= n { - return nil, fmt.Errorf("tuple index %d out of range [0-%d)", index, n) - } - obj = tuple.At(index) - t = nil - - case opField: - structType, ok := t.(*types.Struct) - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %T, want struct)", code, t, t) - } - if n := structType.NumFields(); index >= n { - return nil, fmt.Errorf("field index %d out of range [0-%d)", index, n) - } - obj = structType.Field(index) - t = nil - - case opMethod: - hasMethods, ok := t.(hasMethods) // Interface or Named - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %s, want interface or named)", code, t, t) - } - if n := hasMethods.NumMethods(); index >= n { - return nil, fmt.Errorf("method index %d out of range [0-%d)", index, n) - } - obj = hasMethods.Method(index) - t = nil - - case opObj: - named, ok := t.(*types.Named) - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %s, want named)", code, t, t) - } - obj = named.Obj() - t = nil - - default: - return nil, fmt.Errorf("invalid path: unknown code %q", code) - } - } - - if obj.Pkg() != pkg { - return nil, fmt.Errorf("path denotes %s, which belongs to a different package", obj) - } - - return obj, nil // success -} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/BUILD b/vendor/golang.org/x/tools/go/types/typeutil/BUILD deleted file mode 100644 index d5c6d483494..00000000000 --- a/vendor/golang.org/x/tools/go/types/typeutil/BUILD +++ /dev/null @@ -1,30 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "callee.go", - "imports.go", - "map.go", - "methodsetcache.go", - "ui.go", - ], - importmap = "k8s.io/kubernetes/vendor/golang.org/x/tools/go/types/typeutil", - importpath = "golang.org/x/tools/go/types/typeutil", - visibility = ["//visibility:public"], - deps = ["//vendor/golang.org/x/tools/go/ast/astutil:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/golang.org/x/tools/go/types/typeutil/callee.go b/vendor/golang.org/x/tools/go/types/typeutil/callee.go deleted file mode 100644 index 38f596daf9e..00000000000 --- a/vendor/golang.org/x/tools/go/types/typeutil/callee.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package typeutil - -import ( - "go/ast" - "go/types" - - "golang.org/x/tools/go/ast/astutil" -) - -// Callee returns the named target of a function call, if any: -// a function, method, builtin, or variable. -func Callee(info *types.Info, call *ast.CallExpr) types.Object { - var obj types.Object - switch fun := astutil.Unparen(call.Fun).(type) { - case *ast.Ident: - obj = info.Uses[fun] // type, var, builtin, or declared func - case *ast.SelectorExpr: - if sel, ok := info.Selections[fun]; ok { - obj = sel.Obj() // method or field - } else { - obj = info.Uses[fun.Sel] // qualified identifier? - } - } - if _, ok := obj.(*types.TypeName); ok { - return nil // T(x) is a conversion, not a call - } - return obj -} - -// StaticCallee returns the target (function or method) of a static -// function call, if any. It returns nil for calls to builtins. -func StaticCallee(info *types.Info, call *ast.CallExpr) *types.Func { - if f, ok := Callee(info, call).(*types.Func); ok && !interfaceMethod(f) { - return f - } - return nil -} - -func interfaceMethod(f *types.Func) bool { - recv := f.Type().(*types.Signature).Recv() - return recv != nil && types.IsInterface(recv.Type()) -} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/imports.go b/vendor/golang.org/x/tools/go/types/typeutil/imports.go deleted file mode 100644 index 9c441dba9c0..00000000000 --- a/vendor/golang.org/x/tools/go/types/typeutil/imports.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package typeutil - -import "go/types" - -// Dependencies returns all dependencies of the specified packages. -// -// Dependent packages appear in topological order: if package P imports -// package Q, Q appears earlier than P in the result. -// The algorithm follows import statements in the order they -// appear in the source code, so the result is a total order. -// -func Dependencies(pkgs ...*types.Package) []*types.Package { - var result []*types.Package - seen := make(map[*types.Package]bool) - var visit func(pkgs []*types.Package) - visit = func(pkgs []*types.Package) { - for _, p := range pkgs { - if !seen[p] { - seen[p] = true - visit(p.Imports()) - result = append(result, p) - } - } - } - visit(pkgs) - return result -} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/map.go b/vendor/golang.org/x/tools/go/types/typeutil/map.go deleted file mode 100644 index c7f75450064..00000000000 --- a/vendor/golang.org/x/tools/go/types/typeutil/map.go +++ /dev/null @@ -1,313 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package typeutil defines various utilities for types, such as Map, -// a mapping from types.Type to interface{} values. -package typeutil // import "golang.org/x/tools/go/types/typeutil" - -import ( - "bytes" - "fmt" - "go/types" - "reflect" -) - -// Map is a hash-table-based mapping from types (types.Type) to -// arbitrary interface{} values. The concrete types that implement -// the Type interface are pointers. Since they are not canonicalized, -// == cannot be used to check for equivalence, and thus we cannot -// simply use a Go map. -// -// Just as with map[K]V, a nil *Map is a valid empty map. -// -// Not thread-safe. -// -type Map struct { - hasher Hasher // shared by many Maps - table map[uint32][]entry // maps hash to bucket; entry.key==nil means unused - length int // number of map entries -} - -// entry is an entry (key/value association) in a hash bucket. -type entry struct { - key types.Type - value interface{} -} - -// SetHasher sets the hasher used by Map. -// -// All Hashers are functionally equivalent but contain internal state -// used to cache the results of hashing previously seen types. -// -// A single Hasher created by MakeHasher() may be shared among many -// Maps. This is recommended if the instances have many keys in -// common, as it will amortize the cost of hash computation. -// -// A Hasher may grow without bound as new types are seen. Even when a -// type is deleted from the map, the Hasher never shrinks, since other -// types in the map may reference the deleted type indirectly. -// -// Hashers are not thread-safe, and read-only operations such as -// Map.Lookup require updates to the hasher, so a full Mutex lock (not a -// read-lock) is require around all Map operations if a shared -// hasher is accessed from multiple threads. -// -// If SetHasher is not called, the Map will create a private hasher at -// the first call to Insert. -// -func (m *Map) SetHasher(hasher Hasher) { - m.hasher = hasher -} - -// Delete removes the entry with the given key, if any. -// It returns true if the entry was found. -// -func (m *Map) Delete(key types.Type) bool { - if m != nil && m.table != nil { - hash := m.hasher.Hash(key) - bucket := m.table[hash] - for i, e := range bucket { - if e.key != nil && types.Identical(key, e.key) { - // We can't compact the bucket as it - // would disturb iterators. - bucket[i] = entry{} - m.length-- - return true - } - } - } - return false -} - -// At returns the map entry for the given key. -// The result is nil if the entry is not present. -// -func (m *Map) At(key types.Type) interface{} { - if m != nil && m.table != nil { - for _, e := range m.table[m.hasher.Hash(key)] { - if e.key != nil && types.Identical(key, e.key) { - return e.value - } - } - } - return nil -} - -// Set sets the map entry for key to val, -// and returns the previous entry, if any. -func (m *Map) Set(key types.Type, value interface{}) (prev interface{}) { - if m.table != nil { - hash := m.hasher.Hash(key) - bucket := m.table[hash] - var hole *entry - for i, e := range bucket { - if e.key == nil { - hole = &bucket[i] - } else if types.Identical(key, e.key) { - prev = e.value - bucket[i].value = value - return - } - } - - if hole != nil { - *hole = entry{key, value} // overwrite deleted entry - } else { - m.table[hash] = append(bucket, entry{key, value}) - } - } else { - if m.hasher.memo == nil { - m.hasher = MakeHasher() - } - hash := m.hasher.Hash(key) - m.table = map[uint32][]entry{hash: {entry{key, value}}} - } - - m.length++ - return -} - -// Len returns the number of map entries. -func (m *Map) Len() int { - if m != nil { - return m.length - } - return 0 -} - -// Iterate calls function f on each entry in the map in unspecified order. -// -// If f should mutate the map, Iterate provides the same guarantees as -// Go maps: if f deletes a map entry that Iterate has not yet reached, -// f will not be invoked for it, but if f inserts a map entry that -// Iterate has not yet reached, whether or not f will be invoked for -// it is unspecified. -// -func (m *Map) Iterate(f func(key types.Type, value interface{})) { - if m != nil { - for _, bucket := range m.table { - for _, e := range bucket { - if e.key != nil { - f(e.key, e.value) - } - } - } - } -} - -// Keys returns a new slice containing the set of map keys. -// The order is unspecified. -func (m *Map) Keys() []types.Type { - keys := make([]types.Type, 0, m.Len()) - m.Iterate(func(key types.Type, _ interface{}) { - keys = append(keys, key) - }) - return keys -} - -func (m *Map) toString(values bool) string { - if m == nil { - return "{}" - } - var buf bytes.Buffer - fmt.Fprint(&buf, "{") - sep := "" - m.Iterate(func(key types.Type, value interface{}) { - fmt.Fprint(&buf, sep) - sep = ", " - fmt.Fprint(&buf, key) - if values { - fmt.Fprintf(&buf, ": %q", value) - } - }) - fmt.Fprint(&buf, "}") - return buf.String() -} - -// String returns a string representation of the map's entries. -// Values are printed using fmt.Sprintf("%v", v). -// Order is unspecified. -// -func (m *Map) String() string { - return m.toString(true) -} - -// KeysString returns a string representation of the map's key set. -// Order is unspecified. -// -func (m *Map) KeysString() string { - return m.toString(false) -} - -//////////////////////////////////////////////////////////////////////// -// Hasher - -// A Hasher maps each type to its hash value. -// For efficiency, a hasher uses memoization; thus its memory -// footprint grows monotonically over time. -// Hashers are not thread-safe. -// Hashers have reference semantics. -// Call MakeHasher to create a Hasher. -type Hasher struct { - memo map[types.Type]uint32 -} - -// MakeHasher returns a new Hasher instance. -func MakeHasher() Hasher { - return Hasher{make(map[types.Type]uint32)} -} - -// Hash computes a hash value for the given type t such that -// Identical(t, t') => Hash(t) == Hash(t'). -func (h Hasher) Hash(t types.Type) uint32 { - hash, ok := h.memo[t] - if !ok { - hash = h.hashFor(t) - h.memo[t] = hash - } - return hash -} - -// hashString computes the Fowler–Noll–Vo hash of s. -func hashString(s string) uint32 { - var h uint32 - for i := 0; i < len(s); i++ { - h ^= uint32(s[i]) - h *= 16777619 - } - return h -} - -// hashFor computes the hash of t. -func (h Hasher) hashFor(t types.Type) uint32 { - // See Identical for rationale. - switch t := t.(type) { - case *types.Basic: - return uint32(t.Kind()) - - case *types.Array: - return 9043 + 2*uint32(t.Len()) + 3*h.Hash(t.Elem()) - - case *types.Slice: - return 9049 + 2*h.Hash(t.Elem()) - - case *types.Struct: - var hash uint32 = 9059 - for i, n := 0, t.NumFields(); i < n; i++ { - f := t.Field(i) - if f.Anonymous() { - hash += 8861 - } - hash += hashString(t.Tag(i)) - hash += hashString(f.Name()) // (ignore f.Pkg) - hash += h.Hash(f.Type()) - } - return hash - - case *types.Pointer: - return 9067 + 2*h.Hash(t.Elem()) - - case *types.Signature: - var hash uint32 = 9091 - if t.Variadic() { - hash *= 8863 - } - return hash + 3*h.hashTuple(t.Params()) + 5*h.hashTuple(t.Results()) - - case *types.Interface: - var hash uint32 = 9103 - for i, n := 0, t.NumMethods(); i < n; i++ { - // See go/types.identicalMethods for rationale. - // Method order is not significant. - // Ignore m.Pkg(). - m := t.Method(i) - hash += 3*hashString(m.Name()) + 5*h.Hash(m.Type()) - } - return hash - - case *types.Map: - return 9109 + 2*h.Hash(t.Key()) + 3*h.Hash(t.Elem()) - - case *types.Chan: - return 9127 + 2*uint32(t.Dir()) + 3*h.Hash(t.Elem()) - - case *types.Named: - // Not safe with a copying GC; objects may move. - return uint32(reflect.ValueOf(t.Obj()).Pointer()) - - case *types.Tuple: - return h.hashTuple(t) - } - panic(t) -} - -func (h Hasher) hashTuple(tuple *types.Tuple) uint32 { - // See go/types.identicalTypes for rationale. - n := tuple.Len() - var hash uint32 = 9137 + 2*uint32(n) - for i := 0; i < n; i++ { - hash += 3 * h.Hash(tuple.At(i).Type()) - } - return hash -} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go b/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go deleted file mode 100644 index 32084610f49..00000000000 --- a/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file implements a cache of method sets. - -package typeutil - -import ( - "go/types" - "sync" -) - -// A MethodSetCache records the method set of each type T for which -// MethodSet(T) is called so that repeat queries are fast. -// The zero value is a ready-to-use cache instance. -type MethodSetCache struct { - mu sync.Mutex - named map[*types.Named]struct{ value, pointer *types.MethodSet } // method sets for named N and *N - others map[types.Type]*types.MethodSet // all other types -} - -// MethodSet returns the method set of type T. It is thread-safe. -// -// If cache is nil, this function is equivalent to types.NewMethodSet(T). -// Utility functions can thus expose an optional *MethodSetCache -// parameter to clients that care about performance. -// -func (cache *MethodSetCache) MethodSet(T types.Type) *types.MethodSet { - if cache == nil { - return types.NewMethodSet(T) - } - cache.mu.Lock() - defer cache.mu.Unlock() - - switch T := T.(type) { - case *types.Named: - return cache.lookupNamed(T).value - - case *types.Pointer: - if N, ok := T.Elem().(*types.Named); ok { - return cache.lookupNamed(N).pointer - } - } - - // all other types - // (The map uses pointer equivalence, not type identity.) - mset := cache.others[T] - if mset == nil { - mset = types.NewMethodSet(T) - if cache.others == nil { - cache.others = make(map[types.Type]*types.MethodSet) - } - cache.others[T] = mset - } - return mset -} - -func (cache *MethodSetCache) lookupNamed(named *types.Named) struct{ value, pointer *types.MethodSet } { - if cache.named == nil { - cache.named = make(map[*types.Named]struct{ value, pointer *types.MethodSet }) - } - // Avoid recomputing mset(*T) for each distinct Pointer - // instance whose underlying type is a named type. - msets, ok := cache.named[named] - if !ok { - msets.value = types.NewMethodSet(named) - msets.pointer = types.NewMethodSet(types.NewPointer(named)) - cache.named[named] = msets - } - return msets -} diff --git a/vendor/golang.org/x/tools/go/types/typeutil/ui.go b/vendor/golang.org/x/tools/go/types/typeutil/ui.go deleted file mode 100644 index 9849c24cef3..00000000000 --- a/vendor/golang.org/x/tools/go/types/typeutil/ui.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package typeutil - -// This file defines utilities for user interfaces that display types. - -import "go/types" - -// IntuitiveMethodSet returns the intuitive method set of a type T, -// which is the set of methods you can call on an addressable value of -// that type. -// -// The result always contains MethodSet(T), and is exactly MethodSet(T) -// for interface types and for pointer-to-concrete types. -// For all other concrete types T, the result additionally -// contains each method belonging to *T if there is no identically -// named method on T itself. -// -// This corresponds to user intuition about method sets; -// this function is intended only for user interfaces. -// -// The order of the result is as for types.MethodSet(T). -// -func IntuitiveMethodSet(T types.Type, msets *MethodSetCache) []*types.Selection { - isPointerToConcrete := func(T types.Type) bool { - ptr, ok := T.(*types.Pointer) - return ok && !types.IsInterface(ptr.Elem()) - } - - var result []*types.Selection - mset := msets.MethodSet(T) - if types.IsInterface(T) || isPointerToConcrete(T) { - for i, n := 0, mset.Len(); i < n; i++ { - result = append(result, mset.At(i)) - } - } else { - // T is some other concrete type. - // Report methods of T and *T, preferring those of T. - pmset := msets.MethodSet(types.NewPointer(T)) - for i, n := 0, pmset.Len(); i < n; i++ { - meth := pmset.At(i) - if m := mset.Lookup(meth.Obj().Pkg(), meth.Obj().Name()); m != nil { - meth = m - } - result = append(result, meth) - } - - } - return result -} diff --git a/vendor/golang.org/x/tools/go/vcs/BUILD b/vendor/golang.org/x/tools/go/vcs/BUILD deleted file mode 100644 index 1f308f128d3..00000000000 --- a/vendor/golang.org/x/tools/go/vcs/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "discovery.go", - "env.go", - "http.go", - "vcs.go", - ], - importmap = "k8s.io/kubernetes/vendor/golang.org/x/tools/go/vcs", - importpath = "golang.org/x/tools/go/vcs", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/golang.org/x/tools/go/vcs/discovery.go b/vendor/golang.org/x/tools/go/vcs/discovery.go deleted file mode 100644 index 2428d88852c..00000000000 --- a/vendor/golang.org/x/tools/go/vcs/discovery.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package vcs - -import ( - "encoding/xml" - "fmt" - "io" - "strings" -) - -// charsetReader returns a reader for the given charset. Currently -// it only supports UTF-8 and ASCII. Otherwise, it returns a meaningful -// error which is printed by go get, so the user can find why the package -// wasn't downloaded if the encoding is not supported. Note that, in -// order to reduce potential errors, ASCII is treated as UTF-8 (i.e. characters -// greater than 0x7f are not rejected). -func charsetReader(charset string, input io.Reader) (io.Reader, error) { - switch strings.ToLower(charset) { - case "ascii": - return input, nil - default: - return nil, fmt.Errorf("can't decode XML document using charset %q", charset) - } -} - -// parseMetaGoImports returns meta imports from the HTML in r. -// Parsing ends at the end of the section or the beginning of the . -// -// This copy of cmd/go/internal/vcs.parseMetaGoImports always operates -// in IgnoreMod ModuleMode. -func parseMetaGoImports(r io.Reader) (imports []metaImport, err error) { - d := xml.NewDecoder(r) - d.CharsetReader = charsetReader - d.Strict = false - var t xml.Token - for { - t, err = d.RawToken() - if err != nil { - if err == io.EOF || len(imports) > 0 { - err = nil - } - return - } - if e, ok := t.(xml.StartElement); ok && strings.EqualFold(e.Name.Local, "body") { - return - } - if e, ok := t.(xml.EndElement); ok && strings.EqualFold(e.Name.Local, "head") { - return - } - e, ok := t.(xml.StartElement) - if !ok || !strings.EqualFold(e.Name.Local, "meta") { - continue - } - if attrValue(e.Attr, "name") != "go-import" { - continue - } - if f := strings.Fields(attrValue(e.Attr, "content")); len(f) == 3 { - // Ignore VCS type "mod", which is applicable only in module mode. - if f[1] == "mod" { - continue - } - imports = append(imports, metaImport{ - Prefix: f[0], - VCS: f[1], - RepoRoot: f[2], - }) - } - } -} - -// attrValue returns the attribute value for the case-insensitive key -// `name', or the empty string if nothing is found. -func attrValue(attrs []xml.Attr, name string) string { - for _, a := range attrs { - if strings.EqualFold(a.Name.Local, name) { - return a.Value - } - } - return "" -} diff --git a/vendor/golang.org/x/tools/go/vcs/env.go b/vendor/golang.org/x/tools/go/vcs/env.go deleted file mode 100644 index e846f5b3b86..00000000000 --- a/vendor/golang.org/x/tools/go/vcs/env.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package vcs - -import ( - "os" - "strings" -) - -// envForDir returns a copy of the environment -// suitable for running in the given directory. -// The environment is the current process's environment -// but with an updated $PWD, so that an os.Getwd in the -// child will be faster. -func envForDir(dir string) []string { - env := os.Environ() - // Internally we only use rooted paths, so dir is rooted. - // Even if dir is not rooted, no harm done. - return mergeEnvLists([]string{"PWD=" + dir}, env) -} - -// mergeEnvLists merges the two environment lists such that -// variables with the same name in "in" replace those in "out". -func mergeEnvLists(in, out []string) []string { -NextVar: - for _, inkv := range in { - k := strings.SplitAfterN(inkv, "=", 2)[0] - for i, outkv := range out { - if strings.HasPrefix(outkv, k) { - out[i] = inkv - continue NextVar - } - } - out = append(out, inkv) - } - return out -} diff --git a/vendor/golang.org/x/tools/go/vcs/http.go b/vendor/golang.org/x/tools/go/vcs/http.go deleted file mode 100644 index 96188185cb6..00000000000 --- a/vendor/golang.org/x/tools/go/vcs/http.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package vcs - -import ( - "fmt" - "io" - "io/ioutil" - "log" - "net/http" - "net/url" -) - -// httpClient is the default HTTP client, but a variable so it can be -// changed by tests, without modifying http.DefaultClient. -var httpClient = http.DefaultClient - -// httpGET returns the data from an HTTP GET request for the given URL. -func httpGET(url string) ([]byte, error) { - resp, err := httpClient.Get(url) - if err != nil { - return nil, err - } - defer resp.Body.Close() - if resp.StatusCode != 200 { - return nil, fmt.Errorf("%s: %s", url, resp.Status) - } - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("%s: %v", url, err) - } - return b, nil -} - -// httpsOrHTTP returns the body of either the importPath's -// https resource or, if unavailable, the http resource. -func httpsOrHTTP(importPath string) (urlStr string, body io.ReadCloser, err error) { - fetch := func(scheme string) (urlStr string, res *http.Response, err error) { - u, err := url.Parse(scheme + "://" + importPath) - if err != nil { - return "", nil, err - } - u.RawQuery = "go-get=1" - urlStr = u.String() - if Verbose { - log.Printf("Fetching %s", urlStr) - } - res, err = httpClient.Get(urlStr) - return - } - closeBody := func(res *http.Response) { - if res != nil { - res.Body.Close() - } - } - urlStr, res, err := fetch("https") - if err != nil || res.StatusCode != 200 { - if Verbose { - if err != nil { - log.Printf("https fetch failed.") - } else { - log.Printf("ignoring https fetch with status code %d", res.StatusCode) - } - } - closeBody(res) - urlStr, res, err = fetch("http") - } - if err != nil { - closeBody(res) - return "", nil, err - } - // Note: accepting a non-200 OK here, so people can serve a - // meta import in their http 404 page. - if Verbose { - log.Printf("Parsing meta tags from %s (status code %d)", urlStr, res.StatusCode) - } - return urlStr, res.Body, nil -} diff --git a/vendor/golang.org/x/tools/go/vcs/vcs.go b/vendor/golang.org/x/tools/go/vcs/vcs.go deleted file mode 100644 index 6e58ac74911..00000000000 --- a/vendor/golang.org/x/tools/go/vcs/vcs.go +++ /dev/null @@ -1,759 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package vcs exposes functions for resolving import paths -// and using version control systems, which can be used to -// implement behavior similar to the standard "go get" command. -// -// This package is a copy of internal code in package cmd/go/internal/get, -// modified to make the identifiers exported. It's provided here -// for developers who want to write tools with similar semantics. -// It needs to be manually kept in sync with upstream when changes are -// made to cmd/go/internal/get; see https://golang.org/issue/11490. -// -package vcs // import "golang.org/x/tools/go/vcs" - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "log" - "net/url" - "os" - "os/exec" - "path/filepath" - "regexp" - "strconv" - "strings" -) - -// Verbose enables verbose operation logging. -var Verbose bool - -// ShowCmd controls whether VCS commands are printed. -var ShowCmd bool - -// A Cmd describes how to use a version control system -// like Mercurial, Git, or Subversion. -type Cmd struct { - Name string - Cmd string // name of binary to invoke command - - CreateCmd string // command to download a fresh copy of a repository - DownloadCmd string // command to download updates into an existing repository - - TagCmd []TagCmd // commands to list tags - TagLookupCmd []TagCmd // commands to lookup tags before running tagSyncCmd - TagSyncCmd string // command to sync to specific tag - TagSyncDefault string // command to sync to default tag - - LogCmd string // command to list repository changelogs in an XML format - - Scheme []string - PingCmd string -} - -// A TagCmd describes a command to list available tags -// that can be passed to Cmd.TagSyncCmd. -type TagCmd struct { - Cmd string // command to list tags - Pattern string // regexp to extract tags from list -} - -// vcsList lists the known version control systems -var vcsList = []*Cmd{ - vcsHg, - vcsGit, - vcsSvn, - vcsBzr, -} - -// ByCmd returns the version control system for the given -// command name (hg, git, svn, bzr). -func ByCmd(cmd string) *Cmd { - for _, vcs := range vcsList { - if vcs.Cmd == cmd { - return vcs - } - } - return nil -} - -// vcsHg describes how to use Mercurial. -var vcsHg = &Cmd{ - Name: "Mercurial", - Cmd: "hg", - - CreateCmd: "clone -U {repo} {dir}", - DownloadCmd: "pull", - - // We allow both tag and branch names as 'tags' - // for selecting a version. This lets people have - // a go.release.r60 branch and a go1 branch - // and make changes in both, without constantly - // editing .hgtags. - TagCmd: []TagCmd{ - {"tags", `^(\S+)`}, - {"branches", `^(\S+)`}, - }, - TagSyncCmd: "update -r {tag}", - TagSyncDefault: "update default", - - LogCmd: "log --encoding=utf-8 --limit={limit} --template={template}", - - Scheme: []string{"https", "http", "ssh"}, - PingCmd: "identify {scheme}://{repo}", -} - -// vcsGit describes how to use Git. -var vcsGit = &Cmd{ - Name: "Git", - Cmd: "git", - - CreateCmd: "clone {repo} {dir}", - DownloadCmd: "pull --ff-only", - - TagCmd: []TagCmd{ - // tags/xxx matches a git tag named xxx - // origin/xxx matches a git branch named xxx on the default remote repository - {"show-ref", `(?:tags|origin)/(\S+)$`}, - }, - TagLookupCmd: []TagCmd{ - {"show-ref tags/{tag} origin/{tag}", `((?:tags|origin)/\S+)$`}, - }, - TagSyncCmd: "checkout {tag}", - TagSyncDefault: "checkout master", - - Scheme: []string{"git", "https", "http", "git+ssh"}, - PingCmd: "ls-remote {scheme}://{repo}", -} - -// vcsBzr describes how to use Bazaar. -var vcsBzr = &Cmd{ - Name: "Bazaar", - Cmd: "bzr", - - CreateCmd: "branch {repo} {dir}", - - // Without --overwrite bzr will not pull tags that changed. - // Replace by --overwrite-tags after http://pad.lv/681792 goes in. - DownloadCmd: "pull --overwrite", - - TagCmd: []TagCmd{{"tags", `^(\S+)`}}, - TagSyncCmd: "update -r {tag}", - TagSyncDefault: "update -r revno:-1", - - Scheme: []string{"https", "http", "bzr", "bzr+ssh"}, - PingCmd: "info {scheme}://{repo}", -} - -// vcsSvn describes how to use Subversion. -var vcsSvn = &Cmd{ - Name: "Subversion", - Cmd: "svn", - - CreateCmd: "checkout {repo} {dir}", - DownloadCmd: "update", - - // There is no tag command in subversion. - // The branch information is all in the path names. - - LogCmd: "log --xml --limit={limit}", - - Scheme: []string{"https", "http", "svn", "svn+ssh"}, - PingCmd: "info {scheme}://{repo}", -} - -func (v *Cmd) String() string { - return v.Name -} - -// run runs the command line cmd in the given directory. -// keyval is a list of key, value pairs. run expands -// instances of {key} in cmd into value, but only after -// splitting cmd into individual arguments. -// If an error occurs, run prints the command line and the -// command's combined stdout+stderr to standard error. -// Otherwise run discards the command's output. -func (v *Cmd) run(dir string, cmd string, keyval ...string) error { - _, err := v.run1(dir, cmd, keyval, true) - return err -} - -// runVerboseOnly is like run but only generates error output to standard error in verbose mode. -func (v *Cmd) runVerboseOnly(dir string, cmd string, keyval ...string) error { - _, err := v.run1(dir, cmd, keyval, false) - return err -} - -// runOutput is like run but returns the output of the command. -func (v *Cmd) runOutput(dir string, cmd string, keyval ...string) ([]byte, error) { - return v.run1(dir, cmd, keyval, true) -} - -// run1 is the generalized implementation of run and runOutput. -func (v *Cmd) run1(dir string, cmdline string, keyval []string, verbose bool) ([]byte, error) { - m := make(map[string]string) - for i := 0; i < len(keyval); i += 2 { - m[keyval[i]] = keyval[i+1] - } - args := strings.Fields(cmdline) - for i, arg := range args { - args[i] = expand(m, arg) - } - - _, err := exec.LookPath(v.Cmd) - if err != nil { - fmt.Fprintf(os.Stderr, - "go: missing %s command. See http://golang.org/s/gogetcmd\n", - v.Name) - return nil, err - } - - cmd := exec.Command(v.Cmd, args...) - cmd.Dir = dir - cmd.Env = envForDir(cmd.Dir) - if ShowCmd { - fmt.Printf("cd %s\n", dir) - fmt.Printf("%s %s\n", v.Cmd, strings.Join(args, " ")) - } - var buf bytes.Buffer - cmd.Stdout = &buf - cmd.Stderr = &buf - err = cmd.Run() - out := buf.Bytes() - if err != nil { - if verbose || Verbose { - fmt.Fprintf(os.Stderr, "# cd %s; %s %s\n", dir, v.Cmd, strings.Join(args, " ")) - os.Stderr.Write(out) - } - return nil, err - } - return out, nil -} - -// Ping pings the repo to determine if scheme used is valid. -// This repo must be pingable with this scheme and VCS. -func (v *Cmd) Ping(scheme, repo string) error { - return v.runVerboseOnly(".", v.PingCmd, "scheme", scheme, "repo", repo) -} - -// Create creates a new copy of repo in dir. -// The parent of dir must exist; dir must not. -func (v *Cmd) Create(dir, repo string) error { - return v.run(".", v.CreateCmd, "dir", dir, "repo", repo) -} - -// CreateAtRev creates a new copy of repo in dir at revision rev. -// The parent of dir must exist; dir must not. -// rev must be a valid revision in repo. -func (v *Cmd) CreateAtRev(dir, repo, rev string) error { - if err := v.Create(dir, repo); err != nil { - return err - } - return v.run(dir, v.TagSyncCmd, "tag", rev) -} - -// Download downloads any new changes for the repo in dir. -// dir must be a valid VCS repo compatible with v. -func (v *Cmd) Download(dir string) error { - return v.run(dir, v.DownloadCmd) -} - -// Tags returns the list of available tags for the repo in dir. -// dir must be a valid VCS repo compatible with v. -func (v *Cmd) Tags(dir string) ([]string, error) { - var tags []string - for _, tc := range v.TagCmd { - out, err := v.runOutput(dir, tc.Cmd) - if err != nil { - return nil, err - } - re := regexp.MustCompile(`(?m-s)` + tc.Pattern) - for _, m := range re.FindAllStringSubmatch(string(out), -1) { - tags = append(tags, m[1]) - } - } - return tags, nil -} - -// TagSync syncs the repo in dir to the named tag, which is either a -// tag returned by Tags or the empty string (the default tag). -// dir must be a valid VCS repo compatible with v and the tag must exist. -func (v *Cmd) TagSync(dir, tag string) error { - if v.TagSyncCmd == "" { - return nil - } - if tag != "" { - for _, tc := range v.TagLookupCmd { - out, err := v.runOutput(dir, tc.Cmd, "tag", tag) - if err != nil { - return err - } - re := regexp.MustCompile(`(?m-s)` + tc.Pattern) - m := re.FindStringSubmatch(string(out)) - if len(m) > 1 { - tag = m[1] - break - } - } - } - if tag == "" && v.TagSyncDefault != "" { - return v.run(dir, v.TagSyncDefault) - } - return v.run(dir, v.TagSyncCmd, "tag", tag) -} - -// Log logs the changes for the repo in dir. -// dir must be a valid VCS repo compatible with v. -func (v *Cmd) Log(dir, logTemplate string) ([]byte, error) { - if err := v.Download(dir); err != nil { - return []byte{}, err - } - - const N = 50 // how many revisions to grab - return v.runOutput(dir, v.LogCmd, "limit", strconv.Itoa(N), "template", logTemplate) -} - -// LogAtRev logs the change for repo in dir at the rev revision. -// dir must be a valid VCS repo compatible with v. -// rev must be a valid revision for the repo in dir. -func (v *Cmd) LogAtRev(dir, rev, logTemplate string) ([]byte, error) { - if err := v.Download(dir); err != nil { - return []byte{}, err - } - - // Append revision flag to LogCmd. - logAtRevCmd := v.LogCmd + " --rev=" + rev - return v.runOutput(dir, logAtRevCmd, "limit", strconv.Itoa(1), "template", logTemplate) -} - -// A vcsPath describes how to convert an import path into a -// version control system and repository name. -type vcsPath struct { - prefix string // prefix this description applies to - re string // pattern for import path - repo string // repository to use (expand with match of re) - vcs string // version control system to use (expand with match of re) - check func(match map[string]string) error // additional checks - ping bool // ping for scheme to use to download repo - - regexp *regexp.Regexp // cached compiled form of re -} - -// FromDir inspects dir and its parents to determine the -// version control system and code repository to use. -// On return, root is the import path -// corresponding to the root of the repository. -func FromDir(dir, srcRoot string) (vcs *Cmd, root string, err error) { - // Clean and double-check that dir is in (a subdirectory of) srcRoot. - dir = filepath.Clean(dir) - srcRoot = filepath.Clean(srcRoot) - if len(dir) <= len(srcRoot) || dir[len(srcRoot)] != filepath.Separator { - return nil, "", fmt.Errorf("directory %q is outside source root %q", dir, srcRoot) - } - - var vcsRet *Cmd - var rootRet string - - origDir := dir - for len(dir) > len(srcRoot) { - for _, vcs := range vcsList { - if _, err := os.Stat(filepath.Join(dir, "."+vcs.Cmd)); err == nil { - root := filepath.ToSlash(dir[len(srcRoot)+1:]) - // Record first VCS we find, but keep looking, - // to detect mistakes like one kind of VCS inside another. - if vcsRet == nil { - vcsRet = vcs - rootRet = root - continue - } - // Allow .git inside .git, which can arise due to submodules. - if vcsRet == vcs && vcs.Cmd == "git" { - continue - } - // Otherwise, we have one VCS inside a different VCS. - return nil, "", fmt.Errorf("directory %q uses %s, but parent %q uses %s", - filepath.Join(srcRoot, rootRet), vcsRet.Cmd, filepath.Join(srcRoot, root), vcs.Cmd) - } - } - - // Move to parent. - ndir := filepath.Dir(dir) - if len(ndir) >= len(dir) { - // Shouldn't happen, but just in case, stop. - break - } - dir = ndir - } - - if vcsRet != nil { - return vcsRet, rootRet, nil - } - - return nil, "", fmt.Errorf("directory %q is not using a known version control system", origDir) -} - -// RepoRoot represents a version control system, a repo, and a root of -// where to put it on disk. -type RepoRoot struct { - VCS *Cmd - - // Repo is the repository URL, including scheme. - Repo string - - // Root is the import path corresponding to the root of the - // repository. - Root string -} - -// RepoRootForImportPath analyzes importPath to determine the -// version control system, and code repository to use. -func RepoRootForImportPath(importPath string, verbose bool) (*RepoRoot, error) { - rr, err := RepoRootForImportPathStatic(importPath, "") - if err == errUnknownSite { - rr, err = RepoRootForImportDynamic(importPath, verbose) - - // RepoRootForImportDynamic returns error detail - // that is irrelevant if the user didn't intend to use a - // dynamic import in the first place. - // Squelch it. - if err != nil { - if Verbose { - log.Printf("import %q: %v", importPath, err) - } - err = fmt.Errorf("unrecognized import path %q", importPath) - } - } - - if err == nil && strings.Contains(importPath, "...") && strings.Contains(rr.Root, "...") { - // Do not allow wildcards in the repo root. - rr = nil - err = fmt.Errorf("cannot expand ... in %q", importPath) - } - return rr, err -} - -var errUnknownSite = errors.New("dynamic lookup required to find mapping") - -// RepoRootForImportPathStatic attempts to map importPath to a -// RepoRoot using the commonly-used VCS hosting sites in vcsPaths -// (github.com/user/dir), or from a fully-qualified importPath already -// containing its VCS type (foo.com/repo.git/dir) -// -// If scheme is non-empty, that scheme is forced. -func RepoRootForImportPathStatic(importPath, scheme string) (*RepoRoot, error) { - if strings.Contains(importPath, "://") { - return nil, fmt.Errorf("invalid import path %q", importPath) - } - for _, srv := range vcsPaths { - if !strings.HasPrefix(importPath, srv.prefix) { - continue - } - m := srv.regexp.FindStringSubmatch(importPath) - if m == nil { - if srv.prefix != "" { - return nil, fmt.Errorf("invalid %s import path %q", srv.prefix, importPath) - } - continue - } - - // Build map of named subexpression matches for expand. - match := map[string]string{ - "prefix": srv.prefix, - "import": importPath, - } - for i, name := range srv.regexp.SubexpNames() { - if name != "" && match[name] == "" { - match[name] = m[i] - } - } - if srv.vcs != "" { - match["vcs"] = expand(match, srv.vcs) - } - if srv.repo != "" { - match["repo"] = expand(match, srv.repo) - } - if srv.check != nil { - if err := srv.check(match); err != nil { - return nil, err - } - } - vcs := ByCmd(match["vcs"]) - if vcs == nil { - return nil, fmt.Errorf("unknown version control system %q", match["vcs"]) - } - if srv.ping { - if scheme != "" { - match["repo"] = scheme + "://" + match["repo"] - } else { - for _, scheme := range vcs.Scheme { - if vcs.Ping(scheme, match["repo"]) == nil { - match["repo"] = scheme + "://" + match["repo"] - break - } - } - } - } - rr := &RepoRoot{ - VCS: vcs, - Repo: match["repo"], - Root: match["root"], - } - return rr, nil - } - return nil, errUnknownSite -} - -// RepoRootForImportDynamic finds a *RepoRoot for a custom domain that's not -// statically known by RepoRootForImportPathStatic. -// -// This handles custom import paths like "name.tld/pkg/foo" or just "name.tld". -func RepoRootForImportDynamic(importPath string, verbose bool) (*RepoRoot, error) { - slash := strings.Index(importPath, "/") - if slash < 0 { - slash = len(importPath) - } - host := importPath[:slash] - if !strings.Contains(host, ".") { - return nil, errors.New("import path doesn't contain a hostname") - } - urlStr, body, err := httpsOrHTTP(importPath) - if err != nil { - return nil, fmt.Errorf("http/https fetch: %v", err) - } - defer body.Close() - imports, err := parseMetaGoImports(body) - if err != nil { - return nil, fmt.Errorf("parsing %s: %v", importPath, err) - } - metaImport, err := matchGoImport(imports, importPath) - if err != nil { - if err != errNoMatch { - return nil, fmt.Errorf("parse %s: %v", urlStr, err) - } - return nil, fmt.Errorf("parse %s: no go-import meta tags", urlStr) - } - if verbose { - log.Printf("get %q: found meta tag %#v at %s", importPath, metaImport, urlStr) - } - // If the import was "uni.edu/bob/project", which said the - // prefix was "uni.edu" and the RepoRoot was "evilroot.com", - // make sure we don't trust Bob and check out evilroot.com to - // "uni.edu" yet (possibly overwriting/preempting another - // non-evil student). Instead, first verify the root and see - // if it matches Bob's claim. - if metaImport.Prefix != importPath { - if verbose { - log.Printf("get %q: verifying non-authoritative meta tag", importPath) - } - urlStr0 := urlStr - urlStr, body, err = httpsOrHTTP(metaImport.Prefix) - if err != nil { - return nil, fmt.Errorf("fetch %s: %v", urlStr, err) - } - imports, err := parseMetaGoImports(body) - if err != nil { - return nil, fmt.Errorf("parsing %s: %v", importPath, err) - } - if len(imports) == 0 { - return nil, fmt.Errorf("fetch %s: no go-import meta tag", urlStr) - } - metaImport2, err := matchGoImport(imports, importPath) - if err != nil || metaImport != metaImport2 { - return nil, fmt.Errorf("%s and %s disagree about go-import for %s", urlStr0, urlStr, metaImport.Prefix) - } - } - - if err := validateRepoRoot(metaImport.RepoRoot); err != nil { - return nil, fmt.Errorf("%s: invalid repo root %q: %v", urlStr, metaImport.RepoRoot, err) - } - rr := &RepoRoot{ - VCS: ByCmd(metaImport.VCS), - Repo: metaImport.RepoRoot, - Root: metaImport.Prefix, - } - if rr.VCS == nil { - return nil, fmt.Errorf("%s: unknown vcs %q", urlStr, metaImport.VCS) - } - return rr, nil -} - -// validateRepoRoot returns an error if repoRoot does not seem to be -// a valid URL with scheme. -func validateRepoRoot(repoRoot string) error { - url, err := url.Parse(repoRoot) - if err != nil { - return err - } - if url.Scheme == "" { - return errors.New("no scheme") - } - return nil -} - -// metaImport represents the parsed tags from HTML files. -type metaImport struct { - Prefix, VCS, RepoRoot string -} - -// errNoMatch is returned from matchGoImport when there's no applicable match. -var errNoMatch = errors.New("no import match") - -// pathPrefix reports whether sub is a prefix of s, -// only considering entire path components. -func pathPrefix(s, sub string) bool { - // strings.HasPrefix is necessary but not sufficient. - if !strings.HasPrefix(s, sub) { - return false - } - // The remainder after the prefix must either be empty or start with a slash. - rem := s[len(sub):] - return rem == "" || rem[0] == '/' -} - -// matchGoImport returns the metaImport from imports matching importPath. -// An error is returned if there are multiple matches. -// errNoMatch is returned if none match. -func matchGoImport(imports []metaImport, importPath string) (_ metaImport, err error) { - match := -1 - for i, im := range imports { - if !pathPrefix(importPath, im.Prefix) { - continue - } - - if match != -1 { - err = fmt.Errorf("multiple meta tags match import path %q", importPath) - return - } - match = i - } - if match == -1 { - err = errNoMatch - return - } - return imports[match], nil -} - -// expand rewrites s to replace {k} with match[k] for each key k in match. -func expand(match map[string]string, s string) string { - for k, v := range match { - s = strings.Replace(s, "{"+k+"}", v, -1) - } - return s -} - -// vcsPaths lists the known vcs paths. -var vcsPaths = []*vcsPath{ - // Github - { - prefix: "github.com/", - re: `^(?Pgithub\.com/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(/[\p{L}0-9_.\-]+)*$`, - vcs: "git", - repo: "https://{root}", - check: noVCSSuffix, - }, - - // Bitbucket - { - prefix: "bitbucket.org/", - re: `^(?Pbitbucket\.org/(?P[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`, - repo: "https://{root}", - check: bitbucketVCS, - }, - - // Launchpad - { - prefix: "launchpad.net/", - re: `^(?Plaunchpad\.net/((?P[A-Za-z0-9_.\-]+)(?P/[A-Za-z0-9_.\-]+)?|~[A-Za-z0-9_.\-]+/(\+junk|[A-Za-z0-9_.\-]+)/[A-Za-z0-9_.\-]+))(/[A-Za-z0-9_.\-]+)*$`, - vcs: "bzr", - repo: "https://{root}", - check: launchpadVCS, - }, - - // Git at OpenStack - { - prefix: "git.openstack.org", - re: `^(?Pgit\.openstack\.org/[A-Za-z0-9_.\-]+/[A-Za-z0-9_.\-]+)(\.git)?(/[A-Za-z0-9_.\-]+)*$`, - vcs: "git", - repo: "https://{root}", - check: noVCSSuffix, - }, - - // General syntax for any server. - { - re: `^(?P(?P([a-z0-9.\-]+\.)+[a-z0-9.\-]+(:[0-9]+)?/[A-Za-z0-9_.\-/]*?)\.(?Pbzr|git|hg|svn))(/[A-Za-z0-9_.\-]+)*$`, - ping: true, - }, -} - -func init() { - // fill in cached regexps. - // Doing this eagerly discovers invalid regexp syntax - // without having to run a command that needs that regexp. - for _, srv := range vcsPaths { - srv.regexp = regexp.MustCompile(srv.re) - } -} - -// noVCSSuffix checks that the repository name does not -// end in .foo for any version control system foo. -// The usual culprit is ".git". -func noVCSSuffix(match map[string]string) error { - repo := match["repo"] - for _, vcs := range vcsList { - if strings.HasSuffix(repo, "."+vcs.Cmd) { - return fmt.Errorf("invalid version control suffix in %s path", match["prefix"]) - } - } - return nil -} - -// bitbucketVCS determines the version control system for a -// Bitbucket repository, by using the Bitbucket API. -func bitbucketVCS(match map[string]string) error { - if err := noVCSSuffix(match); err != nil { - return err - } - - var resp struct { - SCM string `json:"scm"` - } - url := expand(match, "https://api.bitbucket.org/2.0/repositories/{bitname}?fields=scm") - data, err := httpGET(url) - if err != nil { - return err - } - if err := json.Unmarshal(data, &resp); err != nil { - return fmt.Errorf("decoding %s: %v", url, err) - } - - if ByCmd(resp.SCM) != nil { - match["vcs"] = resp.SCM - if resp.SCM == "git" { - match["repo"] += ".git" - } - return nil - } - - return fmt.Errorf("unable to detect version control system for bitbucket.org/ path") -} - -// launchpadVCS solves the ambiguity for "lp.net/project/foo". In this case, -// "foo" could be a series name registered in Launchpad with its own branch, -// and it could also be the name of a directory within the main project -// branch one level up. -func launchpadVCS(match map[string]string) error { - if match["project"] == "" || match["series"] == "" { - return nil - } - _, err := httpGET(expand(match, "https://code.launchpad.net/{project}{series}/.bzr/branch-format")) - if err != nil { - match["root"] = expand(match, "launchpad.net/{project}") - match["repo"] = expand(match, "https://{root}") - } - return nil -} diff --git a/vendor/gotest.tools/.codecov.yml b/vendor/gotest.tools/.codecov.yml deleted file mode 100644 index 4dd7324d625..00000000000 --- a/vendor/gotest.tools/.codecov.yml +++ /dev/null @@ -1,8 +0,0 @@ -coverage: - status: - project: - default: - threshold: 2 - patch: - default: - threshold: 20 diff --git a/vendor/gotest.tools/.gitignore b/vendor/gotest.tools/.gitignore deleted file mode 100644 index 97a6510b2bf..00000000000 --- a/vendor/gotest.tools/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -vendor/ -.dobi/ -Gopkg.lock -.depsources -dist/ diff --git a/vendor/gotest.tools/BUILD b/vendor/gotest.tools/BUILD deleted file mode 100644 index c867ee6a45d..00000000000 --- a/vendor/gotest.tools/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["pkg.go"], - importmap = "k8s.io/kubernetes/vendor/gotest.tools", - importpath = "gotest.tools", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//vendor/gotest.tools/gotestsum:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/gotest.tools/Gopkg.toml b/vendor/gotest.tools/Gopkg.toml deleted file mode 100644 index 2beadc11dc2..00000000000 --- a/vendor/gotest.tools/Gopkg.toml +++ /dev/null @@ -1,16 +0,0 @@ - -[[constraint]] - name = "github.com/pkg/errors" - version = "0.8.0" - -[[constraint]] - name = "github.com/spf13/pflag" - version = "1.0.0" - -[[constraint]] - name = "github.com/google/go-cmp" - version = "0.2.0" - -[[constraint]] - branch = "master" - name = "golang.org/x/tools" diff --git a/vendor/gotest.tools/LICENSE b/vendor/gotest.tools/LICENSE deleted file mode 100644 index aeaa2fac3dc..00000000000 --- a/vendor/gotest.tools/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2018 gotest.tools authors - -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. diff --git a/vendor/gotest.tools/README.md b/vendor/gotest.tools/README.md deleted file mode 100644 index 26a2026de2a..00000000000 --- a/vendor/gotest.tools/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# gotest.tools - -A collection of packages to augment `testing` and support common patterns. - -[![GoDoc](https://godoc.org/gotest.tools?status.svg)](https://godoc.org/gotest.tools) -[![CircleCI](https://circleci.com/gh/gotestyourself/gotest.tools/tree/master.svg?style=shield)](https://circleci.com/gh/gotestyourself/gotest.tools/tree/master) -[![Go Reportcard](https://goreportcard.com/badge/gotest.tools)](https://goreportcard.com/report/gotest.tools) - - -## Packages - -* [assert](http://godoc.org/gotest.tools/assert) - - compare values and fail the test when a comparison fails -* [env](http://godoc.org/gotest.tools/env) - - test code which uses environment variables -* [fs](http://godoc.org/gotest.tools/fs) - - create temporary files and compare a filesystem tree to an expected value -* [golden](http://godoc.org/gotest.tools/golden) - - compare large multi-line strings against values frozen in golden files -* [icmd](http://godoc.org/gotest.tools/icmd) - - execute binaries and test the output -* [poll](http://godoc.org/gotest.tools/poll) - - test asynchronous code by polling until a desired state is reached -* [skip](http://godoc.org/gotest.tools/skip) - - skip a test and print the source code of the condition used to skip the test - -## Related - -* [gotest.tools/gotestsum](https://github.com/gotestyourself/gotestsum) - go test runner with custom output -* [maxbrunsfeld/counterfeiter](https://github.com/maxbrunsfeld/counterfeiter) - generate fakes for interfaces -* [jonboulle/clockwork](https://github.com/jonboulle/clockwork) - a fake clock for testing code that uses `time` diff --git a/vendor/gotest.tools/appveyor.yml b/vendor/gotest.tools/appveyor.yml deleted file mode 100644 index 032362b227c..00000000000 --- a/vendor/gotest.tools/appveyor.yml +++ /dev/null @@ -1,28 +0,0 @@ -version: "{build}" -image: Visual Studio 2017 - -clone_folder: c:\gopath\src\gotest.tools - -environment: - PATH: c:\go110\bin;%PATH% - GOROOT: c:\go110 - GOPATH: c:\gopath - DEPVERSION: v0.4.1 - -init: - - git config --global core.symlinks true - -install: - - go version - - go env - -deploy: false - -build_script: - - appveyor DownloadFile https://github.com/golang/dep/releases/download/%DEPVERSION%/dep-windows-amd64.exe - - appveyor DownloadFile https://github.com/gotestyourself/gotestsum/releases/download/v0.3.0/gotestsum_0.3.0_windows_amd64.tar.gz - - tar -xzf gotestsum_0.3.0_windows_amd64.tar.gz - - dep-windows-amd64.exe ensure - -test_script: - - gotestsum diff --git a/vendor/gotest.tools/dobi.yaml b/vendor/gotest.tools/dobi.yaml deleted file mode 100644 index 6b577e47789..00000000000 --- a/vendor/gotest.tools/dobi.yaml +++ /dev/null @@ -1,56 +0,0 @@ -meta: - project: gotesttools - -mount=source: - bind: . - path: /go/src/gotest.tools - -mount=depsources: - bind: ./.depsources - path: /go/pkg/dep/sources - -image=builder: - image: gotesttools-dev - context: dobifiles/ - dockerfile: Dockerfile - args: - GOLANG_VERSION: '{env.GOLANG_VERSION:}' - -image=linter: - image: gotesttools-lint - context: dobifiles/ - dockerfile: Dockerfile.lint - -job=shell: - use: builder - mounts: [source, depsources] - interactive: true - command: sh - -job=watch: - use: builder - mounts: [source] - interactive: true - command: | - filewatcher -x vendor gotestsum -- -test.timeout 10s - env: - - 'GOTESTSUM_FORMAT=short-verbose' - - 'GOTESTTOOLS_DEBUG={env.GOTESTTOOLS_DEBUG:}' - -job=test-unit: - use: builder - mounts: [source] - interactive: true - command: scripts/test-unit - -job=deps: - use: builder - mounts: [source, depsources] - command: dep ensure - -job=lint: - use: linter - mounts: [source] - -alias=test: - tasks: [test-unit] diff --git a/vendor/gotest.tools/gometalinter.json b/vendor/gotest.tools/gometalinter.json deleted file mode 100644 index af4596a5f20..00000000000 --- a/vendor/gotest.tools/gometalinter.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "Vendor": true, - "Deadline": "2m", - "Sort": ["linter", "severity", "path"], - "Exclude": [ - "example_test\\.go", - "assert/cmd/gty-migrate-from-testify/testdata", - "internal/difflib/difflib.go" - ], - - "Enable": [ - "deadcode", - "errcheck", - "gocyclo", - "gofmt", - "goimports", - "golint", - "gosimple", - "ineffassign", - "interfacer", - "lll", - "misspell", - "unconvert", - "unparam", - "unused", - "vet" - ], - - "Cyclo": 10, - "LineLength": 100 -} diff --git a/vendor/gotest.tools/gotestsum/.gitignore b/vendor/gotest.tools/gotestsum/.gitignore deleted file mode 100644 index 300ee407d28..00000000000 --- a/vendor/gotest.tools/gotestsum/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -vendor/ -.dobi/ -.depsources -dist/ -junit.xml diff --git a/vendor/gotest.tools/gotestsum/.golangci.yml b/vendor/gotest.tools/gotestsum/.golangci.yml deleted file mode 100644 index 6ca571fb620..00000000000 --- a/vendor/gotest.tools/gotestsum/.golangci.yml +++ /dev/null @@ -1,39 +0,0 @@ -linters-settings: - gocyclo: - min-complexity: 10 - goconst: - min-len: 2 - min-occurrences: 4 - lll: - line-length: 100 - gocritic: - enabled-tags: - - diagnostic - - performance - - style - - experimental - disabled-checks: - - importShadow - - paramTypeCombine - - commentFormatting # https://github.com/go-critic/go-critic/issues/755 - - unnamedResult - settings: - hugeParam: - sizeThreshold: 256 - -issues: - exclude-use-default: false - exclude: - # unparam - - 'result .* is always' - - 'always receives' - -linters: - enable-all: true - disable: - - dupl - - gochecknoglobals - - gochecknoinits - - gosec - - scopelint - - maligned diff --git a/vendor/gotest.tools/gotestsum/.goreleaser.yml b/vendor/gotest.tools/gotestsum/.goreleaser.yml deleted file mode 100644 index 0c5d8cdabb6..00000000000 --- a/vendor/gotest.tools/gotestsum/.goreleaser.yml +++ /dev/null @@ -1,19 +0,0 @@ - -project_name: gotestsum - -release: - github: - owner: gotestyourself - name: gotestsum - -builds: - - binary: gotestsum - goos: - - darwin - - windows - - linux - goarch: [amd64] - env: [CGO_ENABLED=0] - -checksum: - name_template: '{{ .ProjectName }}-{{ .Version }}-checksums.txt' diff --git a/vendor/gotest.tools/gotestsum/BUILD b/vendor/gotest.tools/gotestsum/BUILD deleted file mode 100644 index e2775375cf5..00000000000 --- a/vendor/gotest.tools/gotestsum/BUILD +++ /dev/null @@ -1,47 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "exitcode.go", - "flags.go", - "handler.go", - "main.go", - ], - importmap = "k8s.io/kubernetes/vendor/gotest.tools/gotestsum", - importpath = "gotest.tools/gotestsum", - visibility = ["//visibility:private"], - deps = [ - "//vendor/github.com/fatih/color:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/github.com/sirupsen/logrus:go_default_library", - "//vendor/github.com/spf13/pflag:go_default_library", - "//vendor/gotest.tools/gotestsum/internal/junitxml:go_default_library", - "//vendor/gotest.tools/gotestsum/testjson:go_default_library", - ], -) - -go_binary( - name = "gotestsum", - embed = [":go_default_library"], - tags = ["manual"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//vendor/gotest.tools/gotestsum/internal/junitxml:all-srcs", - "//vendor/gotest.tools/gotestsum/testjson:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/gotest.tools/gotestsum/Gopkg.lock b/vendor/gotest.tools/gotestsum/Gopkg.lock deleted file mode 100644 index a8ae3ff7bd5..00000000000 --- a/vendor/gotest.tools/gotestsum/Gopkg.lock +++ /dev/null @@ -1,105 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - name = "github.com/fatih/color" - packages = ["."] - revision = "507f6050b8568533fb3f5504de8e5205fa62a114" - version = "v1.6.0" - -[[projects]] - name = "github.com/google/go-cmp" - packages = [ - "cmp", - "cmp/internal/diff", - "cmp/internal/function", - "cmp/internal/value" - ] - revision = "3af367b6b30c263d47e8895973edcca9a49cf029" - version = "v0.2.0" - -[[projects]] - name = "github.com/jonboulle/clockwork" - packages = ["."] - revision = "2eee05ed794112d45db504eb05aa693efd2b8b09" - version = "v0.1.0" - -[[projects]] - name = "github.com/mattn/go-colorable" - packages = ["."] - revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072" - version = "v0.0.9" - -[[projects]] - name = "github.com/mattn/go-isatty" - packages = ["."] - revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" - version = "v0.0.3" - -[[projects]] - name = "github.com/pkg/errors" - packages = ["."] - revision = "645ef00459ed84a119197bfb8d8205042c6df63d" - version = "v0.8.0" - -[[projects]] - name = "github.com/sirupsen/logrus" - packages = ["."] - revision = "c155da19408a8799da419ed3eeb0cb5db0ad5dbc" - version = "v1.0.5" - -[[projects]] - name = "github.com/spf13/pflag" - packages = ["."] - revision = "583c0c0531f06d5278b7d917446061adc344b5cd" - version = "v1.0.1" - -[[projects]] - branch = "master" - name = "golang.org/x/crypto" - packages = ["ssh/terminal"] - revision = "b49d69b5da943f7ef3c9cf91c8777c1f78a0cc3c" - -[[projects]] - branch = "master" - name = "golang.org/x/net" - packages = ["context"] - revision = "c10e9556a7bc0e7c942242b606f0acf024ad5d6a" - -[[projects]] - branch = "master" - name = "golang.org/x/sync" - packages = ["errgroup"] - revision = "1d60e4601c6fd243af51cc01ddf169918a5407ca" - -[[projects]] - branch = "master" - name = "golang.org/x/sys" - packages = [ - "unix", - "windows" - ] - revision = "cbbc999da32df943dac6cd71eb3ee39e1d7838b9" - -[[projects]] - name = "gotest.tools" - packages = [ - "assert", - "assert/cmp", - "assert/opt", - "env", - "golden", - "internal/difflib", - "internal/format", - "internal/source", - "x/subtest" - ] - revision = "14eefd8766a1439cddfc295ecf6327cb422b4bb2" - version = "v2.0.0" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "552c8a2217a39dc7af8c93bc05a914c24c4b1ce338df4dfd972f9e436f2ef3bb" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/gotest.tools/gotestsum/Gopkg.toml b/vendor/gotest.tools/gotestsum/Gopkg.toml deleted file mode 100644 index a456dc743c9..00000000000 --- a/vendor/gotest.tools/gotestsum/Gopkg.toml +++ /dev/null @@ -1,32 +0,0 @@ -[prune] - non-go = true - go-tests = true - unused-packages = true - -[[constraint]] - name = "github.com/google/go-cmp" - version = "0.2.0" - -[[constraint]] - name = "github.com/jonboulle/clockwork" - version = "0.1.0" - -[[constraint]] - name = "github.com/pkg/errors" - version = "0.8.0" - -[[constraint]] - name = "github.com/spf13/pflag" - version = "1.0.0" - -[[constraint]] - name = "github.com/sirupsen/logrus" - version = "1.0.5" - -[[constraint]] - name = "gotest.tools" - version = "2.0.0" - -[[constraint]] - name = "github.com/fatih/color" - version = "1.6.0" diff --git a/vendor/gotest.tools/gotestsum/LICENSE b/vendor/gotest.tools/gotestsum/LICENSE deleted file mode 100644 index d6456956733..00000000000 --- a/vendor/gotest.tools/gotestsum/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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. diff --git a/vendor/gotest.tools/gotestsum/README.md b/vendor/gotest.tools/gotestsum/README.md deleted file mode 100644 index c7efa5d333b..00000000000 --- a/vendor/gotest.tools/gotestsum/README.md +++ /dev/null @@ -1,154 +0,0 @@ -# gotestsum - -`gotestsum` runs tests, prints friendly test output and a summary of the test run. Requires Go 1.10+. - -## Install - -Download a binary from [releases](https://github.com/gotestyourself/gotestsum/releases), or get the -source with `go get gotest.tools/gotestsum` (you may need to run `dep ensure`). - -## Demo - -![Demo](https://raw.githubusercontent.com/gotestyourself/gotestsum/master/docs/demo.gif) - -## Docs - -[![GoDoc](https://godoc.org/gotest.tools/gotestsum?status.svg)](https://godoc.org/gotest.tools/gotestsum) -[![CircleCI](https://circleci.com/gh/gotestyourself/gotestsum/tree/master.svg?style=shield)](https://circleci.com/gh/gotestyourself/gotestsum/tree/master) -[![Go Reportcard](https://goreportcard.com/badge/gotest.tools/gotestsum)](https://goreportcard.com/report/gotest.tools/gotestsum) - -`gotestsum` works by running `go test --json ./...` and reading the JSON -output. - -### TOC - -- [Format](#format) -- [Summary](#summary) -- [JUnit XML](#junit-xml) -- [JSON file](#json-file-output) -- [Setting go test flags and using custom commands](#custom-go-test-command) - -### Format - -Set a format with the `--format` flag or the `GOTESTSUM_FORMAT` environment -variable. -``` -gotestsum --format short-verbose -``` - -Supported formats: - * `dots` - output one character per test. - * `short` (default) - output a line for each test package. - * `standard-quiet` - the default `go test` format. - * `short-verbose` - output a line for each test and package. - * `standard-verbose` - the standard `go test -v` format. - -Have a suggestion for some other format? Please open an issue! - -### Summary - -A summary of the test run is printed after the test output. - -``` -DONE 101 tests[, 3 skipped][, 2 failures][, 1 error] in 0.103s -``` - -The summary includes: - * A count of: tests run, tests skipped, tests failed, and package build errors. - * Elapsed time including time to build. - * Test output of all failed and skipped tests, and any package build errors. - -To disable parts of the summary use `--no-summary section`. - -Example: hide skipped tests in the summary -``` -gotestsum --no-summary=skipped -``` - -Example: hide failed and skipped -``` -gotestsum --no-summary=skipped,failed -``` - -Example: hide output in the summary, only print names of failed and skipped tests -and errors -``` -gotestsum --no-summary=output -``` - -### JUnit XML - -When the `--junitfile` flag or `GOTESTSUM_JUNITFILE` environment variable are set -to a file path `gotestsum` will write a test report, in JUnit XML format, to the file. -This file can be used to integrate with CI systems. - -``` -gotestsum --junitfile unit-tests.xml -``` - -### JSON file output - -When the `--jsonfile` flag or `GOTESTSUM_JSONFILE` environment variable are set -to a file path `gotestsum` will write a line-delimited JSON file with all the -[test2json](https://golang.org/cmd/test2json/#hdr-Output_Format) -output that was written by `go test --json`. This file can be used to compare test -runs, or find flaky tests. - -``` -gotestsum --jsonfile test-output.log -``` - -### Custom `go test` command - -By default `gotestsum` runs tests using the command `go test --json ./...`. You -can change the command with positional arguments after a `--`. You can change just the -test directory value (which defaults to `./...`) by setting the `TEST_DIRECTORY` -environment variable. - -You can use `--debug` to echo the command before it is run. - -Example: set build tags -``` -gotestsum -- -tags=integration ./... -``` - -Example: run tests in a single package -``` -gotestsum -- ./io/http -``` - -Example: enable coverage -``` -gotestsum -- -coverprofile=cover.out ./... -``` - -Example: run a script instead of `go test` -``` -gotestsum --raw-command -- ./scripts/run_tests.sh -``` - -Note: when using `--raw-command` you must ensure that the stdout produced by -the script only contains the `test2json` output. Any stderr produced by the script -will be considered an error (this behaviour is necessary because package build errors -are only reported by writting to stderr, not the `test2json` stdout). Any stderr -produced by tests is not considered an error (it will be in the `test2json` stdout). - -Example: using `TEST_DIRECTORY` -``` -TEST_DIRECTORY=./io/http gotestsum -``` - -### Run tests when a file is modified - -[filewatcher](https://github.com/dnephin/filewatcher) will automatically set the -`TEST_DIRECTORY` environment variable which makes it easy to integrate -`gotestsum`. - -Example: run tests for a package when any file in that package is saved -``` -filewatcher gotestsum -``` - -## Thanks - -This package is heavily influenced by the [pytest](https://docs.pytest.org) test runner for `python`. diff --git a/vendor/gotest.tools/gotestsum/dobi.yaml b/vendor/gotest.tools/gotestsum/dobi.yaml deleted file mode 100644 index f35cb378b80..00000000000 --- a/vendor/gotest.tools/gotestsum/dobi.yaml +++ /dev/null @@ -1,56 +0,0 @@ -meta: - project: gotestsum - -mount=source: - bind: . - path: /go/src/gotest.tools/gotestsum - -mount=buildcache: - bind: ~/.cache/go-build - path: /root/.cache/go-build - -mount=modcache: - bind: ~/go/pkg/mod - path: /go/pkg/mod - -image=builder: - image: gotestsum-dev - context: dobifiles/ - dockerfile: Dockerfile - target: dev - args: - GOLANG_VERSION: '{env.GOLANG_VERSION:}' - -job=shell: - use: builder - mounts: [source, buildcache, modcache] - interactive: true - command: sh - -job=watch: - use: builder - mounts: [source, buildcache, modcache] - interactive: true - command: | - filewatcher -x vendor ./dist/gotestsum -- -test.timeout 10s - env: ['GOTESTSUM_FORMAT=short-verbose'] - depends: [binary] - -job=test-unit: - use: builder - mounts: [source, buildcache, modcache] - interactive: true - command: scripts/test-unit - -job=lint: - use: builder - mounts: [source, buildcache, modcache] - command: golangci-lint run - -job=binary: - use: builder - mounts: [source, buildcache, modcache] - command: bash -c 'mkdir -p dist; go build -o dist/gotestsum .' - -alias=test: - tasks: [test-unit] diff --git a/vendor/gotest.tools/gotestsum/exitcode.go b/vendor/gotest.tools/gotestsum/exitcode.go deleted file mode 100644 index f5d2a2a50eb..00000000000 --- a/vendor/gotest.tools/gotestsum/exitcode.go +++ /dev/null @@ -1,35 +0,0 @@ -package main - -import ( - "os/exec" - "syscall" - - "github.com/pkg/errors" -) - -// Copied from gotestyourself/icmd - -// GetExitCode returns the ExitStatus of a process from the error returned by -// exec.Run(). If the exit status is not available an error is returned. -func GetExitCode(err error) (int, error) { - if exiterr, ok := err.(*exec.ExitError); ok { - if procExit, ok := exiterr.Sys().(syscall.WaitStatus); ok { - return procExit.ExitStatus(), nil - } - } - return 0, errors.Wrap(err, "failed to get exit code") -} - -// ExitCodeWithDefault returns ExitStatus of a process from the error returned by -// exec.Run(). If the exit status is not available return a default of 127. -func ExitCodeWithDefault(err error) int { - if err == nil { - return 0 - } - exitCode, exiterr := GetExitCode(err) - if exiterr != nil { - // we've failed to retrieve exit code, so we set it to 127 - return 127 - } - return exitCode -} diff --git a/vendor/gotest.tools/gotestsum/flags.go b/vendor/gotest.tools/gotestsum/flags.go deleted file mode 100644 index 2f4e09b432c..00000000000 --- a/vendor/gotest.tools/gotestsum/flags.go +++ /dev/null @@ -1,49 +0,0 @@ -package main - -import ( - "encoding/csv" - "strings" - - "github.com/pkg/errors" - "gotest.tools/gotestsum/testjson" -) - -type noSummaryValue struct { - value testjson.Summary -} - -func newNoSummaryValue() *noSummaryValue { - return &noSummaryValue{value: testjson.SummarizeAll} -} - -func readAsCSV(val string) ([]string, error) { - if val == "" { - return nil, nil - } - return csv.NewReader(strings.NewReader(val)).Read() -} - -func (s *noSummaryValue) Set(val string) error { - v, err := readAsCSV(val) - if err != nil { - return err - } - for _, item := range v { - summary, ok := testjson.NewSummary(item) - if !ok { - return errors.Errorf("value must be one or more of: %s", - testjson.SummarizeAll.String()) - } - s.value -= summary - } - return nil -} - -func (s *noSummaryValue) Type() string { - return "summary" -} - -func (s *noSummaryValue) String() string { - // flip all the bits, since the flag value is the negative of what is stored - return (testjson.SummarizeAll ^ s.value).String() -} diff --git a/vendor/gotest.tools/gotestsum/go.mod b/vendor/gotest.tools/gotestsum/go.mod deleted file mode 100644 index ec5344e3e07..00000000000 --- a/vendor/gotest.tools/gotestsum/go.mod +++ /dev/null @@ -1,21 +0,0 @@ -module gotest.tools/gotestsum - -require ( - github.com/fatih/color v1.6.0 - github.com/google/go-cmp v0.2.0 - github.com/jonboulle/clockwork v0.1.0 - github.com/mattn/go-colorable v0.0.9 // indirect - github.com/mattn/go-isatty v0.0.3 // indirect - github.com/onsi/ginkgo v1.8.0 // indirect - github.com/onsi/gomega v1.4.3 // indirect - github.com/pkg/errors v0.8.0 - github.com/sirupsen/logrus v1.0.5 - github.com/spf13/pflag v1.0.1 - github.com/stretchr/testify v1.3.0 // indirect - golang.org/x/crypto v0.0.0-20180426230345-b49d69b5da94 // indirect - golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc // indirect - golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f - gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect - gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect - gotest.tools v2.1.0+incompatible -) diff --git a/vendor/gotest.tools/gotestsum/go.sum b/vendor/gotest.tools/gotestsum/go.sum deleted file mode 100644 index d5a084b96ae..00000000000 --- a/vendor/gotest.tools/gotestsum/go.sum +++ /dev/null @@ -1,59 +0,0 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/fatih/color v1.6.0 h1:66qjqZk8kalYAvDRtM1AdAJQI0tj4Wrue3Eq3B3pmFU= -github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sirupsen/logrus v1.0.5 h1:8c8b5uO0zS4X6RPl/sd1ENwSkIc0/H2PaHxE3udaE8I= -github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -golang.org/x/crypto v0.0.0-20180426230345-b49d69b5da94 h1:m5xBqfQdnzv6XuV/pJizrLOwUoGzyn1J249cA0cKL4o= -golang.org/x/crypto v0.0.0-20180426230345-b49d69b5da94/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc h1:ZMCWScCvS2fUVFw8LOpxyUUW5qiviqr4Dg5NdjLeiLU= -golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gotest.tools v2.1.0+incompatible h1:5USw7CrJBYKqjg9R7QlA6jzqZKEAtvW82aNmsxxGPxw= -gotest.tools v2.1.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= diff --git a/vendor/gotest.tools/gotestsum/handler.go b/vendor/gotest.tools/gotestsum/handler.go deleted file mode 100644 index f5e9774203c..00000000000 --- a/vendor/gotest.tools/gotestsum/handler.go +++ /dev/null @@ -1,87 +0,0 @@ -package main - -import ( - "io" - "os" - - "github.com/pkg/errors" - log "github.com/sirupsen/logrus" - "gotest.tools/gotestsum/internal/junitxml" - "gotest.tools/gotestsum/testjson" -) - -type eventHandler struct { - formatter testjson.EventFormatter - out io.Writer - err io.Writer - jsonFile io.WriteCloser -} - -func (h *eventHandler) Err(text string) error { - _, err := h.err.Write([]byte(text + "\n")) - return err -} - -func (h *eventHandler) Event(event testjson.TestEvent, execution *testjson.Execution) error { - if h.jsonFile != nil { - _, err := h.jsonFile.Write(append(event.Bytes(), '\n')) - if err != nil { - return errors.Wrap(err, "failed to write JSON file") - } - } - - line, err := h.formatter(event, execution) - if err != nil { - return errors.Wrap(err, "failed to format event") - } - _, err = h.out.Write([]byte(line)) - return errors.Wrap(err, "failed to write event") -} - -func (h *eventHandler) Close() error { - if h.jsonFile != nil { - if err := h.jsonFile.Close(); err != nil { - log.WithError(err).Error("failed to close JSON file") - } - } - return nil -} - -var _ testjson.EventHandler = &eventHandler{} - -func newEventHandler(opts *options, wout io.Writer, werr io.Writer) (*eventHandler, error) { - formatter := testjson.NewEventFormatter(opts.format) - if formatter == nil { - return nil, errors.Errorf("unknown format %s", opts.format) - } - handler := &eventHandler{ - formatter: formatter, - out: wout, - err: werr, - } - var err error - if opts.jsonFile != "" { - handler.jsonFile, err = os.Create(opts.jsonFile) - if err != nil { - return handler, errors.Wrap(err, "failed to open JSON file") - } - } - return handler, nil -} - -func writeJUnitFile(filename string, execution *testjson.Execution) error { - if filename == "" { - return nil - } - junitFile, err := os.Create(filename) - if err != nil { - return errors.Wrap(err, "failed to open JUnit file") - } - defer func() { - if err := junitFile.Close(); err != nil { - log.WithError(err).Error("failed to close JUnit file") - } - }() - - return junitxml.Write(junitFile, execution) -} diff --git a/vendor/gotest.tools/gotestsum/internal/junitxml/BUILD b/vendor/gotest.tools/gotestsum/internal/junitxml/BUILD deleted file mode 100644 index 854cead7cec..00000000000 --- a/vendor/gotest.tools/gotestsum/internal/junitxml/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["report.go"], - importmap = "k8s.io/kubernetes/vendor/gotest.tools/gotestsum/internal/junitxml", - importpath = "gotest.tools/gotestsum/internal/junitxml", - visibility = ["//vendor/gotest.tools/gotestsum:__subpackages__"], - deps = [ - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/github.com/sirupsen/logrus:go_default_library", - "//vendor/gotest.tools/gotestsum/testjson:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/gotest.tools/gotestsum/internal/junitxml/report.go b/vendor/gotest.tools/gotestsum/internal/junitxml/report.go deleted file mode 100644 index 47171defb8b..00000000000 --- a/vendor/gotest.tools/gotestsum/internal/junitxml/report.go +++ /dev/null @@ -1,173 +0,0 @@ -/*Package junitxml creates a JUnit XML report from a testjson.Execution. - */ -package junitxml - -import ( - "encoding/xml" - "fmt" - "io" - "os" - "os/exec" - "strings" - "time" - - "github.com/pkg/errors" - "github.com/sirupsen/logrus" - "gotest.tools/gotestsum/testjson" -) - -// JUnitTestSuites is a collection of JUnit test suites. -type JUnitTestSuites struct { - XMLName xml.Name `xml:"testsuites"` - Suites []JUnitTestSuite -} - -// JUnitTestSuite is a single JUnit test suite which may contain many -// testcases. -type JUnitTestSuite struct { - XMLName xml.Name `xml:"testsuite"` - Tests int `xml:"tests,attr"` - Failures int `xml:"failures,attr"` - Time string `xml:"time,attr"` - Name string `xml:"name,attr"` - Properties []JUnitProperty `xml:"properties>property,omitempty"` - TestCases []JUnitTestCase -} - -// JUnitTestCase is a single test case with its result. -type JUnitTestCase struct { - XMLName xml.Name `xml:"testcase"` - Classname string `xml:"classname,attr"` - Name string `xml:"name,attr"` - Time string `xml:"time,attr"` - SkipMessage *JUnitSkipMessage `xml:"skipped,omitempty"` - Failure *JUnitFailure `xml:"failure,omitempty"` -} - -// JUnitSkipMessage contains the reason why a testcase was skipped. -type JUnitSkipMessage struct { - Message string `xml:"message,attr"` -} - -// JUnitProperty represents a key/value pair used to define properties. -type JUnitProperty struct { - Name string `xml:"name,attr"` - Value string `xml:"value,attr"` -} - -// JUnitFailure contains data related to a failed test. -type JUnitFailure struct { - Message string `xml:"message,attr"` - Type string `xml:"type,attr"` - Contents string `xml:",chardata"` -} - -// Write creates an XML document and writes it to out. -func Write(out io.Writer, exec *testjson.Execution) error { - return errors.Wrap(write(out, generate(exec)), "failed to write JUnit XML") -} - -func generate(exec *testjson.Execution) JUnitTestSuites { - version := goVersion() - suites := JUnitTestSuites{} - for _, pkgname := range exec.Packages() { - pkg := exec.Package(pkgname) - junitpkg := JUnitTestSuite{ - Name: pkgname, - Tests: pkg.Total, - Time: formatDurationAsSeconds(pkg.Elapsed()), - Properties: packageProperties(version), - TestCases: packageTestCases(pkg), - Failures: len(pkg.Failed), - } - suites.Suites = append(suites.Suites, junitpkg) - } - return suites -} - -func formatDurationAsSeconds(d time.Duration) string { - return fmt.Sprintf("%f", d.Seconds()) -} - -func packageProperties(goVersion string) []JUnitProperty { - return []JUnitProperty{ - {Name: "go.version", Value: goVersion}, - } -} - -// goVersion returns the version as reported by the go binary in PATH. This -// version will not be the same as runtime.Version, which is always the version -// of go used to build the gotestsum binary. -// -// To skip the os/exec call set the GOVERSION environment variable to the -// desired value. -func goVersion() string { - if version, ok := os.LookupEnv("GOVERSION"); ok { - return version - } - logrus.Debugf("exec: go version") - cmd := exec.Command("go", "version") - out, err := cmd.Output() - if err != nil { - logrus.WithError(err).Warn("failed to lookup go version for junit xml") - return "unknown" - } - return strings.TrimPrefix(strings.TrimSpace(string(out)), "go version ") -} - -func packageTestCases(pkg *testjson.Package) []JUnitTestCase { - cases := []JUnitTestCase{} - - if pkg.TestMainFailed() { - jtc := newJUnitTestCase(testjson.TestCase{ - Test: "TestMain", - }) - jtc.Failure = &JUnitFailure{ - Message: "Failed", - Contents: pkg.Output(""), - } - cases = append(cases, jtc) - } - - for _, tc := range pkg.Failed { - jtc := newJUnitTestCase(tc) - jtc.Failure = &JUnitFailure{ - Message: "Failed", - Contents: pkg.Output(tc.Test), - } - cases = append(cases, jtc) - } - - for _, tc := range pkg.Skipped { - jtc := newJUnitTestCase(tc) - jtc.SkipMessage = &JUnitSkipMessage{Message: pkg.Output(tc.Test)} - cases = append(cases, jtc) - } - - for _, tc := range pkg.Passed { - jtc := newJUnitTestCase(tc) - cases = append(cases, jtc) - } - return cases -} - -func newJUnitTestCase(tc testjson.TestCase) JUnitTestCase { - return JUnitTestCase{ - Classname: tc.Package, - Name: tc.Test, - Time: formatDurationAsSeconds(tc.Elapsed), - } -} - -func write(out io.Writer, suites JUnitTestSuites) error { - doc, err := xml.MarshalIndent(suites, "", "\t") - if err != nil { - return err - } - _, err = out.Write([]byte(xml.Header)) - if err != nil { - return err - } - _, err = out.Write(doc) - return err -} diff --git a/vendor/gotest.tools/gotestsum/main.go b/vendor/gotest.tools/gotestsum/main.go deleted file mode 100644 index 128436ad610..00000000000 --- a/vendor/gotest.tools/gotestsum/main.go +++ /dev/null @@ -1,214 +0,0 @@ -package main - -import ( - "context" - "fmt" - "io" - "os" - "os/exec" - "strings" - - "github.com/fatih/color" - "github.com/pkg/errors" - log "github.com/sirupsen/logrus" - "github.com/spf13/pflag" - "gotest.tools/gotestsum/testjson" -) - -var version = "master" - -func main() { - name := os.Args[0] - flags, opts := setupFlags(name) - switch err := flags.Parse(os.Args[1:]); { - case err == pflag.ErrHelp: - os.Exit(0) - case err != nil: - log.Error(err.Error()) - flags.Usage() - os.Exit(1) - } - opts.args = flags.Args() - setupLogging(opts) - - if opts.version { - fmt.Fprintf(os.Stdout, "gotestsum version %s\n", version) - os.Exit(0) - } - - switch err := run(opts).(type) { - case nil: - case *exec.ExitError: - // go test should already report the error to stderr so just exit with - // the same status code - os.Exit(ExitCodeWithDefault(err)) - default: - fmt.Fprintln(os.Stderr, name+": Error: "+err.Error()) - os.Exit(3) - } -} - -func setupFlags(name string) (*pflag.FlagSet, *options) { - opts := &options{noSummary: newNoSummaryValue()} - flags := pflag.NewFlagSet(name, pflag.ContinueOnError) - flags.SetInterspersed(false) - flags.Usage = func() { - fmt.Fprintf(os.Stderr, `Usage: - %s [flags] [--] [go test flags] - -Flags: -`, name) - flags.PrintDefaults() - fmt.Fprint(os.Stderr, ` -Formats: - dots print a character for each test - short print a line for each package - short-verbose print a line for each test and package - standard-quiet default go test format - standard-verbose default go test -v format -`) - } - flags.BoolVar(&opts.debug, "debug", false, "enabled debug") - flags.StringVarP(&opts.format, "format", "f", - lookEnvWithDefault("GOTESTSUM_FORMAT", "short"), - "print format of test input") - flags.BoolVar(&opts.rawCommand, "raw-command", false, - "don't prepend 'go test -json' to the 'go test' command") - flags.StringVar(&opts.jsonFile, "jsonfile", - lookEnvWithDefault("GOTESTSUM_JSONFILE", ""), - "write all TestEvents to file") - flags.StringVar(&opts.junitFile, "junitfile", - lookEnvWithDefault("GOTESTSUM_JUNITFILE", ""), - "write a JUnit XML file") - flags.BoolVar(&opts.noColor, "no-color", false, "disable color output") - flags.Var(opts.noSummary, "no-summary", - fmt.Sprintf("do not print summary of: %s", testjson.SummarizeAll.String())) - flags.BoolVar(&opts.version, "version", false, "show version and exit") - return flags, opts -} - -func lookEnvWithDefault(key, defValue string) string { - if value := os.Getenv(key); value != "" { - return value - } - return defValue -} - -type options struct { - args []string - format string - debug bool - rawCommand bool - jsonFile string - junitFile string - noColor bool - noSummary *noSummaryValue - version bool -} - -func setupLogging(opts *options) { - if opts.debug { - log.SetLevel(log.DebugLevel) - } - if opts.noColor { - color.NoColor = true - } -} - -// TODO: add flag --max-failures -func run(opts *options) error { - ctx := context.Background() - goTestProc, err := startGoTest(ctx, goTestCmdArgs(opts)) - if err != nil { - return errors.Wrapf(err, "failed to run %s %s", - goTestProc.cmd.Path, - strings.Join(goTestProc.cmd.Args, " ")) - } - defer goTestProc.cancel() - - out := os.Stdout - handler, err := newEventHandler(opts, out, os.Stderr) - if err != nil { - return err - } - defer handler.Close() // nolint: errcheck - exec, err := testjson.ScanTestOutput(testjson.ScanConfig{ - Stdout: goTestProc.stdout, - Stderr: goTestProc.stderr, - Handler: handler, - }) - if err != nil { - return err - } - if err := testjson.PrintSummary(out, exec, opts.noSummary.value); err != nil { - return err - } - if err := writeJUnitFile(opts.junitFile, exec); err != nil { - return err - } - return goTestProc.cmd.Wait() -} - -func goTestCmdArgs(opts *options) []string { - args := opts.args - defaultArgs := []string{"go", "test"} - switch { - case opts.rawCommand: - return args - case len(args) == 0: - return append(defaultArgs, "-json", pathFromEnv("./...")) - case !hasJSONArg(args): - defaultArgs = append(defaultArgs, "-json") - } - if testPath := pathFromEnv(""); testPath != "" { - args = append(args, testPath) - } - return append(defaultArgs, args...) -} - -func pathFromEnv(defaultPath string) string { - return lookEnvWithDefault("TEST_DIRECTORY", defaultPath) -} - -func hasJSONArg(args []string) bool { - for _, arg := range args { - if arg == "-json" || arg == "--json" { - return true - } - } - return false -} - -type proc struct { - cmd *exec.Cmd - stdout io.Reader - stderr io.Reader - cancel func() -} - -func startGoTest(ctx context.Context, args []string) (proc, error) { - if len(args) == 0 { - return proc{}, errors.New("missing command to run") - } - - ctx, cancel := context.WithCancel(ctx) - p := proc{ - cmd: exec.CommandContext(ctx, args[0], args[1:]...), - cancel: cancel, - } - log.Debugf("exec: %s", p.cmd.Args) - var err error - p.stdout, err = p.cmd.StdoutPipe() - if err != nil { - return p, err - } - p.stderr, err = p.cmd.StderrPipe() - if err != nil { - return p, err - } - err = p.cmd.Start() - if err == nil { - log.Debugf("go test pid: %d", p.cmd.Process.Pid) - } - return p, err -} diff --git a/vendor/gotest.tools/gotestsum/testjson/BUILD b/vendor/gotest.tools/gotestsum/testjson/BUILD deleted file mode 100644 index de2fd03078f..00000000000 --- a/vendor/gotest.tools/gotestsum/testjson/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "doc.go", - "execution.go", - "format.go", - "pkgpathprefix.go", - "summary.go", - ], - importmap = "k8s.io/kubernetes/vendor/gotest.tools/gotestsum/testjson", - importpath = "gotest.tools/gotestsum/testjson", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/fatih/color:go_default_library", - "//vendor/github.com/jonboulle/clockwork:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/github.com/sirupsen/logrus:go_default_library", - "//vendor/golang.org/x/sync/errgroup:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/gotest.tools/gotestsum/testjson/doc.go b/vendor/gotest.tools/gotestsum/testjson/doc.go deleted file mode 100644 index 9816b80b119..00000000000 --- a/vendor/gotest.tools/gotestsum/testjson/doc.go +++ /dev/null @@ -1 +0,0 @@ -package testjson // import "gotest.tools/gotestsum/testjson" diff --git a/vendor/gotest.tools/gotestsum/testjson/execution.go b/vendor/gotest.tools/gotestsum/testjson/execution.go deleted file mode 100644 index 6b96292c500..00000000000 --- a/vendor/gotest.tools/gotestsum/testjson/execution.go +++ /dev/null @@ -1,379 +0,0 @@ -package testjson - -import ( - "bufio" - "bytes" - "encoding/json" - "fmt" - "io" - "sort" - "strings" - "time" - - "github.com/jonboulle/clockwork" - "github.com/pkg/errors" - "github.com/sirupsen/logrus" - "golang.org/x/sync/errgroup" -) - -// Action of TestEvent -type Action string - -// nolint: unused -const ( - ActionRun Action = "run" - ActionPause Action = "pause" - ActionCont Action = "cont" - ActionPass Action = "pass" - ActionBench Action = "bench" - ActionFail Action = "fail" - ActionOutput Action = "output" - ActionSkip Action = "skip" -) - -// TestEvent is a structure output by go tool test2json and go test -json. -type TestEvent struct { - // Time encoded as an RFC3339-format string - Time time.Time - Action Action - Package string - Test string - // Elapsed time in seconds - Elapsed float64 - // Output of test or benchmark - Output string - // raw is the raw JSON bytes of the event - raw []byte -} - -// PackageEvent returns true if the event is a package start or end event -func (e TestEvent) PackageEvent() bool { - return e.Test == "" -} - -// ElapsedFormatted returns Elapsed formatted in the go test format, ex (0.00s). -func (e TestEvent) ElapsedFormatted() string { - return fmt.Sprintf("(%.2fs)", e.Elapsed) -} - -// Bytes returns the serialized JSON bytes that were parsed to create the event. -func (e TestEvent) Bytes() []byte { - return e.raw -} - -// Package is the set of TestEvents for a single go package -type Package struct { - // TODO: this could be Total() - Total int - Failed []TestCase - Skipped []TestCase - Passed []TestCase - output map[string][]string - // coverage stores the code coverage output for the package without the - // trailing newline (ex: coverage: 91.1% of statements). - coverage string - // action identifies if the package passed or failed. A package may fail - // with no test failures if an init() or TestMain exits non-zero. - // skip indicates there were no tests. - action Action -} - -// Result returns if the package passed, failed, or was skipped because there -// were no tests. -func (p Package) Result() Action { - return p.action -} - -// Elapsed returns the sum of the elapsed time for all tests in the package. -func (p Package) Elapsed() time.Duration { - elapsed := time.Duration(0) - for _, testcase := range p.TestCases() { - elapsed += testcase.Elapsed - } - return elapsed -} - -// TestCases returns all the test cases. -func (p Package) TestCases() []TestCase { - return append(append(p.Passed, p.Failed...), p.Skipped...) -} - -// Output returns the full test output for a test. -func (p Package) Output(test string) string { - return strings.Join(p.output[test], "") -} - -// TestMainFailed returns true if the package failed, but there were no tests. -// This may occur if the package init() or TestMain exited non-zero. -func (p Package) TestMainFailed() bool { - return p.action == ActionFail && len(p.Failed) == 0 -} - -// TestCase stores the name and elapsed time for a test case. -type TestCase struct { - Package string - Test string - Elapsed time.Duration -} - -func newPackage() *Package { - return &Package{output: make(map[string][]string)} -} - -// Execution of one or more test packages -type Execution struct { - started time.Time - packages map[string]*Package - errors []string -} - -func (e *Execution) add(event TestEvent) { - pkg, ok := e.packages[event.Package] - if !ok { - pkg = newPackage() - e.packages[event.Package] = pkg - } - if event.PackageEvent() { - e.addPackageEvent(pkg, event) - return - } - e.addTestEvent(pkg, event) -} - -func (e *Execution) addPackageEvent(pkg *Package, event TestEvent) { - switch event.Action { - case ActionPass, ActionFail: - pkg.action = event.Action - case ActionOutput: - if isCoverageOutput(event.Output) { - pkg.coverage = strings.TrimRight(event.Output, "\n") - } - pkg.output[""] = append(pkg.output[""], event.Output) - } -} - -func (e *Execution) addTestEvent(pkg *Package, event TestEvent) { - switch event.Action { - case ActionRun: - pkg.Total++ - case ActionFail: - pkg.Failed = append(pkg.Failed, TestCase{ - Package: event.Package, - Test: event.Test, - Elapsed: elapsedDuration(event.Elapsed), - }) - case ActionSkip: - pkg.Skipped = append(pkg.Skipped, TestCase{ - Package: event.Package, - Test: event.Test, - Elapsed: elapsedDuration(event.Elapsed), - }) - case ActionOutput, ActionBench: - // TODO: limit size of buffered test output - pkg.output[event.Test] = append(pkg.output[event.Test], event.Output) - case ActionPass: - pkg.Passed = append(pkg.Passed, TestCase{ - Package: event.Package, - Test: event.Test, - Elapsed: elapsedDuration(event.Elapsed), - }) - // Remove test output once a test passes, it wont be used - delete(pkg.output, event.Test) - } -} - -func elapsedDuration(elapsed float64) time.Duration { - return time.Duration(elapsed*1000) * time.Millisecond -} - -func isCoverageOutput(output string) bool { - return all( - strings.HasPrefix(output, "coverage:"), - strings.HasSuffix(output, "% of statements\n")) -} - -// Output returns the full test output for a test. -func (e *Execution) Output(pkg, test string) string { - return strings.Join(e.packages[pkg].output[test], "") -} - -// OutputLines returns the full test output for a test as an array of lines. -func (e *Execution) OutputLines(pkg, test string) []string { - return e.packages[pkg].output[test] -} - -// Package returns the Package by name. -func (e *Execution) Package(name string) *Package { - return e.packages[name] -} - -// Packages returns a sorted list of all package names. -func (e *Execution) Packages() []string { - return sortedKeys(e.packages) -} - -var clock = clockwork.NewRealClock() - -// Elapsed returns the time elapsed since the execution started. -func (e *Execution) Elapsed() time.Duration { - return clock.Now().Sub(e.started) -} - -// Failed returns a list of all the failed test cases. -func (e *Execution) Failed() []TestCase { - var failed []TestCase - for _, name := range sortedKeys(e.packages) { - pkg := e.packages[name] - - // Add package-level failure output if there were no failed tests. - if pkg.TestMainFailed() { - failed = append(failed, TestCase{Package: name}) - } else { - failed = append(failed, pkg.Failed...) - } - } - return failed -} - -func sortedKeys(pkgs map[string]*Package) []string { - keys := make([]string, 0, len(pkgs)) - for key := range pkgs { - keys = append(keys, key) - } - sort.Strings(keys) - return keys -} - -// Skipped returns a list of all the skipped test cases. -func (e *Execution) Skipped() []TestCase { - skipped := make([]TestCase, 0, len(e.packages)) - for _, pkg := range sortedKeys(e.packages) { - skipped = append(skipped, e.packages[pkg].Skipped...) - } - return skipped -} - -// Total returns a count of all test cases. -func (e *Execution) Total() int { - total := 0 - for _, pkg := range e.packages { - total += pkg.Total - } - return total -} - -func (e *Execution) addError(err string) { - // Build errors start with a header - if strings.HasPrefix(err, "# ") { - return - } - // TODO: may need locking, or use a channel - e.errors = append(e.errors, err) -} - -// Errors returns a list of all the errors. -func (e *Execution) Errors() []string { - return e.errors -} - -// NewExecution returns a new Execution and records the current time as the -// time the test execution started. -func NewExecution() *Execution { - return &Execution{ - started: time.Now(), - packages: make(map[string]*Package), - } -} - -// ScanConfig used by ScanTestOutput -type ScanConfig struct { - Stdout io.Reader - Stderr io.Reader - Handler EventHandler -} - -// EventHandler is called by ScanTestOutput for each event and write to stderr. -type EventHandler interface { - Event(event TestEvent, execution *Execution) error - Err(text string) error -} - -// ScanTestOutput reads lines from stdout and stderr, creates an Execution, -// calls the Handler for each event, and returns the Execution. -func ScanTestOutput(config ScanConfig) (*Execution, error) { - execution := NewExecution() - var group errgroup.Group - group.Go(func() error { - return readStdout(config, execution) - }) - group.Go(func() error { - return readStderr(config, execution) - }) - return execution, group.Wait() -} - -func readStdout(config ScanConfig, execution *Execution) error { - scanner := bufio.NewScanner(config.Stdout) - for scanner.Scan() { - raw := scanner.Bytes() - event, err := parseEvent(raw) - switch { - case err == errBadEvent: - // nolint: errcheck - config.Handler.Err(errBadEvent.Error() + ": " + scanner.Text()) - continue - case err != nil: - return errors.Wrapf(err, "failed to parse test output: %s", string(raw)) - } - execution.add(event) - if err := config.Handler.Event(event, execution); err != nil { - return err - } - } - return errors.Wrap(scanner.Err(), "failed to scan test output") -} - -func readStderr(config ScanConfig, execution *Execution) error { - scanner := bufio.NewScanner(config.Stderr) - for scanner.Scan() { - line := scanner.Text() - config.Handler.Err(line) // nolint: errcheck - if isGoModuleOutput(line) { - continue - } - execution.addError(line) - } - return errors.Wrap(scanner.Err(), "failed to scan test stderr") -} - -func isGoModuleOutput(scannerText string) bool { - prefixes := []string{ - "go: copying", - "go: creating", - "go: downloading", - "go: extracting", - "go: finding", - } - - for _, prefix := range prefixes { - if strings.HasPrefix(scannerText, prefix) { - return true - } - } - return false -} - -func parseEvent(raw []byte) (TestEvent, error) { - // TODO: this seems to be a bug in the `go test -json` output - if bytes.HasPrefix(raw, []byte("FAIL")) { - logrus.Warn(string(raw)) - return TestEvent{}, errBadEvent - } - - event := TestEvent{} - err := json.Unmarshal(raw, &event) - event.raw = raw - return event, err -} - -var errBadEvent = errors.New("bad output from test2json") diff --git a/vendor/gotest.tools/gotestsum/testjson/format.go b/vendor/gotest.tools/gotestsum/testjson/format.go deleted file mode 100644 index bfffda58779..00000000000 --- a/vendor/gotest.tools/gotestsum/testjson/format.go +++ /dev/null @@ -1,189 +0,0 @@ -package testjson - -import ( - "fmt" - "strings" - - "github.com/fatih/color" -) - -// EventFormatter is a function which handles an event and returns a string to -// output for the event. -type EventFormatter func(event TestEvent, output *Execution) (string, error) - -func debugFormat(event TestEvent, _ *Execution) (string, error) { - return fmt.Sprintf("%s %s %s (%.3f) [%d] %s\n", - event.Package, - event.Test, - event.Action, - event.Elapsed, - event.Time.Unix(), - event.Output), nil -} - -// go test -v -func standardVerboseFormat(event TestEvent, _ *Execution) (string, error) { - if event.Action == ActionOutput { - return event.Output, nil - } - return "", nil -} - -// go test -func standardQuietFormat(event TestEvent, _ *Execution) (string, error) { - if !event.PackageEvent() { - return "", nil - } - if event.Output != "PASS\n" && !isCoverageOutput(event.Output) { - return event.Output, nil - } - return "", nil -} - -func shortVerboseFormat(event TestEvent, exec *Execution) (string, error) { - result := colorEvent(event)(strings.ToUpper(string(event.Action))) - formatTest := func() string { - return fmt.Sprintf("%s %s.%s %s\n", - result, - relativePackagePath(event.Package), - event.Test, - event.ElapsedFormatted()) - } - - switch { - case isPkgFailureOutput(event): - return event.Output, nil - - case event.PackageEvent(): - switch event.Action { - case ActionSkip: - result = colorEvent(event)("EMPTY") - fallthrough - case ActionPass, ActionFail: - return fmt.Sprintf("%s %s\n", result, relativePackagePath(event.Package)), nil - } - - case event.Action == ActionFail: - return exec.Output(event.Package, event.Test) + formatTest(), nil - - case event.Action == ActionPass: - return formatTest(), nil - - } - return "", nil -} - -// isPkgFailureOutput returns true if the event is package output, and the output -// doesn't match any of the expected framing messages. Events which match this -// pattern should be package-level failures (ex: exit(1) or panic in an init() or -// TestMain). -func isPkgFailureOutput(event TestEvent) bool { - out := event.Output - return all( - event.PackageEvent(), - event.Action == ActionOutput, - out != "PASS\n", - out != "FAIL\n", - !strings.HasPrefix(out, "FAIL\t"+event.Package), - !strings.HasPrefix(out, "ok \t"+event.Package), - !strings.HasPrefix(out, "? \t"+event.Package), - ) -} - -func all(cond ...bool) bool { - for _, c := range cond { - if !c { - return false - } - } - return true -} - -func shortFormat(event TestEvent, exec *Execution) (string, error) { - if !event.PackageEvent() { - return "", nil - } - fmtElapsed := func() string { - d := elapsedDuration(event.Elapsed) - if d == 0 { - return "" - } - return fmt.Sprintf(" (%s)", d) - } - fmtCoverage := func() string { - pkg := exec.Package(event.Package) - if pkg.coverage == "" { - return "" - } - return " (" + pkg.coverage + ")" - } - fmtEvent := func(action string) (string, error) { - return fmt.Sprintf("%s %s%s%s\n", - action, - relativePackagePath(event.Package), - fmtElapsed(), - fmtCoverage(), - ), nil - } - withColor := colorEvent(event) - switch event.Action { - case ActionSkip: - return fmtEvent(withColor("∅")) - case ActionPass: - return fmtEvent(withColor("✓")) - case ActionFail: - return fmtEvent(withColor("✖")) - } - return "", nil -} - -func dotsFormat(event TestEvent, exec *Execution) (string, error) { - pkg := exec.Package(event.Package) - withColor := colorEvent(event) - - switch { - case event.PackageEvent(): - return "", nil - case event.Action == ActionRun && pkg.Total == 1: - return "[" + relativePackagePath(event.Package) + "]", nil - case event.Action == ActionPass: - return withColor("·"), nil - case event.Action == ActionFail: - return withColor("✖"), nil - case event.Action == ActionSkip: - return withColor("↷"), nil - } - return "", nil -} - -func colorEvent(event TestEvent) func(format string, a ...interface{}) string { - switch event.Action { - case ActionPass: - return color.GreenString - case ActionFail: - return color.RedString - case ActionSkip: - return color.YellowString - } - return color.WhiteString -} - -// NewEventFormatter returns a formatter for printing events. -func NewEventFormatter(format string) EventFormatter { - switch format { - case "debug": - return debugFormat - case "standard-verbose": - return standardVerboseFormat - case "standard-quiet": - return standardQuietFormat - case "dots": - return dotsFormat - case "short-verbose": - return shortVerboseFormat - case "short": - return shortFormat - default: - return nil - } -} diff --git a/vendor/gotest.tools/gotestsum/testjson/generate.sh b/vendor/gotest.tools/gotestsum/testjson/generate.sh deleted file mode 100644 index b85f4bded63..00000000000 --- a/vendor/gotest.tools/gotestsum/testjson/generate.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env bash -set -eu - -go test -p 1 -tags stubpkg ./internal/... \ - > testdata/go-test-quiet.out \ - 2> testdata/go-test-quiet.err \ - | true - - -go test -p 1 -v -tags stubpkg ./internal/... \ - > testdata/go-test-verbose.out \ - 2> testdata/go-test-verbose.err \ - | true - -go test -p 1 -json -tags stubpkg ./internal/... \ - > testdata/go-test-json.out \ - 2> testdata/go-test-json.err \ - | true - -go test -p 1 -json -timeout 10ms -tags 'stubpkg timeout' ./internal/... \ - > testdata/go-test-json-with-timeout.out \ - 2> testdata/go-test-json-with-timeout.err \ - | true - -go test -p 1 -json -tags 'stubpkg panic' ./internal/... \ - > testdata/go-test-json-with-panic.out \ - 2> testdata/go-test-json-with-panic.err \ - | true - - -go test -p 1 -json -tags stubpkg -cover ./internal/... \ - > testdata/go-test-json-with-cover.out \ - 2> testdata/go-test-json-with-cover.err \ - | true \ No newline at end of file diff --git a/vendor/gotest.tools/gotestsum/testjson/pkgpathprefix.go b/vendor/gotest.tools/gotestsum/testjson/pkgpathprefix.go deleted file mode 100644 index 8ee8dbba7b9..00000000000 --- a/vendor/gotest.tools/gotestsum/testjson/pkgpathprefix.go +++ /dev/null @@ -1,126 +0,0 @@ -package testjson - -import ( - "bytes" - "go/build" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "strconv" - "strings" -) - -func relativePackagePath(pkgpath string) string { - if pkgpath == pkgPathPrefix { - return "." - } - return strings.TrimPrefix(pkgpath, pkgPathPrefix+"/") -} - -func getPkgPathPrefix() string { - cwd, _ := os.Getwd() - if isGoModuleEnabled() { - prefix := getPkgPathPrefixFromGoModule(cwd) - if prefix != "" { - return prefix - } - } - return getPkgPathPrefixGoPath(cwd) -} - -func isGoModuleEnabled() bool { - version := runtime.Version() - if strings.HasPrefix(version, "go1.10") { - return false - } - // Go modules may not be enabled if env var is unset, or set to auto, however - // we can always fall back to using GOPATH as the prefix if a go.mod is not - // found. - return os.Getenv("GO111MODULE") != "off" -} - -// TODO: might not work on windows -func getPkgPathPrefixGoPath(cwd string) string { - gopaths := strings.Split(build.Default.GOPATH, string(filepath.ListSeparator)) - for _, gopath := range gopaths { - gosrcpath := gopath + "/src/" - if strings.HasPrefix(cwd, gosrcpath) { - return strings.TrimPrefix(cwd, gosrcpath) - } - } - return "" -} - -func getPkgPathPrefixFromGoModule(cwd string) string { - filename := goModuleFilePath(cwd) - if filename == "" { - return "" - } - raw, err := ioutil.ReadFile(filename) - if err != nil { - // TODO: log.Warn - return "" - } - return pkgPathFromGoModuleFile(raw) -} - -var ( - slashSlash = []byte("//") - moduleStr = []byte("module") -) - -// Copy of ModulePath from golang.org/src/cmd/go/internal/modfile/read.go -func pkgPathFromGoModuleFile(mod []byte) string { - for len(mod) > 0 { - line := mod - mod = nil - if i := bytes.IndexByte(line, '\n'); i >= 0 { - line, mod = line[:i], line[i+1:] - } - if i := bytes.Index(line, slashSlash); i >= 0 { - line = line[:i] - } - line = bytes.TrimSpace(line) - if !bytes.HasPrefix(line, moduleStr) { - continue - } - line = line[len(moduleStr):] - n := len(line) - line = bytes.TrimSpace(line) - if len(line) == n || len(line) == 0 { - continue - } - - if line[0] == '"' || line[0] == '`' { - p, err := strconv.Unquote(string(line)) - if err != nil { - return "" // malformed quoted string or multi-line module path - } - return p - } - - return string(line) - } - return "" // missing module path -} - -// A rough re-implementation of FindModuleRoot from -// golang.org/src/cmd/go/internal/modload/init.go -func goModuleFilePath(cwd string) string { - dir := filepath.Clean(cwd) - - for { - path := filepath.Join(dir, "go.mod") - if _, err := os.Stat(path); err == nil { - return path - } - parent := filepath.Dir(dir) - if parent == dir { - return "" - } - dir = parent - } -} - -var pkgPathPrefix = getPkgPathPrefix() diff --git a/vendor/gotest.tools/gotestsum/testjson/summary.go b/vendor/gotest.tools/gotestsum/testjson/summary.go deleted file mode 100644 index 45a410d1856..00000000000 --- a/vendor/gotest.tools/gotestsum/testjson/summary.go +++ /dev/null @@ -1,214 +0,0 @@ -package testjson - -import ( - "fmt" - "io" - "strings" - "time" - "unicode" - "unicode/utf8" - - "github.com/fatih/color" -) - -// Summary enumerates the sections which can be printed by PrintSummary -type Summary int - -// nolint: golint -const ( - SummarizeNone Summary = 0 - SummarizeSkipped Summary = (1 << iota) / 2 - SummarizeFailed - SummarizeErrors - SummarizeOutput - SummarizeAll = SummarizeSkipped | SummarizeFailed | SummarizeErrors | SummarizeOutput -) - -var summaryValues = map[Summary]string{ - SummarizeSkipped: "skipped", - SummarizeFailed: "failed", - SummarizeErrors: "errors", - SummarizeOutput: "output", -} - -var summaryFromValue = map[string]Summary{ - "none": SummarizeNone, - "skipped": SummarizeSkipped, - "failed": SummarizeFailed, - "errors": SummarizeErrors, - "output": SummarizeOutput, - "all": SummarizeAll, -} - -func (s Summary) String() string { - if s == SummarizeNone { - return "none" - } - var result []string - for v := Summary(1); v <= s; v <<= 1 { - if s.Includes(v) { - result = append(result, summaryValues[v]) - } - } - return strings.Join(result, ",") -} - -// Includes returns true if Summary includes all the values set by other. -func (s Summary) Includes(other Summary) bool { - return s&other == other -} - -// NewSummary returns a new Summary from a string value. If the string does not -// match any known values returns false for the second value. -func NewSummary(value string) (Summary, bool) { - s, ok := summaryFromValue[value] - return s, ok -} - -// PrintSummary of a test Execution. Prints a section for each summary type -// followed by a DONE line. -func PrintSummary(out io.Writer, execution *Execution, opts Summary) error { - execSummary := newExecSummary(execution, opts) - if opts.Includes(SummarizeSkipped) { - writeTestCaseSummary(out, execSummary, formatSkipped()) - } - if opts.Includes(SummarizeFailed) { - writeTestCaseSummary(out, execSummary, formatFailed()) - } - - errors := execution.Errors() - if opts.Includes(SummarizeErrors) { - writeErrorSummary(out, errors) - } - - fmt.Fprintf(out, "\n%s %d tests%s%s%s in %s\n", - "DONE", // TODO: maybe color this? - execution.Total(), - formatTestCount(len(execution.Skipped()), "skipped", ""), - formatTestCount(len(execution.Failed()), "failure", "s"), - formatTestCount(countErrors(errors), "error", "s"), - FormatDurationAsSeconds(execution.Elapsed(), 3)) - - return nil -} - -func formatTestCount(count int, category string, pluralize string) string { - switch count { - case 0: - return "" - case 1: - default: - category += pluralize - } - return fmt.Sprintf(", %d %s", count, category) -} - -// FormatDurationAsSeconds formats a time.Duration as a float with an s suffix. -func FormatDurationAsSeconds(d time.Duration, precision int) string { - return fmt.Sprintf("%.[2]*[1]fs", d.Seconds(), precision) -} - -func writeErrorSummary(out io.Writer, errors []string) { - if len(errors) > 0 { - fmt.Fprintln(out, color.MagentaString("\n=== Errors")) - } - for _, err := range errors { - fmt.Fprintln(out, err) - } -} - -// countErrors in stderr lines. Build errors may include multiple lines where -// subsequent lines are indented. -// FIXME: Panics will include multiple lines, and are still overcounted. -func countErrors(errors []string) int { - var count int - for _, line := range errors { - r, _ := utf8.DecodeRuneInString(line) - if !unicode.IsSpace(r) { - count++ - } - } - return count -} - -type executionSummary interface { - Failed() []TestCase - Skipped() []TestCase - OutputLines(pkg, test string) []string -} - -type noOutputSummary struct { - Execution -} - -func (s *noOutputSummary) OutputLines(_, _ string) []string { - return nil -} - -func newExecSummary(execution *Execution, opts Summary) executionSummary { - if opts.Includes(SummarizeOutput) { - return execution - } - return &noOutputSummary{Execution: *execution} -} - -func writeTestCaseSummary(out io.Writer, execution executionSummary, conf testCaseFormatConfig) { - testCases := conf.getter(execution) - if len(testCases) == 0 { - return - } - fmt.Fprintln(out, "\n=== "+conf.header) - for _, tc := range testCases { - fmt.Fprintf(out, "=== %s: %s %s (%s)\n", - conf.prefix, - relativePackagePath(tc.Package), - tc.Test, - FormatDurationAsSeconds(tc.Elapsed, 2)) - for _, line := range execution.OutputLines(tc.Package, tc.Test) { - if isRunLine(line) || conf.filter(line) { - continue - } - fmt.Fprint(out, line) - } - fmt.Fprintln(out) - } -} - -type testCaseFormatConfig struct { - header string - prefix string - filter func(string) bool - getter func(executionSummary) []TestCase -} - -func formatFailed() testCaseFormatConfig { - withColor := color.RedString - return testCaseFormatConfig{ - header: withColor("Failed"), - prefix: withColor("FAIL"), - filter: func(line string) bool { - return strings.HasPrefix(line, "--- FAIL: Test") - }, - getter: func(execution executionSummary) []TestCase { - return execution.Failed() - }, - } -} - -func formatSkipped() testCaseFormatConfig { - withColor := color.YellowString - return testCaseFormatConfig{ - header: withColor("Skipped"), - prefix: withColor("SKIP"), - filter: func(line string) bool { - return strings.HasPrefix(line, "--- SKIP: Test") - }, - getter: func(execution executionSummary) []TestCase { - return execution.Skipped() - }, - } -} - -func isRunLine(line string) bool { - return strings.HasPrefix(line, "=== RUN Test") -} diff --git a/vendor/gotest.tools/pkg.go b/vendor/gotest.tools/pkg.go deleted file mode 100644 index c7204103d11..00000000000 --- a/vendor/gotest.tools/pkg.go +++ /dev/null @@ -1,4 +0,0 @@ -/*Package gotesttools is a collection of packages to augment `testing` and -support common patterns. -*/ -package gotesttools // import "gotest.tools" diff --git a/vendor/honnef.co/go/tools/LICENSE b/vendor/honnef.co/go/tools/LICENSE deleted file mode 100644 index dfd03145460..00000000000 --- a/vendor/honnef.co/go/tools/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2016 Dominik Honnef - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/honnef.co/go/tools/LICENSE-THIRD-PARTY b/vendor/honnef.co/go/tools/LICENSE-THIRD-PARTY deleted file mode 100644 index 7c241b71aef..00000000000 --- a/vendor/honnef.co/go/tools/LICENSE-THIRD-PARTY +++ /dev/null @@ -1,226 +0,0 @@ -Staticcheck and its related tools make use of third party projects, -either by reusing their code, or by statically linking them into -resulting binaries. These projects are: - -* The Go Programming Language - https://golang.org/ - - Copyright (c) 2009 The Go Authors. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - * Neither the name of Google Inc. nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -* github.com/BurntSushi/toml - https://github.com/BurntSushi/toml - - The MIT License (MIT) - - Copyright (c) 2013 TOML authors - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - - -* github.com/google/renameio - https://github.com/google/renameio - - Copyright 2018 Google Inc. - - 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. - - -* github.com/kisielk/gotool – https://github.com/kisielk/gotool - - Copyright (c) 2013 Kamil Kisiel - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - All the files in this distribution are covered under either the MIT - license (see the file LICENSE) except some files mentioned below. - - match.go, match_test.go: - - Copyright (c) 2009 The Go Authors. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - * Neither the name of Google Inc. nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -* github.com/rogpeppe/go-internal - https://github.com/rogpeppe/go-internal - - Copyright (c) 2018 The Go Authors. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - * Neither the name of Google Inc. nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -* golang.org/x/mod/module - https://github.com/golang/mod - - Copyright (c) 2009 The Go Authors. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - * Neither the name of Google Inc. nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -* golang.org/x/tools/go/analysis - https://github.com/golang/tools - - Copyright (c) 2009 The Go Authors. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - * Neither the name of Google Inc. nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/honnef.co/go/tools/arg/BUILD b/vendor/honnef.co/go/tools/arg/BUILD deleted file mode 100644 index 9920653fa51..00000000000 --- a/vendor/honnef.co/go/tools/arg/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["arg.go"], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/arg", - importpath = "honnef.co/go/tools/arg", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/arg/arg.go b/vendor/honnef.co/go/tools/arg/arg.go deleted file mode 100644 index 1e7f30db42d..00000000000 --- a/vendor/honnef.co/go/tools/arg/arg.go +++ /dev/null @@ -1,48 +0,0 @@ -package arg - -var args = map[string]int{ - "(*encoding/json.Decoder).Decode.v": 0, - "(*encoding/json.Encoder).Encode.v": 0, - "(*encoding/xml.Decoder).Decode.v": 0, - "(*encoding/xml.Encoder).Encode.v": 0, - "(*sync.Pool).Put.x": 0, - "(*text/template.Template).Parse.text": 0, - "(io.Seeker).Seek.offset": 0, - "(time.Time).Sub.u": 0, - "append.elems": 1, - "append.slice": 0, - "bytes.Equal.a": 0, - "bytes.Equal.b": 1, - "encoding/binary.Write.data": 2, - "errors.New.text": 0, - "fmt.Fprintf.format": 1, - "fmt.Printf.format": 0, - "fmt.Sprintf.a[0]": 1, - "fmt.Sprintf.format": 0, - "json.Marshal.v": 0, - "json.Unmarshal.v": 1, - "len.v": 0, - "make.size[0]": 1, - "make.size[1]": 2, - "make.t": 0, - "net/url.Parse.rawurl": 0, - "os.OpenFile.flag": 1, - "os/exec.Command.name": 0, - "os/signal.Notify.c": 0, - "regexp.Compile.expr": 0, - "runtime.SetFinalizer.finalizer": 1, - "runtime.SetFinalizer.obj": 0, - "sort.Sort.data": 0, - "time.Parse.layout": 0, - "time.Sleep.d": 0, - "xml.Marshal.v": 0, - "xml.Unmarshal.v": 1, -} - -func Arg(name string) int { - n, ok := args[name] - if !ok { - panic("unknown argument " + name) - } - return n -} diff --git a/vendor/honnef.co/go/tools/cmd/staticcheck/BUILD b/vendor/honnef.co/go/tools/cmd/staticcheck/BUILD deleted file mode 100644 index cbd37ec3ff2..00000000000 --- a/vendor/honnef.co/go/tools/cmd/staticcheck/BUILD +++ /dev/null @@ -1,39 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") - -go_library( - name = "go_default_library", - srcs = ["staticcheck.go"], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/cmd/staticcheck", - importpath = "honnef.co/go/tools/cmd/staticcheck", - visibility = ["//visibility:private"], - deps = [ - "//vendor/golang.org/x/tools/go/analysis:go_default_library", - "//vendor/honnef.co/go/tools/lint:go_default_library", - "//vendor/honnef.co/go/tools/lint/lintutil:go_default_library", - "//vendor/honnef.co/go/tools/simple:go_default_library", - "//vendor/honnef.co/go/tools/staticcheck:go_default_library", - "//vendor/honnef.co/go/tools/stylecheck:go_default_library", - "//vendor/honnef.co/go/tools/unused:go_default_library", - ], -) - -go_binary( - name = "staticcheck", - embed = [":go_default_library"], - tags = ["manual"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/cmd/staticcheck/README.md b/vendor/honnef.co/go/tools/cmd/staticcheck/README.md deleted file mode 100644 index 4d14577fdf7..00000000000 --- a/vendor/honnef.co/go/tools/cmd/staticcheck/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# staticcheck - -_staticcheck_ offers extensive analysis of Go code, covering a myriad -of categories. It will detect bugs, suggest code simplifications, -point out dead code, and more. - -## Installation - -See [the main README](https://github.com/dominikh/go-tools#installation) for installation instructions. - -## Documentation - -Detailed documentation can be found on -[staticcheck.io](https://staticcheck.io/docs/). - diff --git a/vendor/honnef.co/go/tools/cmd/staticcheck/staticcheck.go b/vendor/honnef.co/go/tools/cmd/staticcheck/staticcheck.go deleted file mode 100644 index 4f504dc39db..00000000000 --- a/vendor/honnef.co/go/tools/cmd/staticcheck/staticcheck.go +++ /dev/null @@ -1,44 +0,0 @@ -// staticcheck analyses Go code and makes it better. -package main // import "honnef.co/go/tools/cmd/staticcheck" - -import ( - "log" - "os" - - "golang.org/x/tools/go/analysis" - "honnef.co/go/tools/lint" - "honnef.co/go/tools/lint/lintutil" - "honnef.co/go/tools/simple" - "honnef.co/go/tools/staticcheck" - "honnef.co/go/tools/stylecheck" - "honnef.co/go/tools/unused" -) - -func main() { - fs := lintutil.FlagSet("staticcheck") - wholeProgram := fs.Bool("unused.whole-program", false, "Run unused in whole program mode") - debug := fs.String("debug.unused-graph", "", "Write unused's object graph to `file`") - fs.Parse(os.Args[1:]) - - var cs []*analysis.Analyzer - for _, v := range simple.Analyzers { - cs = append(cs, v) - } - for _, v := range staticcheck.Analyzers { - cs = append(cs, v) - } - for _, v := range stylecheck.Analyzers { - cs = append(cs, v) - } - - u := unused.NewChecker(*wholeProgram) - if *debug != "" { - f, err := os.OpenFile(*debug, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - log.Fatal(err) - } - u.Debug = f - } - cums := []lint.CumulativeChecker{u} - lintutil.ProcessFlagSet(cs, cums, fs) -} diff --git a/vendor/honnef.co/go/tools/config/BUILD b/vendor/honnef.co/go/tools/config/BUILD deleted file mode 100644 index 83ef2307e62..00000000000 --- a/vendor/honnef.co/go/tools/config/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["config.go"], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/config", - importpath = "honnef.co/go/tools/config", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/BurntSushi/toml:go_default_library", - "//vendor/golang.org/x/tools/go/analysis:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/config/config.go b/vendor/honnef.co/go/tools/config/config.go deleted file mode 100644 index c22093a6d98..00000000000 --- a/vendor/honnef.co/go/tools/config/config.go +++ /dev/null @@ -1,224 +0,0 @@ -package config - -import ( - "bytes" - "fmt" - "os" - "path/filepath" - "reflect" - "strings" - - "github.com/BurntSushi/toml" - "golang.org/x/tools/go/analysis" -) - -var Analyzer = &analysis.Analyzer{ - Name: "config", - Doc: "loads configuration for the current package tree", - Run: func(pass *analysis.Pass) (interface{}, error) { - if len(pass.Files) == 0 { - cfg := DefaultConfig - return &cfg, nil - } - cache, err := os.UserCacheDir() - if err != nil { - cache = "" - } - var path string - for _, f := range pass.Files { - p := pass.Fset.PositionFor(f.Pos(), true).Filename - // FIXME(dh): using strings.HasPrefix isn't technically - // correct, but it should be good enough for now. - if cache != "" && strings.HasPrefix(p, cache) { - // File in the build cache of the standard Go build system - continue - } - path = p - break - } - - if path == "" { - // The package only consists of generated files. - cfg := DefaultConfig - return &cfg, nil - } - - dir := filepath.Dir(path) - cfg, err := Load(dir) - if err != nil { - return nil, fmt.Errorf("error loading staticcheck.conf: %s", err) - } - return &cfg, nil - }, - RunDespiteErrors: true, - ResultType: reflect.TypeOf((*Config)(nil)), -} - -func For(pass *analysis.Pass) *Config { - return pass.ResultOf[Analyzer].(*Config) -} - -func mergeLists(a, b []string) []string { - out := make([]string, 0, len(a)+len(b)) - for _, el := range b { - if el == "inherit" { - out = append(out, a...) - } else { - out = append(out, el) - } - } - - return out -} - -func normalizeList(list []string) []string { - if len(list) > 1 { - nlist := make([]string, 0, len(list)) - nlist = append(nlist, list[0]) - for i, el := range list[1:] { - if el != list[i] { - nlist = append(nlist, el) - } - } - list = nlist - } - - for _, el := range list { - if el == "inherit" { - // This should never happen, because the default config - // should not use "inherit" - panic(`unresolved "inherit"`) - } - } - - return list -} - -func (cfg Config) Merge(ocfg Config) Config { - if ocfg.Checks != nil { - cfg.Checks = mergeLists(cfg.Checks, ocfg.Checks) - } - if ocfg.Initialisms != nil { - cfg.Initialisms = mergeLists(cfg.Initialisms, ocfg.Initialisms) - } - if ocfg.DotImportWhitelist != nil { - cfg.DotImportWhitelist = mergeLists(cfg.DotImportWhitelist, ocfg.DotImportWhitelist) - } - if ocfg.HTTPStatusCodeWhitelist != nil { - cfg.HTTPStatusCodeWhitelist = mergeLists(cfg.HTTPStatusCodeWhitelist, ocfg.HTTPStatusCodeWhitelist) - } - return cfg -} - -type Config struct { - // TODO(dh): this implementation makes it impossible for external - // clients to add their own checkers with configuration. At the - // moment, we don't really care about that; we don't encourage - // that people use this package. In the future, we may. The - // obvious solution would be using map[string]interface{}, but - // that's obviously subpar. - - Checks []string `toml:"checks"` - Initialisms []string `toml:"initialisms"` - DotImportWhitelist []string `toml:"dot_import_whitelist"` - HTTPStatusCodeWhitelist []string `toml:"http_status_code_whitelist"` -} - -func (c Config) String() string { - buf := &bytes.Buffer{} - - fmt.Fprintf(buf, "Checks: %#v\n", c.Checks) - fmt.Fprintf(buf, "Initialisms: %#v\n", c.Initialisms) - fmt.Fprintf(buf, "DotImportWhitelist: %#v\n", c.DotImportWhitelist) - fmt.Fprintf(buf, "HTTPStatusCodeWhitelist: %#v", c.HTTPStatusCodeWhitelist) - - return buf.String() -} - -var DefaultConfig = Config{ - Checks: []string{"all", "-ST1000", "-ST1003", "-ST1016"}, - Initialisms: []string{ - "ACL", "API", "ASCII", "CPU", "CSS", "DNS", - "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID", - "IP", "JSON", "QPS", "RAM", "RPC", "SLA", - "SMTP", "SQL", "SSH", "TCP", "TLS", "TTL", - "UDP", "UI", "GID", "UID", "UUID", "URI", - "URL", "UTF8", "VM", "XML", "XMPP", "XSRF", - "XSS", "SIP", "RTP", - }, - DotImportWhitelist: []string{}, - HTTPStatusCodeWhitelist: []string{"200", "400", "404", "500"}, -} - -const configName = "staticcheck.conf" - -func parseConfigs(dir string) ([]Config, error) { - var out []Config - - // TODO(dh): consider stopping at the GOPATH/module boundary - for dir != "" { - f, err := os.Open(filepath.Join(dir, configName)) - if os.IsNotExist(err) { - ndir := filepath.Dir(dir) - if ndir == dir { - break - } - dir = ndir - continue - } - if err != nil { - return nil, err - } - var cfg Config - _, err = toml.DecodeReader(f, &cfg) - f.Close() - if err != nil { - return nil, err - } - out = append(out, cfg) - ndir := filepath.Dir(dir) - if ndir == dir { - break - } - dir = ndir - } - out = append(out, DefaultConfig) - if len(out) < 2 { - return out, nil - } - for i := 0; i < len(out)/2; i++ { - out[i], out[len(out)-1-i] = out[len(out)-1-i], out[i] - } - return out, nil -} - -func mergeConfigs(confs []Config) Config { - if len(confs) == 0 { - // This shouldn't happen because we always have at least a - // default config. - panic("trying to merge zero configs") - } - if len(confs) == 1 { - return confs[0] - } - conf := confs[0] - for _, oconf := range confs[1:] { - conf = conf.Merge(oconf) - } - return conf -} - -func Load(dir string) (Config, error) { - confs, err := parseConfigs(dir) - if err != nil { - return Config{}, err - } - conf := mergeConfigs(confs) - - conf.Checks = normalizeList(conf.Checks) - conf.Initialisms = normalizeList(conf.Initialisms) - conf.DotImportWhitelist = normalizeList(conf.DotImportWhitelist) - conf.HTTPStatusCodeWhitelist = normalizeList(conf.HTTPStatusCodeWhitelist) - - return conf, nil -} diff --git a/vendor/honnef.co/go/tools/config/example.conf b/vendor/honnef.co/go/tools/config/example.conf deleted file mode 100644 index a715a24d4fc..00000000000 --- a/vendor/honnef.co/go/tools/config/example.conf +++ /dev/null @@ -1,10 +0,0 @@ -checks = ["all", "-ST1003", "-ST1014"] -initialisms = ["ACL", "API", "ASCII", "CPU", "CSS", "DNS", - "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID", - "IP", "JSON", "QPS", "RAM", "RPC", "SLA", - "SMTP", "SQL", "SSH", "TCP", "TLS", "TTL", - "UDP", "UI", "GID", "UID", "UUID", "URI", - "URL", "UTF8", "VM", "XML", "XMPP", "XSRF", - "XSS", "SIP", "RTP"] -dot_import_whitelist = [] -http_status_code_whitelist = ["200", "400", "404", "500"] diff --git a/vendor/honnef.co/go/tools/deprecated/BUILD b/vendor/honnef.co/go/tools/deprecated/BUILD deleted file mode 100644 index 1b50deae44d..00000000000 --- a/vendor/honnef.co/go/tools/deprecated/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["stdlib.go"], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/deprecated", - importpath = "honnef.co/go/tools/deprecated", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/deprecated/stdlib.go b/vendor/honnef.co/go/tools/deprecated/stdlib.go deleted file mode 100644 index 5d8ce186b16..00000000000 --- a/vendor/honnef.co/go/tools/deprecated/stdlib.go +++ /dev/null @@ -1,112 +0,0 @@ -package deprecated - -type Deprecation struct { - DeprecatedSince int - AlternativeAvailableSince int -} - -var Stdlib = map[string]Deprecation{ - "image/jpeg.Reader": {4, 0}, - // FIXME(dh): AllowBinary isn't being detected as deprecated - // because the comment has a newline right after "Deprecated:" - "go/build.AllowBinary": {7, 7}, - "(archive/zip.FileHeader).CompressedSize": {1, 1}, - "(archive/zip.FileHeader).UncompressedSize": {1, 1}, - "(archive/zip.FileHeader).ModifiedTime": {10, 10}, - "(archive/zip.FileHeader).ModifiedDate": {10, 10}, - "(*archive/zip.FileHeader).ModTime": {10, 10}, - "(*archive/zip.FileHeader).SetModTime": {10, 10}, - "(go/doc.Package).Bugs": {1, 1}, - "os.SEEK_SET": {7, 7}, - "os.SEEK_CUR": {7, 7}, - "os.SEEK_END": {7, 7}, - "(net.Dialer).Cancel": {7, 7}, - "runtime.CPUProfile": {9, 0}, - "compress/flate.ReadError": {6, 6}, - "compress/flate.WriteError": {6, 6}, - "path/filepath.HasPrefix": {0, 0}, - "(net/http.Transport).Dial": {7, 7}, - "(*net/http.Transport).CancelRequest": {6, 5}, - "net/http.ErrWriteAfterFlush": {7, 0}, - "net/http.ErrHeaderTooLong": {8, 0}, - "net/http.ErrShortBody": {8, 0}, - "net/http.ErrMissingContentLength": {8, 0}, - "net/http/httputil.ErrPersistEOF": {0, 0}, - "net/http/httputil.ErrClosed": {0, 0}, - "net/http/httputil.ErrPipeline": {0, 0}, - "net/http/httputil.ServerConn": {0, 0}, - "net/http/httputil.NewServerConn": {0, 0}, - "net/http/httputil.ClientConn": {0, 0}, - "net/http/httputil.NewClientConn": {0, 0}, - "net/http/httputil.NewProxyClientConn": {0, 0}, - "(net/http.Request).Cancel": {7, 7}, - "(text/template/parse.PipeNode).Line": {1, 1}, - "(text/template/parse.ActionNode).Line": {1, 1}, - "(text/template/parse.BranchNode).Line": {1, 1}, - "(text/template/parse.TemplateNode).Line": {1, 1}, - "database/sql/driver.ColumnConverter": {9, 9}, - "database/sql/driver.Execer": {8, 8}, - "database/sql/driver.Queryer": {8, 8}, - "(database/sql/driver.Conn).Begin": {8, 8}, - "(database/sql/driver.Stmt).Exec": {8, 8}, - "(database/sql/driver.Stmt).Query": {8, 8}, - "syscall.StringByteSlice": {1, 1}, - "syscall.StringBytePtr": {1, 1}, - "syscall.StringSlicePtr": {1, 1}, - "syscall.StringToUTF16": {1, 1}, - "syscall.StringToUTF16Ptr": {1, 1}, - "(*regexp.Regexp).Copy": {12, 12}, - "(archive/tar.Header).Xattrs": {10, 10}, - "archive/tar.TypeRegA": {11, 1}, - "go/types.NewInterface": {11, 11}, - "(*go/types.Interface).Embedded": {11, 11}, - "go/importer.For": {12, 12}, - "encoding/json.InvalidUTF8Error": {2, 2}, - "encoding/json.UnmarshalFieldError": {2, 2}, - "encoding/csv.ErrTrailingComma": {2, 2}, - "(encoding/csv.Reader).TrailingComma": {2, 2}, - "(net.Dialer).DualStack": {12, 12}, - "net/http.ErrUnexpectedTrailer": {12, 12}, - "net/http.CloseNotifier": {11, 7}, - "net/http.ProtocolError": {8, 8}, - "(crypto/x509.CertificateRequest).Attributes": {5, 3}, - // This function has no alternative, but also no purpose. - "(*crypto/rc4.Cipher).Reset": {12, 0}, - "(net/http/httptest.ResponseRecorder).HeaderMap": {11, 7}, - - // All of these have been deprecated in favour of external libraries - "syscall.AttachLsf": {7, 0}, - "syscall.DetachLsf": {7, 0}, - "syscall.LsfSocket": {7, 0}, - "syscall.SetLsfPromisc": {7, 0}, - "syscall.LsfJump": {7, 0}, - "syscall.LsfStmt": {7, 0}, - "syscall.BpfStmt": {7, 0}, - "syscall.BpfJump": {7, 0}, - "syscall.BpfBuflen": {7, 0}, - "syscall.SetBpfBuflen": {7, 0}, - "syscall.BpfDatalink": {7, 0}, - "syscall.SetBpfDatalink": {7, 0}, - "syscall.SetBpfPromisc": {7, 0}, - "syscall.FlushBpf": {7, 0}, - "syscall.BpfInterface": {7, 0}, - "syscall.SetBpfInterface": {7, 0}, - "syscall.BpfTimeout": {7, 0}, - "syscall.SetBpfTimeout": {7, 0}, - "syscall.BpfStats": {7, 0}, - "syscall.SetBpfImmediate": {7, 0}, - "syscall.SetBpf": {7, 0}, - "syscall.CheckBpfVersion": {7, 0}, - "syscall.BpfHeadercmpl": {7, 0}, - "syscall.SetBpfHeadercmpl": {7, 0}, - "syscall.RouteRIB": {8, 0}, - "syscall.RoutingMessage": {8, 0}, - "syscall.RouteMessage": {8, 0}, - "syscall.InterfaceMessage": {8, 0}, - "syscall.InterfaceAddrMessage": {8, 0}, - "syscall.ParseRoutingMessage": {8, 0}, - "syscall.ParseRoutingSockaddr": {8, 0}, - "InterfaceAnnounceMessage": {7, 0}, - "InterfaceMulticastAddrMessage": {7, 0}, - "syscall.FormatMessage": {5, 0}, -} diff --git a/vendor/honnef.co/go/tools/facts/BUILD b/vendor/honnef.co/go/tools/facts/BUILD deleted file mode 100644 index 901abc0ddaf..00000000000 --- a/vendor/honnef.co/go/tools/facts/BUILD +++ /dev/null @@ -1,34 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "deprecated.go", - "generated.go", - "purity.go", - "token.go", - ], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/facts", - importpath = "honnef.co/go/tools/facts", - visibility = ["//visibility:public"], - deps = [ - "//vendor/golang.org/x/tools/go/analysis:go_default_library", - "//vendor/honnef.co/go/tools/functions:go_default_library", - "//vendor/honnef.co/go/tools/internal/passes/buildssa:go_default_library", - "//vendor/honnef.co/go/tools/ssa:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/facts/deprecated.go b/vendor/honnef.co/go/tools/facts/deprecated.go deleted file mode 100644 index 8587b0e0eae..00000000000 --- a/vendor/honnef.co/go/tools/facts/deprecated.go +++ /dev/null @@ -1,144 +0,0 @@ -package facts - -import ( - "go/ast" - "go/token" - "go/types" - "reflect" - "strings" - - "golang.org/x/tools/go/analysis" -) - -type IsDeprecated struct{ Msg string } - -func (*IsDeprecated) AFact() {} -func (d *IsDeprecated) String() string { return "Deprecated: " + d.Msg } - -type DeprecatedResult struct { - Objects map[types.Object]*IsDeprecated - Packages map[*types.Package]*IsDeprecated -} - -var Deprecated = &analysis.Analyzer{ - Name: "fact_deprecated", - Doc: "Mark deprecated objects", - Run: deprecated, - FactTypes: []analysis.Fact{(*IsDeprecated)(nil)}, - ResultType: reflect.TypeOf(DeprecatedResult{}), -} - -func deprecated(pass *analysis.Pass) (interface{}, error) { - var names []*ast.Ident - - extractDeprecatedMessage := func(docs []*ast.CommentGroup) string { - for _, doc := range docs { - if doc == nil { - continue - } - parts := strings.Split(doc.Text(), "\n\n") - last := parts[len(parts)-1] - if !strings.HasPrefix(last, "Deprecated: ") { - continue - } - alt := last[len("Deprecated: "):] - alt = strings.Replace(alt, "\n", " ", -1) - return alt - } - return "" - } - doDocs := func(names []*ast.Ident, docs []*ast.CommentGroup) { - alt := extractDeprecatedMessage(docs) - if alt == "" { - return - } - - for _, name := range names { - obj := pass.TypesInfo.ObjectOf(name) - pass.ExportObjectFact(obj, &IsDeprecated{alt}) - } - } - - var docs []*ast.CommentGroup - for _, f := range pass.Files { - docs = append(docs, f.Doc) - } - if alt := extractDeprecatedMessage(docs); alt != "" { - // Don't mark package syscall as deprecated, even though - // it is. A lot of people still use it for simple - // constants like SIGKILL, and I am not comfortable - // telling them to use x/sys for that. - if pass.Pkg.Path() != "syscall" { - pass.ExportPackageFact(&IsDeprecated{alt}) - } - } - - docs = docs[:0] - for _, f := range pass.Files { - fn := func(node ast.Node) bool { - if node == nil { - return true - } - var ret bool - switch node := node.(type) { - case *ast.GenDecl: - switch node.Tok { - case token.TYPE, token.CONST, token.VAR: - docs = append(docs, node.Doc) - return true - default: - return false - } - case *ast.FuncDecl: - docs = append(docs, node.Doc) - names = []*ast.Ident{node.Name} - ret = false - case *ast.TypeSpec: - docs = append(docs, node.Doc) - names = []*ast.Ident{node.Name} - ret = true - case *ast.ValueSpec: - docs = append(docs, node.Doc) - names = node.Names - ret = false - case *ast.File: - return true - case *ast.StructType: - for _, field := range node.Fields.List { - doDocs(field.Names, []*ast.CommentGroup{field.Doc}) - } - return false - case *ast.InterfaceType: - for _, field := range node.Methods.List { - doDocs(field.Names, []*ast.CommentGroup{field.Doc}) - } - return false - default: - return false - } - if len(names) == 0 || len(docs) == 0 { - return ret - } - doDocs(names, docs) - - docs = docs[:0] - names = nil - return ret - } - ast.Inspect(f, fn) - } - - out := DeprecatedResult{ - Objects: map[types.Object]*IsDeprecated{}, - Packages: map[*types.Package]*IsDeprecated{}, - } - - for _, fact := range pass.AllObjectFacts() { - out.Objects[fact.Object] = fact.Fact.(*IsDeprecated) - } - for _, fact := range pass.AllPackageFacts() { - out.Packages[fact.Package] = fact.Fact.(*IsDeprecated) - } - - return out, nil -} diff --git a/vendor/honnef.co/go/tools/facts/generated.go b/vendor/honnef.co/go/tools/facts/generated.go deleted file mode 100644 index 1ed9563a30b..00000000000 --- a/vendor/honnef.co/go/tools/facts/generated.go +++ /dev/null @@ -1,86 +0,0 @@ -package facts - -import ( - "bufio" - "bytes" - "io" - "os" - "reflect" - "strings" - - "golang.org/x/tools/go/analysis" -) - -type Generator int - -// A list of known generators we can detect -const ( - Unknown Generator = iota - Goyacc - Cgo - Stringer -) - -var ( - // used by cgo before Go 1.11 - oldCgo = []byte("// Created by cgo - DO NOT EDIT") - prefix = []byte("// Code generated ") - suffix = []byte(" DO NOT EDIT.") - nl = []byte("\n") - crnl = []byte("\r\n") -) - -func isGenerated(path string) (Generator, bool) { - f, err := os.Open(path) - if err != nil { - return 0, false - } - defer f.Close() - br := bufio.NewReader(f) - for { - s, err := br.ReadBytes('\n') - if err != nil && err != io.EOF { - return 0, false - } - s = bytes.TrimSuffix(s, crnl) - s = bytes.TrimSuffix(s, nl) - if bytes.HasPrefix(s, prefix) && bytes.HasSuffix(s, suffix) { - text := string(s[len(prefix) : len(s)-len(suffix)]) - switch text { - case "by goyacc.": - return Goyacc, true - case "by cmd/cgo;": - return Cgo, true - } - if strings.HasPrefix(text, `by "stringer `) { - return Stringer, true - } - return Unknown, true - } - if bytes.Equal(s, oldCgo) { - return Cgo, true - } - if err == io.EOF { - break - } - } - return 0, false -} - -var Generated = &analysis.Analyzer{ - Name: "isgenerated", - Doc: "annotate file names that have been code generated", - Run: func(pass *analysis.Pass) (interface{}, error) { - m := map[string]Generator{} - for _, f := range pass.Files { - path := pass.Fset.PositionFor(f.Pos(), false).Filename - g, ok := isGenerated(path) - if ok { - m[path] = g - } - } - return m, nil - }, - RunDespiteErrors: true, - ResultType: reflect.TypeOf(map[string]Generator{}), -} diff --git a/vendor/honnef.co/go/tools/facts/purity.go b/vendor/honnef.co/go/tools/facts/purity.go deleted file mode 100644 index 861ca41104a..00000000000 --- a/vendor/honnef.co/go/tools/facts/purity.go +++ /dev/null @@ -1,175 +0,0 @@ -package facts - -import ( - "go/token" - "go/types" - "reflect" - - "golang.org/x/tools/go/analysis" - "honnef.co/go/tools/functions" - "honnef.co/go/tools/internal/passes/buildssa" - "honnef.co/go/tools/ssa" -) - -type IsPure struct{} - -func (*IsPure) AFact() {} -func (d *IsPure) String() string { return "is pure" } - -type PurityResult map[*types.Func]*IsPure - -var Purity = &analysis.Analyzer{ - Name: "fact_purity", - Doc: "Mark pure functions", - Run: purity, - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - FactTypes: []analysis.Fact{(*IsPure)(nil)}, - ResultType: reflect.TypeOf(PurityResult{}), -} - -var pureStdlib = map[string]struct{}{ - "errors.New": {}, - "fmt.Errorf": {}, - "fmt.Sprintf": {}, - "fmt.Sprint": {}, - "sort.Reverse": {}, - "strings.Map": {}, - "strings.Repeat": {}, - "strings.Replace": {}, - "strings.Title": {}, - "strings.ToLower": {}, - "strings.ToLowerSpecial": {}, - "strings.ToTitle": {}, - "strings.ToTitleSpecial": {}, - "strings.ToUpper": {}, - "strings.ToUpperSpecial": {}, - "strings.Trim": {}, - "strings.TrimFunc": {}, - "strings.TrimLeft": {}, - "strings.TrimLeftFunc": {}, - "strings.TrimPrefix": {}, - "strings.TrimRight": {}, - "strings.TrimRightFunc": {}, - "strings.TrimSpace": {}, - "strings.TrimSuffix": {}, - "(*net/http.Request).WithContext": {}, -} - -func purity(pass *analysis.Pass) (interface{}, error) { - seen := map[*ssa.Function]struct{}{} - ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).Pkg - var check func(ssafn *ssa.Function) (ret bool) - check = func(ssafn *ssa.Function) (ret bool) { - if ssafn.Object() == nil { - // TODO(dh): support closures - return false - } - if pass.ImportObjectFact(ssafn.Object(), new(IsPure)) { - return true - } - if ssafn.Pkg != ssapkg { - // Function is in another package but wasn't marked as - // pure, ergo it isn't pure - return false - } - // Break recursion - if _, ok := seen[ssafn]; ok { - return false - } - - seen[ssafn] = struct{}{} - defer func() { - if ret { - pass.ExportObjectFact(ssafn.Object(), &IsPure{}) - } - }() - - if functions.IsStub(ssafn) { - return false - } - - if _, ok := pureStdlib[ssafn.Object().(*types.Func).FullName()]; ok { - return true - } - - if ssafn.Signature.Results().Len() == 0 { - // A function with no return values is empty or is doing some - // work we cannot see (for example because of build tags); - // don't consider it pure. - return false - } - - for _, param := range ssafn.Params { - if _, ok := param.Type().Underlying().(*types.Basic); !ok { - return false - } - } - - if ssafn.Blocks == nil { - return false - } - checkCall := func(common *ssa.CallCommon) bool { - if common.IsInvoke() { - return false - } - builtin, ok := common.Value.(*ssa.Builtin) - if !ok { - if common.StaticCallee() != ssafn { - if common.StaticCallee() == nil { - return false - } - if !check(common.StaticCallee()) { - return false - } - } - } else { - switch builtin.Name() { - case "len", "cap", "make", "new": - default: - return false - } - } - return true - } - for _, b := range ssafn.Blocks { - for _, ins := range b.Instrs { - switch ins := ins.(type) { - case *ssa.Call: - if !checkCall(ins.Common()) { - return false - } - case *ssa.Defer: - if !checkCall(&ins.Call) { - return false - } - case *ssa.Select: - return false - case *ssa.Send: - return false - case *ssa.Go: - return false - case *ssa.Panic: - return false - case *ssa.Store: - return false - case *ssa.FieldAddr: - return false - case *ssa.UnOp: - if ins.Op == token.MUL || ins.Op == token.AND { - return false - } - } - } - } - return true - } - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - check(ssafn) - } - - out := PurityResult{} - for _, fact := range pass.AllObjectFacts() { - out[fact.Object.(*types.Func)] = fact.Fact.(*IsPure) - } - return out, nil -} diff --git a/vendor/honnef.co/go/tools/facts/token.go b/vendor/honnef.co/go/tools/facts/token.go deleted file mode 100644 index 26e76ff73d5..00000000000 --- a/vendor/honnef.co/go/tools/facts/token.go +++ /dev/null @@ -1,24 +0,0 @@ -package facts - -import ( - "go/ast" - "go/token" - "reflect" - - "golang.org/x/tools/go/analysis" -) - -var TokenFile = &analysis.Analyzer{ - Name: "tokenfileanalyzer", - Doc: "creates a mapping of *token.File to *ast.File", - Run: func(pass *analysis.Pass) (interface{}, error) { - m := map[*token.File]*ast.File{} - for _, af := range pass.Files { - tf := pass.Fset.File(af.Pos()) - m[tf] = af - } - return m, nil - }, - RunDespiteErrors: true, - ResultType: reflect.TypeOf(map[*token.File]*ast.File{}), -} diff --git a/vendor/honnef.co/go/tools/functions/BUILD b/vendor/honnef.co/go/tools/functions/BUILD deleted file mode 100644 index 0efb27b93f4..00000000000 --- a/vendor/honnef.co/go/tools/functions/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "loops.go", - "pure.go", - "terminates.go", - ], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/functions", - importpath = "honnef.co/go/tools/functions", - visibility = ["//visibility:public"], - deps = ["//vendor/honnef.co/go/tools/ssa:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/functions/loops.go b/vendor/honnef.co/go/tools/functions/loops.go deleted file mode 100644 index 15877a2f96b..00000000000 --- a/vendor/honnef.co/go/tools/functions/loops.go +++ /dev/null @@ -1,54 +0,0 @@ -package functions - -import "honnef.co/go/tools/ssa" - -type Loop struct{ ssa.BlockSet } - -func FindLoops(fn *ssa.Function) []Loop { - if fn.Blocks == nil { - return nil - } - tree := fn.DomPreorder() - var sets []Loop - for _, h := range tree { - for _, n := range h.Preds { - if !h.Dominates(n) { - continue - } - // n is a back-edge to h - // h is the loop header - if n == h { - set := Loop{} - set.Add(n) - sets = append(sets, set) - continue - } - set := Loop{} - set.Add(h) - set.Add(n) - for _, b := range allPredsBut(n, h, nil) { - set.Add(b) - } - sets = append(sets, set) - } - } - return sets -} - -func allPredsBut(b, but *ssa.BasicBlock, list []*ssa.BasicBlock) []*ssa.BasicBlock { -outer: - for _, pred := range b.Preds { - if pred == but { - continue - } - for _, p := range list { - // TODO improve big-o complexity of this function - if pred == p { - continue outer - } - } - list = append(list, pred) - list = allPredsBut(pred, but, list) - } - return list -} diff --git a/vendor/honnef.co/go/tools/functions/pure.go b/vendor/honnef.co/go/tools/functions/pure.go deleted file mode 100644 index 8bc5587713a..00000000000 --- a/vendor/honnef.co/go/tools/functions/pure.go +++ /dev/null @@ -1,46 +0,0 @@ -package functions - -import ( - "honnef.co/go/tools/ssa" -) - -func filterDebug(instr []ssa.Instruction) []ssa.Instruction { - var out []ssa.Instruction - for _, ins := range instr { - if _, ok := ins.(*ssa.DebugRef); !ok { - out = append(out, ins) - } - } - return out -} - -// IsStub reports whether a function is a stub. A function is -// considered a stub if it has no instructions or exactly one -// instruction, which must be either returning only constant values or -// a panic. -func IsStub(fn *ssa.Function) bool { - if len(fn.Blocks) == 0 { - return true - } - if len(fn.Blocks) > 1 { - return false - } - instrs := filterDebug(fn.Blocks[0].Instrs) - if len(instrs) != 1 { - return false - } - - switch instrs[0].(type) { - case *ssa.Return: - // Since this is the only instruction, the return value must - // be a constant. We consider all constants as stubs, not just - // the zero value. This does not, unfortunately, cover zero - // initialised structs, as these cause additional - // instructions. - return true - case *ssa.Panic: - return true - default: - return false - } -} diff --git a/vendor/honnef.co/go/tools/functions/terminates.go b/vendor/honnef.co/go/tools/functions/terminates.go deleted file mode 100644 index 3e9c3a23f37..00000000000 --- a/vendor/honnef.co/go/tools/functions/terminates.go +++ /dev/null @@ -1,24 +0,0 @@ -package functions - -import "honnef.co/go/tools/ssa" - -// Terminates reports whether fn is supposed to return, that is if it -// has at least one theoretic path that returns from the function. -// Explicit panics do not count as terminating. -func Terminates(fn *ssa.Function) bool { - if fn.Blocks == nil { - // assuming that a function terminates is the conservative - // choice - return true - } - - for _, block := range fn.Blocks { - if len(block.Instrs) == 0 { - continue - } - if _, ok := block.Instrs[len(block.Instrs)-1].(*ssa.Return); ok { - return true - } - } - return false -} diff --git a/vendor/honnef.co/go/tools/go/types/typeutil/BUILD b/vendor/honnef.co/go/tools/go/types/typeutil/BUILD deleted file mode 100644 index ce51ea35960..00000000000 --- a/vendor/honnef.co/go/tools/go/types/typeutil/BUILD +++ /dev/null @@ -1,31 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "callee.go", - "identical.go", - "imports.go", - "map.go", - "methodsetcache.go", - "ui.go", - ], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/go/types/typeutil", - importpath = "honnef.co/go/tools/go/types/typeutil", - visibility = ["//visibility:public"], - deps = ["//vendor/golang.org/x/tools/go/ast/astutil:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/go/types/typeutil/callee.go b/vendor/honnef.co/go/tools/go/types/typeutil/callee.go deleted file mode 100644 index 38f596daf9e..00000000000 --- a/vendor/honnef.co/go/tools/go/types/typeutil/callee.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package typeutil - -import ( - "go/ast" - "go/types" - - "golang.org/x/tools/go/ast/astutil" -) - -// Callee returns the named target of a function call, if any: -// a function, method, builtin, or variable. -func Callee(info *types.Info, call *ast.CallExpr) types.Object { - var obj types.Object - switch fun := astutil.Unparen(call.Fun).(type) { - case *ast.Ident: - obj = info.Uses[fun] // type, var, builtin, or declared func - case *ast.SelectorExpr: - if sel, ok := info.Selections[fun]; ok { - obj = sel.Obj() // method or field - } else { - obj = info.Uses[fun.Sel] // qualified identifier? - } - } - if _, ok := obj.(*types.TypeName); ok { - return nil // T(x) is a conversion, not a call - } - return obj -} - -// StaticCallee returns the target (function or method) of a static -// function call, if any. It returns nil for calls to builtins. -func StaticCallee(info *types.Info, call *ast.CallExpr) *types.Func { - if f, ok := Callee(info, call).(*types.Func); ok && !interfaceMethod(f) { - return f - } - return nil -} - -func interfaceMethod(f *types.Func) bool { - recv := f.Type().(*types.Signature).Recv() - return recv != nil && types.IsInterface(recv.Type()) -} diff --git a/vendor/honnef.co/go/tools/go/types/typeutil/identical.go b/vendor/honnef.co/go/tools/go/types/typeutil/identical.go deleted file mode 100644 index c0ca441c327..00000000000 --- a/vendor/honnef.co/go/tools/go/types/typeutil/identical.go +++ /dev/null @@ -1,75 +0,0 @@ -package typeutil - -import ( - "go/types" -) - -// Identical reports whether x and y are identical types. -// Unlike types.Identical, receivers of Signature types are not ignored. -// Unlike types.Identical, interfaces are compared via pointer equality (except for the empty interface, which gets deduplicated). -// Unlike types.Identical, structs are compared via pointer equality. -func Identical(x, y types.Type) (ret bool) { - if !types.Identical(x, y) { - return false - } - - switch x := x.(type) { - case *types.Struct: - y, ok := y.(*types.Struct) - if !ok { - // should be impossible - return true - } - return x == y - case *types.Interface: - // The issue with interfaces, typeutil.Map and types.Identical - // - // types.Identical, when comparing two interfaces, only looks at the set - // of all methods, not differentiating between implicit (embedded) and - // explicit methods. - // - // When we see the following two types, in source order - // - // type I1 interface { foo() } - // type I2 interface { I1 } - // - // then we will first correctly process I1 and its underlying type. When - // we get to I2, we will see that its underlying type is identical to - // that of I1 and not process it again. This, however, means that we will - // not record the fact that I2 embeds I1. If only I2 is reachable via the - // graph root, then I1 will not be considered used. - // - // We choose to be lazy and compare interfaces by their - // pointers. This will obviously miss identical interfaces, - // but this only has a runtime cost, it doesn't affect - // correctness. - y, ok := y.(*types.Interface) - if !ok { - // should be impossible - return true - } - if x.NumEmbeddeds() == 0 && - y.NumEmbeddeds() == 0 && - x.NumMethods() == 0 && - y.NumMethods() == 0 { - // all truly empty interfaces are the same - return true - } - return x == y - case *types.Signature: - y, ok := y.(*types.Signature) - if !ok { - // should be impossible - return true - } - if x.Recv() == y.Recv() { - return true - } - if x.Recv() == nil || y.Recv() == nil { - return false - } - return Identical(x.Recv().Type(), y.Recv().Type()) - default: - return true - } -} diff --git a/vendor/honnef.co/go/tools/go/types/typeutil/imports.go b/vendor/honnef.co/go/tools/go/types/typeutil/imports.go deleted file mode 100644 index 9c441dba9c0..00000000000 --- a/vendor/honnef.co/go/tools/go/types/typeutil/imports.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package typeutil - -import "go/types" - -// Dependencies returns all dependencies of the specified packages. -// -// Dependent packages appear in topological order: if package P imports -// package Q, Q appears earlier than P in the result. -// The algorithm follows import statements in the order they -// appear in the source code, so the result is a total order. -// -func Dependencies(pkgs ...*types.Package) []*types.Package { - var result []*types.Package - seen := make(map[*types.Package]bool) - var visit func(pkgs []*types.Package) - visit = func(pkgs []*types.Package) { - for _, p := range pkgs { - if !seen[p] { - seen[p] = true - visit(p.Imports()) - result = append(result, p) - } - } - } - visit(pkgs) - return result -} diff --git a/vendor/honnef.co/go/tools/go/types/typeutil/map.go b/vendor/honnef.co/go/tools/go/types/typeutil/map.go deleted file mode 100644 index f929353ccbd..00000000000 --- a/vendor/honnef.co/go/tools/go/types/typeutil/map.go +++ /dev/null @@ -1,319 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package typeutil defines various utilities for types, such as Map, -// a mapping from types.Type to interface{} values. -package typeutil - -import ( - "bytes" - "fmt" - "go/types" - "reflect" -) - -// Map is a hash-table-based mapping from types (types.Type) to -// arbitrary interface{} values. The concrete types that implement -// the Type interface are pointers. Since they are not canonicalized, -// == cannot be used to check for equivalence, and thus we cannot -// simply use a Go map. -// -// Just as with map[K]V, a nil *Map is a valid empty map. -// -// Not thread-safe. -// -// This fork handles Signatures correctly, respecting method -// receivers. Furthermore, it doesn't deduplicate interfaces or -// structs. Interfaces aren't deduplicated as not to conflate implicit -// and explicit methods. Structs aren't deduplicated because we track -// fields of each type separately. -// -type Map struct { - hasher Hasher // shared by many Maps - table map[uint32][]entry // maps hash to bucket; entry.key==nil means unused - length int // number of map entries -} - -// entry is an entry (key/value association) in a hash bucket. -type entry struct { - key types.Type - value interface{} -} - -// SetHasher sets the hasher used by Map. -// -// All Hashers are functionally equivalent but contain internal state -// used to cache the results of hashing previously seen types. -// -// A single Hasher created by MakeHasher() may be shared among many -// Maps. This is recommended if the instances have many keys in -// common, as it will amortize the cost of hash computation. -// -// A Hasher may grow without bound as new types are seen. Even when a -// type is deleted from the map, the Hasher never shrinks, since other -// types in the map may reference the deleted type indirectly. -// -// Hashers are not thread-safe, and read-only operations such as -// Map.Lookup require updates to the hasher, so a full Mutex lock (not a -// read-lock) is require around all Map operations if a shared -// hasher is accessed from multiple threads. -// -// If SetHasher is not called, the Map will create a private hasher at -// the first call to Insert. -// -func (m *Map) SetHasher(hasher Hasher) { - m.hasher = hasher -} - -// Delete removes the entry with the given key, if any. -// It returns true if the entry was found. -// -func (m *Map) Delete(key types.Type) bool { - if m != nil && m.table != nil { - hash := m.hasher.Hash(key) - bucket := m.table[hash] - for i, e := range bucket { - if e.key != nil && Identical(key, e.key) { - // We can't compact the bucket as it - // would disturb iterators. - bucket[i] = entry{} - m.length-- - return true - } - } - } - return false -} - -// At returns the map entry for the given key. -// The result is nil if the entry is not present. -// -func (m *Map) At(key types.Type) interface{} { - if m != nil && m.table != nil { - for _, e := range m.table[m.hasher.Hash(key)] { - if e.key != nil && Identical(key, e.key) { - return e.value - } - } - } - return nil -} - -// Set sets the map entry for key to val, -// and returns the previous entry, if any. -func (m *Map) Set(key types.Type, value interface{}) (prev interface{}) { - if m.table != nil { - hash := m.hasher.Hash(key) - bucket := m.table[hash] - var hole *entry - for i, e := range bucket { - if e.key == nil { - hole = &bucket[i] - } else if Identical(key, e.key) { - prev = e.value - bucket[i].value = value - return - } - } - - if hole != nil { - *hole = entry{key, value} // overwrite deleted entry - } else { - m.table[hash] = append(bucket, entry{key, value}) - } - } else { - if m.hasher.memo == nil { - m.hasher = MakeHasher() - } - hash := m.hasher.Hash(key) - m.table = map[uint32][]entry{hash: {entry{key, value}}} - } - - m.length++ - return -} - -// Len returns the number of map entries. -func (m *Map) Len() int { - if m != nil { - return m.length - } - return 0 -} - -// Iterate calls function f on each entry in the map in unspecified order. -// -// If f should mutate the map, Iterate provides the same guarantees as -// Go maps: if f deletes a map entry that Iterate has not yet reached, -// f will not be invoked for it, but if f inserts a map entry that -// Iterate has not yet reached, whether or not f will be invoked for -// it is unspecified. -// -func (m *Map) Iterate(f func(key types.Type, value interface{})) { - if m != nil { - for _, bucket := range m.table { - for _, e := range bucket { - if e.key != nil { - f(e.key, e.value) - } - } - } - } -} - -// Keys returns a new slice containing the set of map keys. -// The order is unspecified. -func (m *Map) Keys() []types.Type { - keys := make([]types.Type, 0, m.Len()) - m.Iterate(func(key types.Type, _ interface{}) { - keys = append(keys, key) - }) - return keys -} - -func (m *Map) toString(values bool) string { - if m == nil { - return "{}" - } - var buf bytes.Buffer - fmt.Fprint(&buf, "{") - sep := "" - m.Iterate(func(key types.Type, value interface{}) { - fmt.Fprint(&buf, sep) - sep = ", " - fmt.Fprint(&buf, key) - if values { - fmt.Fprintf(&buf, ": %q", value) - } - }) - fmt.Fprint(&buf, "}") - return buf.String() -} - -// String returns a string representation of the map's entries. -// Values are printed using fmt.Sprintf("%v", v). -// Order is unspecified. -// -func (m *Map) String() string { - return m.toString(true) -} - -// KeysString returns a string representation of the map's key set. -// Order is unspecified. -// -func (m *Map) KeysString() string { - return m.toString(false) -} - -//////////////////////////////////////////////////////////////////////// -// Hasher - -// A Hasher maps each type to its hash value. -// For efficiency, a hasher uses memoization; thus its memory -// footprint grows monotonically over time. -// Hashers are not thread-safe. -// Hashers have reference semantics. -// Call MakeHasher to create a Hasher. -type Hasher struct { - memo map[types.Type]uint32 -} - -// MakeHasher returns a new Hasher instance. -func MakeHasher() Hasher { - return Hasher{make(map[types.Type]uint32)} -} - -// Hash computes a hash value for the given type t such that -// Identical(t, t') => Hash(t) == Hash(t'). -func (h Hasher) Hash(t types.Type) uint32 { - hash, ok := h.memo[t] - if !ok { - hash = h.hashFor(t) - h.memo[t] = hash - } - return hash -} - -// hashString computes the Fowler–Noll–Vo hash of s. -func hashString(s string) uint32 { - var h uint32 - for i := 0; i < len(s); i++ { - h ^= uint32(s[i]) - h *= 16777619 - } - return h -} - -// hashFor computes the hash of t. -func (h Hasher) hashFor(t types.Type) uint32 { - // See Identical for rationale. - switch t := t.(type) { - case *types.Basic: - return uint32(t.Kind()) - - case *types.Array: - return 9043 + 2*uint32(t.Len()) + 3*h.Hash(t.Elem()) - - case *types.Slice: - return 9049 + 2*h.Hash(t.Elem()) - - case *types.Struct: - var hash uint32 = 9059 - for i, n := 0, t.NumFields(); i < n; i++ { - f := t.Field(i) - if f.Anonymous() { - hash += 8861 - } - hash += hashString(t.Tag(i)) - hash += hashString(f.Name()) // (ignore f.Pkg) - hash += h.Hash(f.Type()) - } - return hash - - case *types.Pointer: - return 9067 + 2*h.Hash(t.Elem()) - - case *types.Signature: - var hash uint32 = 9091 - if t.Variadic() { - hash *= 8863 - } - return hash + 3*h.hashTuple(t.Params()) + 5*h.hashTuple(t.Results()) - - case *types.Interface: - var hash uint32 = 9103 - for i, n := 0, t.NumMethods(); i < n; i++ { - // See go/types.identicalMethods for rationale. - // Method order is not significant. - // Ignore m.Pkg(). - m := t.Method(i) - hash += 3*hashString(m.Name()) + 5*h.Hash(m.Type()) - } - return hash - - case *types.Map: - return 9109 + 2*h.Hash(t.Key()) + 3*h.Hash(t.Elem()) - - case *types.Chan: - return 9127 + 2*uint32(t.Dir()) + 3*h.Hash(t.Elem()) - - case *types.Named: - // Not safe with a copying GC; objects may move. - return uint32(reflect.ValueOf(t.Obj()).Pointer()) - - case *types.Tuple: - return h.hashTuple(t) - } - panic(t) -} - -func (h Hasher) hashTuple(tuple *types.Tuple) uint32 { - // See go/types.identicalTypes for rationale. - n := tuple.Len() - var hash uint32 = 9137 + 2*uint32(n) - for i := 0; i < n; i++ { - hash += 3 * h.Hash(tuple.At(i).Type()) - } - return hash -} diff --git a/vendor/honnef.co/go/tools/go/types/typeutil/methodsetcache.go b/vendor/honnef.co/go/tools/go/types/typeutil/methodsetcache.go deleted file mode 100644 index 32084610f49..00000000000 --- a/vendor/honnef.co/go/tools/go/types/typeutil/methodsetcache.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file implements a cache of method sets. - -package typeutil - -import ( - "go/types" - "sync" -) - -// A MethodSetCache records the method set of each type T for which -// MethodSet(T) is called so that repeat queries are fast. -// The zero value is a ready-to-use cache instance. -type MethodSetCache struct { - mu sync.Mutex - named map[*types.Named]struct{ value, pointer *types.MethodSet } // method sets for named N and *N - others map[types.Type]*types.MethodSet // all other types -} - -// MethodSet returns the method set of type T. It is thread-safe. -// -// If cache is nil, this function is equivalent to types.NewMethodSet(T). -// Utility functions can thus expose an optional *MethodSetCache -// parameter to clients that care about performance. -// -func (cache *MethodSetCache) MethodSet(T types.Type) *types.MethodSet { - if cache == nil { - return types.NewMethodSet(T) - } - cache.mu.Lock() - defer cache.mu.Unlock() - - switch T := T.(type) { - case *types.Named: - return cache.lookupNamed(T).value - - case *types.Pointer: - if N, ok := T.Elem().(*types.Named); ok { - return cache.lookupNamed(N).pointer - } - } - - // all other types - // (The map uses pointer equivalence, not type identity.) - mset := cache.others[T] - if mset == nil { - mset = types.NewMethodSet(T) - if cache.others == nil { - cache.others = make(map[types.Type]*types.MethodSet) - } - cache.others[T] = mset - } - return mset -} - -func (cache *MethodSetCache) lookupNamed(named *types.Named) struct{ value, pointer *types.MethodSet } { - if cache.named == nil { - cache.named = make(map[*types.Named]struct{ value, pointer *types.MethodSet }) - } - // Avoid recomputing mset(*T) for each distinct Pointer - // instance whose underlying type is a named type. - msets, ok := cache.named[named] - if !ok { - msets.value = types.NewMethodSet(named) - msets.pointer = types.NewMethodSet(types.NewPointer(named)) - cache.named[named] = msets - } - return msets -} diff --git a/vendor/honnef.co/go/tools/go/types/typeutil/ui.go b/vendor/honnef.co/go/tools/go/types/typeutil/ui.go deleted file mode 100644 index 9849c24cef3..00000000000 --- a/vendor/honnef.co/go/tools/go/types/typeutil/ui.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package typeutil - -// This file defines utilities for user interfaces that display types. - -import "go/types" - -// IntuitiveMethodSet returns the intuitive method set of a type T, -// which is the set of methods you can call on an addressable value of -// that type. -// -// The result always contains MethodSet(T), and is exactly MethodSet(T) -// for interface types and for pointer-to-concrete types. -// For all other concrete types T, the result additionally -// contains each method belonging to *T if there is no identically -// named method on T itself. -// -// This corresponds to user intuition about method sets; -// this function is intended only for user interfaces. -// -// The order of the result is as for types.MethodSet(T). -// -func IntuitiveMethodSet(T types.Type, msets *MethodSetCache) []*types.Selection { - isPointerToConcrete := func(T types.Type) bool { - ptr, ok := T.(*types.Pointer) - return ok && !types.IsInterface(ptr.Elem()) - } - - var result []*types.Selection - mset := msets.MethodSet(T) - if types.IsInterface(T) || isPointerToConcrete(T) { - for i, n := 0, mset.Len(); i < n; i++ { - result = append(result, mset.At(i)) - } - } else { - // T is some other concrete type. - // Report methods of T and *T, preferring those of T. - pmset := msets.MethodSet(types.NewPointer(T)) - for i, n := 0, pmset.Len(); i < n; i++ { - meth := pmset.At(i) - if m := mset.Lookup(meth.Obj().Pkg(), meth.Obj().Name()); m != nil { - meth = m - } - result = append(result, meth) - } - - } - return result -} diff --git a/vendor/honnef.co/go/tools/internal/cache/BUILD b/vendor/honnef.co/go/tools/internal/cache/BUILD deleted file mode 100644 index c51c54b7c2e..00000000000 --- a/vendor/honnef.co/go/tools/internal/cache/BUILD +++ /dev/null @@ -1,28 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "cache.go", - "default.go", - "hash.go", - ], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/internal/cache", - importpath = "honnef.co/go/tools/internal/cache", - visibility = ["//vendor/honnef.co/go/tools:__subpackages__"], - deps = ["//vendor/honnef.co/go/tools/internal/renameio:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/internal/cache/cache.go b/vendor/honnef.co/go/tools/internal/cache/cache.go deleted file mode 100644 index 2b33ca10671..00000000000 --- a/vendor/honnef.co/go/tools/internal/cache/cache.go +++ /dev/null @@ -1,474 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package cache implements a build artifact cache. -// -// This package is a slightly modified fork of Go's -// cmd/go/internal/cache package. -package cache - -import ( - "bytes" - "crypto/sha256" - "encoding/hex" - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strconv" - "strings" - "time" - - "honnef.co/go/tools/internal/renameio" -) - -// An ActionID is a cache action key, the hash of a complete description of a -// repeatable computation (command line, environment variables, -// input file contents, executable contents). -type ActionID [HashSize]byte - -// An OutputID is a cache output key, the hash of an output of a computation. -type OutputID [HashSize]byte - -// A Cache is a package cache, backed by a file system directory tree. -type Cache struct { - dir string - now func() time.Time -} - -// Open opens and returns the cache in the given directory. -// -// It is safe for multiple processes on a single machine to use the -// same cache directory in a local file system simultaneously. -// They will coordinate using operating system file locks and may -// duplicate effort but will not corrupt the cache. -// -// However, it is NOT safe for multiple processes on different machines -// to share a cache directory (for example, if the directory were stored -// in a network file system). File locking is notoriously unreliable in -// network file systems and may not suffice to protect the cache. -// -func Open(dir string) (*Cache, error) { - info, err := os.Stat(dir) - if err != nil { - return nil, err - } - if !info.IsDir() { - return nil, &os.PathError{Op: "open", Path: dir, Err: fmt.Errorf("not a directory")} - } - for i := 0; i < 256; i++ { - name := filepath.Join(dir, fmt.Sprintf("%02x", i)) - if err := os.MkdirAll(name, 0777); err != nil { - return nil, err - } - } - c := &Cache{ - dir: dir, - now: time.Now, - } - return c, nil -} - -// fileName returns the name of the file corresponding to the given id. -func (c *Cache) fileName(id [HashSize]byte, key string) string { - return filepath.Join(c.dir, fmt.Sprintf("%02x", id[0]), fmt.Sprintf("%x", id)+"-"+key) -} - -var errMissing = errors.New("cache entry not found") - -const ( - // action entry file is "v1 \n" - hexSize = HashSize * 2 - entrySize = 2 + 1 + hexSize + 1 + hexSize + 1 + 20 + 1 + 20 + 1 -) - -// verify controls whether to run the cache in verify mode. -// In verify mode, the cache always returns errMissing from Get -// but then double-checks in Put that the data being written -// exactly matches any existing entry. This provides an easy -// way to detect program behavior that would have been different -// had the cache entry been returned from Get. -// -// verify is enabled by setting the environment variable -// GODEBUG=gocacheverify=1. -var verify = false - -// DebugTest is set when GODEBUG=gocachetest=1 is in the environment. -var DebugTest = false - -func init() { initEnv() } - -func initEnv() { - verify = false - debugHash = false - debug := strings.Split(os.Getenv("GODEBUG"), ",") - for _, f := range debug { - if f == "gocacheverify=1" { - verify = true - } - if f == "gocachehash=1" { - debugHash = true - } - if f == "gocachetest=1" { - DebugTest = true - } - } -} - -// Get looks up the action ID in the cache, -// returning the corresponding output ID and file size, if any. -// Note that finding an output ID does not guarantee that the -// saved file for that output ID is still available. -func (c *Cache) Get(id ActionID) (Entry, error) { - if verify { - return Entry{}, errMissing - } - return c.get(id) -} - -type Entry struct { - OutputID OutputID - Size int64 - Time time.Time -} - -// get is Get but does not respect verify mode, so that Put can use it. -func (c *Cache) get(id ActionID) (Entry, error) { - missing := func() (Entry, error) { - return Entry{}, errMissing - } - f, err := os.Open(c.fileName(id, "a")) - if err != nil { - return missing() - } - defer f.Close() - entry := make([]byte, entrySize+1) // +1 to detect whether f is too long - if n, err := io.ReadFull(f, entry); n != entrySize || err != io.ErrUnexpectedEOF { - return missing() - } - if entry[0] != 'v' || entry[1] != '1' || entry[2] != ' ' || entry[3+hexSize] != ' ' || entry[3+hexSize+1+hexSize] != ' ' || entry[3+hexSize+1+hexSize+1+20] != ' ' || entry[entrySize-1] != '\n' { - return missing() - } - eid, entry := entry[3:3+hexSize], entry[3+hexSize:] - eout, entry := entry[1:1+hexSize], entry[1+hexSize:] - esize, entry := entry[1:1+20], entry[1+20:] - //lint:ignore SA4006 See https://github.com/dominikh/go-tools/issues/465 - etime, entry := entry[1:1+20], entry[1+20:] - var buf [HashSize]byte - if _, err := hex.Decode(buf[:], eid); err != nil || buf != id { - return missing() - } - if _, err := hex.Decode(buf[:], eout); err != nil { - return missing() - } - i := 0 - for i < len(esize) && esize[i] == ' ' { - i++ - } - size, err := strconv.ParseInt(string(esize[i:]), 10, 64) - if err != nil || size < 0 { - return missing() - } - i = 0 - for i < len(etime) && etime[i] == ' ' { - i++ - } - tm, err := strconv.ParseInt(string(etime[i:]), 10, 64) - if err != nil || size < 0 { - return missing() - } - - c.used(c.fileName(id, "a")) - - return Entry{buf, size, time.Unix(0, tm)}, nil -} - -// GetFile looks up the action ID in the cache and returns -// the name of the corresponding data file. -func (c *Cache) GetFile(id ActionID) (file string, entry Entry, err error) { - entry, err = c.Get(id) - if err != nil { - return "", Entry{}, err - } - file = c.OutputFile(entry.OutputID) - info, err := os.Stat(file) - if err != nil || info.Size() != entry.Size { - return "", Entry{}, errMissing - } - return file, entry, nil -} - -// GetBytes looks up the action ID in the cache and returns -// the corresponding output bytes. -// GetBytes should only be used for data that can be expected to fit in memory. -func (c *Cache) GetBytes(id ActionID) ([]byte, Entry, error) { - entry, err := c.Get(id) - if err != nil { - return nil, entry, err - } - data, _ := ioutil.ReadFile(c.OutputFile(entry.OutputID)) - if sha256.Sum256(data) != entry.OutputID { - return nil, entry, errMissing - } - return data, entry, nil -} - -// OutputFile returns the name of the cache file storing output with the given OutputID. -func (c *Cache) OutputFile(out OutputID) string { - file := c.fileName(out, "d") - c.used(file) - return file -} - -// Time constants for cache expiration. -// -// We set the mtime on a cache file on each use, but at most one per mtimeInterval (1 hour), -// to avoid causing many unnecessary inode updates. The mtimes therefore -// roughly reflect "time of last use" but may in fact be older by at most an hour. -// -// We scan the cache for entries to delete at most once per trimInterval (1 day). -// -// When we do scan the cache, we delete entries that have not been used for -// at least trimLimit (5 days). Statistics gathered from a month of usage by -// Go developers found that essentially all reuse of cached entries happened -// within 5 days of the previous reuse. See golang.org/issue/22990. -const ( - mtimeInterval = 1 * time.Hour - trimInterval = 24 * time.Hour - trimLimit = 5 * 24 * time.Hour -) - -// used makes a best-effort attempt to update mtime on file, -// so that mtime reflects cache access time. -// -// Because the reflection only needs to be approximate, -// and to reduce the amount of disk activity caused by using -// cache entries, used only updates the mtime if the current -// mtime is more than an hour old. This heuristic eliminates -// nearly all of the mtime updates that would otherwise happen, -// while still keeping the mtimes useful for cache trimming. -func (c *Cache) used(file string) { - info, err := os.Stat(file) - if err == nil && c.now().Sub(info.ModTime()) < mtimeInterval { - return - } - os.Chtimes(file, c.now(), c.now()) -} - -// Trim removes old cache entries that are likely not to be reused. -func (c *Cache) Trim() { - now := c.now() - - // We maintain in dir/trim.txt the time of the last completed cache trim. - // If the cache has been trimmed recently enough, do nothing. - // This is the common case. - data, _ := ioutil.ReadFile(filepath.Join(c.dir, "trim.txt")) - t, err := strconv.ParseInt(strings.TrimSpace(string(data)), 10, 64) - if err == nil && now.Sub(time.Unix(t, 0)) < trimInterval { - return - } - - // Trim each of the 256 subdirectories. - // We subtract an additional mtimeInterval - // to account for the imprecision of our "last used" mtimes. - cutoff := now.Add(-trimLimit - mtimeInterval) - for i := 0; i < 256; i++ { - subdir := filepath.Join(c.dir, fmt.Sprintf("%02x", i)) - c.trimSubdir(subdir, cutoff) - } - - // Ignore errors from here: if we don't write the complete timestamp, the - // cache will appear older than it is, and we'll trim it again next time. - renameio.WriteFile(filepath.Join(c.dir, "trim.txt"), []byte(fmt.Sprintf("%d", now.Unix()))) -} - -// trimSubdir trims a single cache subdirectory. -func (c *Cache) trimSubdir(subdir string, cutoff time.Time) { - // Read all directory entries from subdir before removing - // any files, in case removing files invalidates the file offset - // in the directory scan. Also, ignore error from f.Readdirnames, - // because we don't care about reporting the error and we still - // want to process any entries found before the error. - f, err := os.Open(subdir) - if err != nil { - return - } - names, _ := f.Readdirnames(-1) - f.Close() - - for _, name := range names { - // Remove only cache entries (xxxx-a and xxxx-d). - if !strings.HasSuffix(name, "-a") && !strings.HasSuffix(name, "-d") { - continue - } - entry := filepath.Join(subdir, name) - info, err := os.Stat(entry) - if err == nil && info.ModTime().Before(cutoff) { - os.Remove(entry) - } - } -} - -// putIndexEntry adds an entry to the cache recording that executing the action -// with the given id produces an output with the given output id (hash) and size. -func (c *Cache) putIndexEntry(id ActionID, out OutputID, size int64, allowVerify bool) error { - // Note: We expect that for one reason or another it may happen - // that repeating an action produces a different output hash - // (for example, if the output contains a time stamp or temp dir name). - // While not ideal, this is also not a correctness problem, so we - // don't make a big deal about it. In particular, we leave the action - // cache entries writable specifically so that they can be overwritten. - // - // Setting GODEBUG=gocacheverify=1 does make a big deal: - // in verify mode we are double-checking that the cache entries - // are entirely reproducible. As just noted, this may be unrealistic - // in some cases but the check is also useful for shaking out real bugs. - entry := []byte(fmt.Sprintf("v1 %x %x %20d %20d\n", id, out, size, time.Now().UnixNano())) - if verify && allowVerify { - old, err := c.get(id) - if err == nil && (old.OutputID != out || old.Size != size) { - // panic to show stack trace, so we can see what code is generating this cache entry. - msg := fmt.Sprintf("go: internal cache error: cache verify failed: id=%x changed:<<<\n%s\n>>>\nold: %x %d\nnew: %x %d", id, reverseHash(id), out, size, old.OutputID, old.Size) - panic(msg) - } - } - file := c.fileName(id, "a") - if err := ioutil.WriteFile(file, entry, 0666); err != nil { - // TODO(bcmills): This Remove potentially races with another go command writing to file. - // Can we eliminate it? - os.Remove(file) - return err - } - os.Chtimes(file, c.now(), c.now()) // mainly for tests - - return nil -} - -// Put stores the given output in the cache as the output for the action ID. -// It may read file twice. The content of file must not change between the two passes. -func (c *Cache) Put(id ActionID, file io.ReadSeeker) (OutputID, int64, error) { - return c.put(id, file, true) -} - -// PutNoVerify is like Put but disables the verify check -// when GODEBUG=goverifycache=1 is set. -// It is meant for data that is OK to cache but that we expect to vary slightly from run to run, -// like test output containing times and the like. -func (c *Cache) PutNoVerify(id ActionID, file io.ReadSeeker) (OutputID, int64, error) { - return c.put(id, file, false) -} - -func (c *Cache) put(id ActionID, file io.ReadSeeker, allowVerify bool) (OutputID, int64, error) { - // Compute output ID. - h := sha256.New() - if _, err := file.Seek(0, 0); err != nil { - return OutputID{}, 0, err - } - size, err := io.Copy(h, file) - if err != nil { - return OutputID{}, 0, err - } - var out OutputID - h.Sum(out[:0]) - - // Copy to cached output file (if not already present). - if err := c.copyFile(file, out, size); err != nil { - return out, size, err - } - - // Add to cache index. - return out, size, c.putIndexEntry(id, out, size, allowVerify) -} - -// PutBytes stores the given bytes in the cache as the output for the action ID. -func (c *Cache) PutBytes(id ActionID, data []byte) error { - _, _, err := c.Put(id, bytes.NewReader(data)) - return err -} - -// copyFile copies file into the cache, expecting it to have the given -// output ID and size, if that file is not present already. -func (c *Cache) copyFile(file io.ReadSeeker, out OutputID, size int64) error { - name := c.fileName(out, "d") - info, err := os.Stat(name) - if err == nil && info.Size() == size { - // Check hash. - if f, err := os.Open(name); err == nil { - h := sha256.New() - io.Copy(h, f) - f.Close() - var out2 OutputID - h.Sum(out2[:0]) - if out == out2 { - return nil - } - } - // Hash did not match. Fall through and rewrite file. - } - - // Copy file to cache directory. - mode := os.O_RDWR | os.O_CREATE - if err == nil && info.Size() > size { // shouldn't happen but fix in case - mode |= os.O_TRUNC - } - f, err := os.OpenFile(name, mode, 0666) - if err != nil { - return err - } - defer f.Close() - if size == 0 { - // File now exists with correct size. - // Only one possible zero-length file, so contents are OK too. - // Early return here makes sure there's a "last byte" for code below. - return nil - } - - // From here on, if any of the I/O writing the file fails, - // we make a best-effort attempt to truncate the file f - // before returning, to avoid leaving bad bytes in the file. - - // Copy file to f, but also into h to double-check hash. - if _, err := file.Seek(0, 0); err != nil { - f.Truncate(0) - return err - } - h := sha256.New() - w := io.MultiWriter(f, h) - if _, err := io.CopyN(w, file, size-1); err != nil { - f.Truncate(0) - return err - } - // Check last byte before writing it; writing it will make the size match - // what other processes expect to find and might cause them to start - // using the file. - buf := make([]byte, 1) - if _, err := file.Read(buf); err != nil { - f.Truncate(0) - return err - } - h.Write(buf) - sum := h.Sum(nil) - if !bytes.Equal(sum, out[:]) { - f.Truncate(0) - return fmt.Errorf("file content changed underfoot") - } - - // Commit cache file entry. - if _, err := f.Write(buf); err != nil { - f.Truncate(0) - return err - } - if err := f.Close(); err != nil { - // Data might not have been written, - // but file may look like it is the right size. - // To be extra careful, remove cached file. - os.Remove(name) - return err - } - os.Chtimes(name, c.now(), c.now()) // mainly for tests - - return nil -} diff --git a/vendor/honnef.co/go/tools/internal/cache/default.go b/vendor/honnef.co/go/tools/internal/cache/default.go deleted file mode 100644 index 3034f76a538..00000000000 --- a/vendor/honnef.co/go/tools/internal/cache/default.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cache - -import ( - "fmt" - "io/ioutil" - "log" - "os" - "path/filepath" - "sync" -) - -// Default returns the default cache to use. -func Default() (*Cache, error) { - defaultOnce.Do(initDefaultCache) - return defaultCache, defaultDirErr -} - -var ( - defaultOnce sync.Once - defaultCache *Cache -) - -// cacheREADME is a message stored in a README in the cache directory. -// Because the cache lives outside the normal Go trees, we leave the -// README as a courtesy to explain where it came from. -const cacheREADME = `This directory holds cached build artifacts from staticcheck. -` - -// initDefaultCache does the work of finding the default cache -// the first time Default is called. -func initDefaultCache() { - dir := DefaultDir() - if err := os.MkdirAll(dir, 0777); err != nil { - log.Fatalf("failed to initialize build cache at %s: %s\n", dir, err) - } - if _, err := os.Stat(filepath.Join(dir, "README")); err != nil { - // Best effort. - ioutil.WriteFile(filepath.Join(dir, "README"), []byte(cacheREADME), 0666) - } - - c, err := Open(dir) - if err != nil { - log.Fatalf("failed to initialize build cache at %s: %s\n", dir, err) - } - defaultCache = c -} - -var ( - defaultDirOnce sync.Once - defaultDir string - defaultDirErr error -) - -// DefaultDir returns the effective STATICCHECK_CACHE setting. -func DefaultDir() string { - // Save the result of the first call to DefaultDir for later use in - // initDefaultCache. cmd/go/main.go explicitly sets GOCACHE so that - // subprocesses will inherit it, but that means initDefaultCache can't - // otherwise distinguish between an explicit "off" and a UserCacheDir error. - - defaultDirOnce.Do(func() { - defaultDir = os.Getenv("STATICCHECK_CACHE") - if filepath.IsAbs(defaultDir) { - return - } - if defaultDir != "" { - defaultDirErr = fmt.Errorf("STATICCHECK_CACHE is not an absolute path") - return - } - - // Compute default location. - dir, err := os.UserCacheDir() - if err != nil { - defaultDirErr = fmt.Errorf("STATICCHECK_CACHE is not defined and %v", err) - return - } - defaultDir = filepath.Join(dir, "staticcheck") - }) - - return defaultDir -} diff --git a/vendor/honnef.co/go/tools/internal/cache/hash.go b/vendor/honnef.co/go/tools/internal/cache/hash.go deleted file mode 100644 index a53543ec501..00000000000 --- a/vendor/honnef.co/go/tools/internal/cache/hash.go +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package cache - -import ( - "bytes" - "crypto/sha256" - "fmt" - "hash" - "io" - "os" - "sync" -) - -var debugHash = false // set when GODEBUG=gocachehash=1 - -// HashSize is the number of bytes in a hash. -const HashSize = 32 - -// A Hash provides access to the canonical hash function used to index the cache. -// The current implementation uses salted SHA256, but clients must not assume this. -type Hash struct { - h hash.Hash - name string // for debugging - buf *bytes.Buffer // for verify -} - -// hashSalt is a salt string added to the beginning of every hash -// created by NewHash. Using the Staticcheck version makes sure that different -// versions of the command do not address the same cache -// entries, so that a bug in one version does not affect the execution -// of other versions. This salt will result in additional ActionID files -// in the cache, but not additional copies of the large output files, -// which are still addressed by unsalted SHA256. -var hashSalt []byte - -func SetSalt(b []byte) { - hashSalt = b -} - -// Subkey returns an action ID corresponding to mixing a parent -// action ID with a string description of the subkey. -func Subkey(parent ActionID, desc string) ActionID { - h := sha256.New() - h.Write([]byte("subkey:")) - h.Write(parent[:]) - h.Write([]byte(desc)) - var out ActionID - h.Sum(out[:0]) - if debugHash { - fmt.Fprintf(os.Stderr, "HASH subkey %x %q = %x\n", parent, desc, out) - } - if verify { - hashDebug.Lock() - hashDebug.m[out] = fmt.Sprintf("subkey %x %q", parent, desc) - hashDebug.Unlock() - } - return out -} - -// NewHash returns a new Hash. -// The caller is expected to Write data to it and then call Sum. -func NewHash(name string) *Hash { - h := &Hash{h: sha256.New(), name: name} - if debugHash { - fmt.Fprintf(os.Stderr, "HASH[%s]\n", h.name) - } - h.Write(hashSalt) - if verify { - h.buf = new(bytes.Buffer) - } - return h -} - -// Write writes data to the running hash. -func (h *Hash) Write(b []byte) (int, error) { - if debugHash { - fmt.Fprintf(os.Stderr, "HASH[%s]: %q\n", h.name, b) - } - if h.buf != nil { - h.buf.Write(b) - } - return h.h.Write(b) -} - -// Sum returns the hash of the data written previously. -func (h *Hash) Sum() [HashSize]byte { - var out [HashSize]byte - h.h.Sum(out[:0]) - if debugHash { - fmt.Fprintf(os.Stderr, "HASH[%s]: %x\n", h.name, out) - } - if h.buf != nil { - hashDebug.Lock() - if hashDebug.m == nil { - hashDebug.m = make(map[[HashSize]byte]string) - } - hashDebug.m[out] = h.buf.String() - hashDebug.Unlock() - } - return out -} - -// In GODEBUG=gocacheverify=1 mode, -// hashDebug holds the input to every computed hash ID, -// so that we can work backward from the ID involved in a -// cache entry mismatch to a description of what should be there. -var hashDebug struct { - sync.Mutex - m map[[HashSize]byte]string -} - -// reverseHash returns the input used to compute the hash id. -func reverseHash(id [HashSize]byte) string { - hashDebug.Lock() - s := hashDebug.m[id] - hashDebug.Unlock() - return s -} - -var hashFileCache struct { - sync.Mutex - m map[string][HashSize]byte -} - -// FileHash returns the hash of the named file. -// It caches repeated lookups for a given file, -// and the cache entry for a file can be initialized -// using SetFileHash. -// The hash used by FileHash is not the same as -// the hash used by NewHash. -func FileHash(file string) ([HashSize]byte, error) { - hashFileCache.Lock() - out, ok := hashFileCache.m[file] - hashFileCache.Unlock() - - if ok { - return out, nil - } - - h := sha256.New() - f, err := os.Open(file) - if err != nil { - if debugHash { - fmt.Fprintf(os.Stderr, "HASH %s: %v\n", file, err) - } - return [HashSize]byte{}, err - } - _, err = io.Copy(h, f) - f.Close() - if err != nil { - if debugHash { - fmt.Fprintf(os.Stderr, "HASH %s: %v\n", file, err) - } - return [HashSize]byte{}, err - } - h.Sum(out[:0]) - if debugHash { - fmt.Fprintf(os.Stderr, "HASH %s: %x\n", file, out) - } - - SetFileHash(file, out) - return out, nil -} - -// SetFileHash sets the hash returned by FileHash for file. -func SetFileHash(file string, sum [HashSize]byte) { - hashFileCache.Lock() - if hashFileCache.m == nil { - hashFileCache.m = make(map[string][HashSize]byte) - } - hashFileCache.m[file] = sum - hashFileCache.Unlock() -} diff --git a/vendor/honnef.co/go/tools/internal/passes/buildssa/BUILD b/vendor/honnef.co/go/tools/internal/passes/buildssa/BUILD deleted file mode 100644 index 132f8d3cdb9..00000000000 --- a/vendor/honnef.co/go/tools/internal/passes/buildssa/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["buildssa.go"], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/internal/passes/buildssa", - importpath = "honnef.co/go/tools/internal/passes/buildssa", - visibility = ["//vendor/honnef.co/go/tools:__subpackages__"], - deps = [ - "//vendor/golang.org/x/tools/go/analysis:go_default_library", - "//vendor/honnef.co/go/tools/ssa:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/internal/passes/buildssa/buildssa.go b/vendor/honnef.co/go/tools/internal/passes/buildssa/buildssa.go deleted file mode 100644 index fde918d1213..00000000000 --- a/vendor/honnef.co/go/tools/internal/passes/buildssa/buildssa.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package buildssa defines an Analyzer that constructs the SSA -// representation of an error-free package and returns the set of all -// functions within it. It does not report any diagnostics itself but -// may be used as an input to other analyzers. -// -// THIS INTERFACE IS EXPERIMENTAL AND MAY BE SUBJECT TO INCOMPATIBLE CHANGE. -package buildssa - -import ( - "go/ast" - "go/types" - "reflect" - - "golang.org/x/tools/go/analysis" - "honnef.co/go/tools/ssa" -) - -var Analyzer = &analysis.Analyzer{ - Name: "buildssa", - Doc: "build SSA-form IR for later passes", - Run: run, - ResultType: reflect.TypeOf(new(SSA)), -} - -// SSA provides SSA-form intermediate representation for all the -// non-blank source functions in the current package. -type SSA struct { - Pkg *ssa.Package - SrcFuncs []*ssa.Function -} - -func run(pass *analysis.Pass) (interface{}, error) { - // Plundered from ssautil.BuildPackage. - - // We must create a new Program for each Package because the - // analysis API provides no place to hang a Program shared by - // all Packages. Consequently, SSA Packages and Functions do not - // have a canonical representation across an analysis session of - // multiple packages. This is unlikely to be a problem in - // practice because the analysis API essentially forces all - // packages to be analysed independently, so any given call to - // Analysis.Run on a package will see only SSA objects belonging - // to a single Program. - - mode := ssa.GlobalDebug - - prog := ssa.NewProgram(pass.Fset, mode) - - // Create SSA packages for all imports. - // Order is not significant. - created := make(map[*types.Package]bool) - var createAll func(pkgs []*types.Package) - createAll = func(pkgs []*types.Package) { - for _, p := range pkgs { - if !created[p] { - created[p] = true - prog.CreatePackage(p, nil, nil, true) - createAll(p.Imports()) - } - } - } - createAll(pass.Pkg.Imports()) - - // Create and build the primary package. - ssapkg := prog.CreatePackage(pass.Pkg, pass.Files, pass.TypesInfo, false) - ssapkg.Build() - - // Compute list of source functions, including literals, - // in source order. - var funcs []*ssa.Function - var addAnons func(f *ssa.Function) - addAnons = func(f *ssa.Function) { - funcs = append(funcs, f) - for _, anon := range f.AnonFuncs { - addAnons(anon) - } - } - addAnons(ssapkg.Members["init"].(*ssa.Function)) - for _, f := range pass.Files { - for _, decl := range f.Decls { - if fdecl, ok := decl.(*ast.FuncDecl); ok { - - // SSA will not build a Function - // for a FuncDecl named blank. - // That's arguably too strict but - // relaxing it would break uniqueness of - // names of package members. - if fdecl.Name.Name == "_" { - continue - } - - // (init functions have distinct Func - // objects named "init" and distinct - // ssa.Functions named "init#1", ...) - - fn := pass.TypesInfo.Defs[fdecl.Name].(*types.Func) - if fn == nil { - panic(fn) - } - - f := ssapkg.Prog.FuncValue(fn) - if f == nil { - panic(fn) - } - - addAnons(f) - } - } - } - - return &SSA{Pkg: ssapkg, SrcFuncs: funcs}, nil -} diff --git a/vendor/honnef.co/go/tools/internal/renameio/BUILD b/vendor/honnef.co/go/tools/internal/renameio/BUILD deleted file mode 100644 index fcbb09a6e90..00000000000 --- a/vendor/honnef.co/go/tools/internal/renameio/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["renameio.go"], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/internal/renameio", - importpath = "honnef.co/go/tools/internal/renameio", - visibility = ["//vendor/honnef.co/go/tools:__subpackages__"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/internal/renameio/renameio.go b/vendor/honnef.co/go/tools/internal/renameio/renameio.go deleted file mode 100644 index 3f3f1708fa4..00000000000 --- a/vendor/honnef.co/go/tools/internal/renameio/renameio.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package renameio writes files atomically by renaming temporary files. -package renameio - -import ( - "bytes" - "io" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "strings" - "time" -) - -const patternSuffix = "*.tmp" - -// Pattern returns a glob pattern that matches the unrenamed temporary files -// created when writing to filename. -func Pattern(filename string) string { - return filepath.Join(filepath.Dir(filename), filepath.Base(filename)+patternSuffix) -} - -// WriteFile is like ioutil.WriteFile, but first writes data to an arbitrary -// file in the same directory as filename, then renames it atomically to the -// final name. -// -// That ensures that the final location, if it exists, is always a complete file. -func WriteFile(filename string, data []byte) (err error) { - return WriteToFile(filename, bytes.NewReader(data)) -} - -// WriteToFile is a variant of WriteFile that accepts the data as an io.Reader -// instead of a slice. -func WriteToFile(filename string, data io.Reader) (err error) { - f, err := ioutil.TempFile(filepath.Dir(filename), filepath.Base(filename)+patternSuffix) - if err != nil { - return err - } - defer func() { - // Only call os.Remove on f.Name() if we failed to rename it: otherwise, - // some other process may have created a new file with the same name after - // that. - if err != nil { - f.Close() - os.Remove(f.Name()) - } - }() - - if _, err := io.Copy(f, data); err != nil { - return err - } - // Sync the file before renaming it: otherwise, after a crash the reader may - // observe a 0-length file instead of the actual contents. - // See https://golang.org/issue/22397#issuecomment-380831736. - if err := f.Sync(); err != nil { - return err - } - if err := f.Close(); err != nil { - return err - } - - var start time.Time - for { - err := os.Rename(f.Name(), filename) - if err == nil || runtime.GOOS != "windows" || !strings.HasSuffix(err.Error(), "Access is denied.") { - return err - } - - // Windows seems to occasionally trigger spurious "Access is denied" errors - // here (see golang.org/issue/31247). We're not sure why. It's probably - // worth a little extra latency to avoid propagating the spurious errors. - if start.IsZero() { - start = time.Now() - } else if time.Since(start) >= 500*time.Millisecond { - return err - } - time.Sleep(5 * time.Millisecond) - } -} diff --git a/vendor/honnef.co/go/tools/internal/sharedcheck/BUILD b/vendor/honnef.co/go/tools/internal/sharedcheck/BUILD deleted file mode 100644 index 65799388727..00000000000 --- a/vendor/honnef.co/go/tools/internal/sharedcheck/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["lint.go"], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/internal/sharedcheck", - importpath = "honnef.co/go/tools/internal/sharedcheck", - visibility = ["//vendor/honnef.co/go/tools:__subpackages__"], - deps = [ - "//vendor/golang.org/x/tools/go/analysis:go_default_library", - "//vendor/honnef.co/go/tools/internal/passes/buildssa:go_default_library", - "//vendor/honnef.co/go/tools/lint/lintdsl:go_default_library", - "//vendor/honnef.co/go/tools/ssa:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/internal/sharedcheck/lint.go b/vendor/honnef.co/go/tools/internal/sharedcheck/lint.go deleted file mode 100644 index affee660726..00000000000 --- a/vendor/honnef.co/go/tools/internal/sharedcheck/lint.go +++ /dev/null @@ -1,70 +0,0 @@ -package sharedcheck - -import ( - "go/ast" - "go/types" - - "golang.org/x/tools/go/analysis" - "honnef.co/go/tools/internal/passes/buildssa" - . "honnef.co/go/tools/lint/lintdsl" - "honnef.co/go/tools/ssa" -) - -func CheckRangeStringRunes(pass *analysis.Pass) (interface{}, error) { - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - fn := func(node ast.Node) bool { - rng, ok := node.(*ast.RangeStmt) - if !ok || !IsBlank(rng.Key) { - return true - } - - v, _ := ssafn.ValueForExpr(rng.X) - - // Check that we're converting from string to []rune - val, _ := v.(*ssa.Convert) - if val == nil { - return true - } - Tsrc, ok := val.X.Type().(*types.Basic) - if !ok || Tsrc.Kind() != types.String { - return true - } - Tdst, ok := val.Type().(*types.Slice) - if !ok { - return true - } - TdstElem, ok := Tdst.Elem().(*types.Basic) - if !ok || TdstElem.Kind() != types.Int32 { - return true - } - - // Check that the result of the conversion is only used to - // range over - refs := val.Referrers() - if refs == nil { - return true - } - - // Expect two refs: one for obtaining the length of the slice, - // one for accessing the elements - if len(FilterDebug(*refs)) != 2 { - // TODO(dh): right now, we check that only one place - // refers to our slice. This will miss cases such as - // ranging over the slice twice. Ideally, we'd ensure that - // the slice is only used for ranging over (without - // accessing the key), but that is harder to do because in - // SSA form, ranging over a slice looks like an ordinary - // loop with index increments and slice accesses. We'd - // have to look at the associated AST node to check that - // it's a range statement. - return true - } - - pass.Reportf(rng.Pos(), "should range over string, not []rune(string)") - - return true - } - Inspect(ssafn.Syntax(), fn) - } - return nil, nil -} diff --git a/vendor/honnef.co/go/tools/lint/BUILD b/vendor/honnef.co/go/tools/lint/BUILD deleted file mode 100644 index dee4214638a..00000000000 --- a/vendor/honnef.co/go/tools/lint/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "lint.go", - "runner.go", - "stats.go", - ], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/lint", - importpath = "honnef.co/go/tools/lint", - visibility = ["//visibility:public"], - deps = [ - "//vendor/golang.org/x/tools/go/analysis:go_default_library", - "//vendor/golang.org/x/tools/go/packages:go_default_library", - "//vendor/golang.org/x/tools/go/types/objectpath:go_default_library", - "//vendor/honnef.co/go/tools/config:go_default_library", - "//vendor/honnef.co/go/tools/facts:go_default_library", - "//vendor/honnef.co/go/tools/internal/cache:go_default_library", - "//vendor/honnef.co/go/tools/loader:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//vendor/honnef.co/go/tools/lint/lintdsl:all-srcs", - "//vendor/honnef.co/go/tools/lint/lintutil:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/lint/LICENSE b/vendor/honnef.co/go/tools/lint/LICENSE deleted file mode 100644 index 796130a123a..00000000000 --- a/vendor/honnef.co/go/tools/lint/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2013 The Go Authors. All rights reserved. -Copyright (c) 2016 Dominik Honnef. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/honnef.co/go/tools/lint/lint.go b/vendor/honnef.co/go/tools/lint/lint.go deleted file mode 100644 index de5a8f1288d..00000000000 --- a/vendor/honnef.co/go/tools/lint/lint.go +++ /dev/null @@ -1,491 +0,0 @@ -// Package lint provides the foundation for tools like staticcheck -package lint // import "honnef.co/go/tools/lint" - -import ( - "bytes" - "fmt" - "go/scanner" - "go/token" - "go/types" - "path/filepath" - "sort" - "strings" - "sync" - "sync/atomic" - "unicode" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/packages" - "honnef.co/go/tools/config" -) - -type Documentation struct { - Title string - Text string - Since string - NonDefault bool - Options []string -} - -func (doc *Documentation) String() string { - b := &strings.Builder{} - fmt.Fprintf(b, "%s\n\n", doc.Title) - if doc.Text != "" { - fmt.Fprintf(b, "%s\n\n", doc.Text) - } - fmt.Fprint(b, "Available since\n ") - if doc.Since == "" { - fmt.Fprint(b, "unreleased") - } else { - fmt.Fprintf(b, "%s", doc.Since) - } - if doc.NonDefault { - fmt.Fprint(b, ", non-default") - } - fmt.Fprint(b, "\n") - if len(doc.Options) > 0 { - fmt.Fprintf(b, "\nOptions\n") - for _, opt := range doc.Options { - fmt.Fprintf(b, " %s", opt) - } - fmt.Fprint(b, "\n") - } - return b.String() -} - -type Ignore interface { - Match(p Problem) bool -} - -type LineIgnore struct { - File string - Line int - Checks []string - Matched bool - Pos token.Pos -} - -func (li *LineIgnore) Match(p Problem) bool { - pos := p.Pos - if pos.Filename != li.File || pos.Line != li.Line { - return false - } - for _, c := range li.Checks { - if m, _ := filepath.Match(c, p.Check); m { - li.Matched = true - return true - } - } - return false -} - -func (li *LineIgnore) String() string { - matched := "not matched" - if li.Matched { - matched = "matched" - } - return fmt.Sprintf("%s:%d %s (%s)", li.File, li.Line, strings.Join(li.Checks, ", "), matched) -} - -type FileIgnore struct { - File string - Checks []string -} - -func (fi *FileIgnore) Match(p Problem) bool { - if p.Pos.Filename != fi.File { - return false - } - for _, c := range fi.Checks { - if m, _ := filepath.Match(c, p.Check); m { - return true - } - } - return false -} - -type Severity uint8 - -const ( - Error Severity = iota - Warning - Ignored -) - -// Problem represents a problem in some source code. -type Problem struct { - Pos token.Position - End token.Position - Message string - Check string - Severity Severity -} - -func (p *Problem) String() string { - return fmt.Sprintf("%s (%s)", p.Message, p.Check) -} - -// A Linter lints Go source code. -type Linter struct { - Checkers []*analysis.Analyzer - CumulativeCheckers []CumulativeChecker - GoVersion int - Config config.Config - Stats Stats -} - -type CumulativeChecker interface { - Analyzer() *analysis.Analyzer - Result() []types.Object - ProblemObject(*token.FileSet, types.Object) Problem -} - -func (l *Linter) Lint(cfg *packages.Config, patterns []string) ([]Problem, error) { - var allAnalyzers []*analysis.Analyzer - allAnalyzers = append(allAnalyzers, l.Checkers...) - for _, cum := range l.CumulativeCheckers { - allAnalyzers = append(allAnalyzers, cum.Analyzer()) - } - - // The -checks command line flag overrules all configuration - // files, which means that for `-checks="foo"`, no check other - // than foo can ever be reported to the user. Make use of this - // fact to cull the list of analyses we need to run. - - // replace "inherit" with "all", as we don't want to base the - // list of all checks on the default configuration, which - // disables certain checks. - checks := make([]string, len(l.Config.Checks)) - copy(checks, l.Config.Checks) - for i, c := range checks { - if c == "inherit" { - checks[i] = "all" - } - } - - allowed := FilterChecks(allAnalyzers, checks) - var allowedAnalyzers []*analysis.Analyzer - for _, c := range l.Checkers { - if allowed[c.Name] { - allowedAnalyzers = append(allowedAnalyzers, c) - } - } - hasCumulative := false - for _, cum := range l.CumulativeCheckers { - a := cum.Analyzer() - if allowed[a.Name] { - hasCumulative = true - allowedAnalyzers = append(allowedAnalyzers, a) - } - } - - r, err := NewRunner(&l.Stats) - if err != nil { - return nil, err - } - r.goVersion = l.GoVersion - - pkgs, err := r.Run(cfg, patterns, allowedAnalyzers, hasCumulative) - if err != nil { - return nil, err - } - - tpkgToPkg := map[*types.Package]*Package{} - for _, pkg := range pkgs { - tpkgToPkg[pkg.Types] = pkg - - for _, e := range pkg.errs { - switch e := e.(type) { - case types.Error: - p := Problem{ - Pos: e.Fset.PositionFor(e.Pos, false), - Message: e.Msg, - Severity: Error, - Check: "compile", - } - pkg.problems = append(pkg.problems, p) - case packages.Error: - msg := e.Msg - if len(msg) != 0 && msg[0] == '\n' { - // TODO(dh): See https://github.com/golang/go/issues/32363 - msg = msg[1:] - } - - var pos token.Position - if e.Pos == "" { - // Under certain conditions (malformed package - // declarations, multiple packages in the same - // directory), go list emits an error on stderr - // instead of JSON. Those errors do not have - // associated position information in - // go/packages.Error, even though the output on - // stderr may contain it. - if p, n, err := parsePos(msg); err == nil { - if abs, err := filepath.Abs(p.Filename); err == nil { - p.Filename = abs - } - pos = p - msg = msg[n+2:] - } - } else { - var err error - pos, _, err = parsePos(e.Pos) - if err != nil { - panic(fmt.Sprintf("internal error: %s", e)) - } - } - p := Problem{ - Pos: pos, - Message: msg, - Severity: Error, - Check: "compile", - } - pkg.problems = append(pkg.problems, p) - case scanner.ErrorList: - for _, e := range e { - p := Problem{ - Pos: e.Pos, - Message: e.Msg, - Severity: Error, - Check: "compile", - } - pkg.problems = append(pkg.problems, p) - } - case error: - p := Problem{ - Pos: token.Position{}, - Message: e.Error(), - Severity: Error, - Check: "compile", - } - pkg.problems = append(pkg.problems, p) - } - } - } - - atomic.StoreUint32(&r.stats.State, StateCumulative) - var problems []Problem - for _, cum := range l.CumulativeCheckers { - for _, res := range cum.Result() { - pkg := tpkgToPkg[res.Pkg()] - allowedChecks := FilterChecks(allowedAnalyzers, pkg.cfg.Merge(l.Config).Checks) - if allowedChecks[cum.Analyzer().Name] { - pos := DisplayPosition(pkg.Fset, res.Pos()) - // FIXME(dh): why are we ignoring generated files - // here? Surely this is specific to 'unused', not all - // cumulative checkers - if _, ok := pkg.gen[pos.Filename]; ok { - continue - } - p := cum.ProblemObject(pkg.Fset, res) - problems = append(problems, p) - } - } - } - - for _, pkg := range pkgs { - for _, ig := range pkg.ignores { - for i := range pkg.problems { - p := &pkg.problems[i] - if ig.Match(*p) { - p.Severity = Ignored - } - } - for i := range problems { - p := &problems[i] - if ig.Match(*p) { - p.Severity = Ignored - } - } - } - - if pkg.cfg == nil { - // The package failed to load, otherwise we would have a - // valid config. Pass through all errors. - problems = append(problems, pkg.problems...) - } else { - for _, p := range pkg.problems { - allowedChecks := FilterChecks(allowedAnalyzers, pkg.cfg.Merge(l.Config).Checks) - allowedChecks["compile"] = true - if allowedChecks[p.Check] { - problems = append(problems, p) - } - } - } - - for _, ig := range pkg.ignores { - ig, ok := ig.(*LineIgnore) - if !ok { - continue - } - if ig.Matched { - continue - } - - couldveMatched := false - allowedChecks := FilterChecks(allowedAnalyzers, pkg.cfg.Merge(l.Config).Checks) - for _, c := range ig.Checks { - if !allowedChecks[c] { - continue - } - couldveMatched = true - break - } - - if !couldveMatched { - // The ignored checks were disabled for the containing package. - // Don't flag the ignore for not having matched. - continue - } - p := Problem{ - Pos: DisplayPosition(pkg.Fset, ig.Pos), - Message: "this linter directive didn't match anything; should it be removed?", - Check: "", - } - problems = append(problems, p) - } - } - - if len(problems) == 0 { - return nil, nil - } - - sort.Slice(problems, func(i, j int) bool { - pi := problems[i].Pos - pj := problems[j].Pos - - if pi.Filename != pj.Filename { - return pi.Filename < pj.Filename - } - if pi.Line != pj.Line { - return pi.Line < pj.Line - } - if pi.Column != pj.Column { - return pi.Column < pj.Column - } - - return problems[i].Message < problems[j].Message - }) - - var out []Problem - out = append(out, problems[0]) - for i, p := range problems[1:] { - // We may encounter duplicate problems because one file - // can be part of many packages. - if problems[i] != p { - out = append(out, p) - } - } - return out, nil -} - -func FilterChecks(allChecks []*analysis.Analyzer, checks []string) map[string]bool { - // OPT(dh): this entire computation could be cached per package - allowedChecks := map[string]bool{} - - for _, check := range checks { - b := true - if len(check) > 1 && check[0] == '-' { - b = false - check = check[1:] - } - if check == "*" || check == "all" { - // Match all - for _, c := range allChecks { - allowedChecks[c.Name] = b - } - } else if strings.HasSuffix(check, "*") { - // Glob - prefix := check[:len(check)-1] - isCat := strings.IndexFunc(prefix, func(r rune) bool { return unicode.IsNumber(r) }) == -1 - - for _, c := range allChecks { - idx := strings.IndexFunc(c.Name, func(r rune) bool { return unicode.IsNumber(r) }) - if isCat { - // Glob is S*, which should match S1000 but not SA1000 - cat := c.Name[:idx] - if prefix == cat { - allowedChecks[c.Name] = b - } - } else { - // Glob is S1* - if strings.HasPrefix(c.Name, prefix) { - allowedChecks[c.Name] = b - } - } - } - } else { - // Literal check name - allowedChecks[check] = b - } - } - return allowedChecks -} - -type Positioner interface { - Pos() token.Pos -} - -func DisplayPosition(fset *token.FileSet, p token.Pos) token.Position { - if p == token.NoPos { - return token.Position{} - } - - // Only use the adjusted position if it points to another Go file. - // This means we'll point to the original file for cgo files, but - // we won't point to a YACC grammar file. - pos := fset.PositionFor(p, false) - adjPos := fset.PositionFor(p, true) - - if filepath.Ext(adjPos.Filename) == ".go" { - return adjPos - } - return pos -} - -var bufferPool = &sync.Pool{ - New: func() interface{} { - buf := bytes.NewBuffer(nil) - buf.Grow(64) - return buf - }, -} - -func FuncName(f *types.Func) string { - buf := bufferPool.Get().(*bytes.Buffer) - buf.Reset() - if f.Type() != nil { - sig := f.Type().(*types.Signature) - if recv := sig.Recv(); recv != nil { - buf.WriteByte('(') - if _, ok := recv.Type().(*types.Interface); ok { - // gcimporter creates abstract methods of - // named interfaces using the interface type - // (not the named type) as the receiver. - // Don't print it in full. - buf.WriteString("interface") - } else { - types.WriteType(buf, recv.Type(), nil) - } - buf.WriteByte(')') - buf.WriteByte('.') - } else if f.Pkg() != nil { - writePackage(buf, f.Pkg()) - } - } - buf.WriteString(f.Name()) - s := buf.String() - bufferPool.Put(buf) - return s -} - -func writePackage(buf *bytes.Buffer, pkg *types.Package) { - if pkg == nil { - return - } - s := pkg.Path() - if s != "" { - buf.WriteString(s) - buf.WriteByte('.') - } -} diff --git a/vendor/honnef.co/go/tools/lint/lintdsl/BUILD b/vendor/honnef.co/go/tools/lint/lintdsl/BUILD deleted file mode 100644 index 81f47dd342b..00000000000 --- a/vendor/honnef.co/go/tools/lint/lintdsl/BUILD +++ /dev/null @@ -1,29 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["lintdsl.go"], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/lint/lintdsl", - importpath = "honnef.co/go/tools/lint/lintdsl", - visibility = ["//visibility:public"], - deps = [ - "//vendor/golang.org/x/tools/go/analysis:go_default_library", - "//vendor/honnef.co/go/tools/facts:go_default_library", - "//vendor/honnef.co/go/tools/lint:go_default_library", - "//vendor/honnef.co/go/tools/ssa:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/lint/lintdsl/lintdsl.go b/vendor/honnef.co/go/tools/lint/lintdsl/lintdsl.go deleted file mode 100644 index 3b939e95f2f..00000000000 --- a/vendor/honnef.co/go/tools/lint/lintdsl/lintdsl.go +++ /dev/null @@ -1,400 +0,0 @@ -// Package lintdsl provides helpers for implementing static analysis -// checks. Dot-importing this package is encouraged. -package lintdsl - -import ( - "bytes" - "flag" - "fmt" - "go/ast" - "go/constant" - "go/printer" - "go/token" - "go/types" - "strings" - - "golang.org/x/tools/go/analysis" - "honnef.co/go/tools/facts" - "honnef.co/go/tools/lint" - "honnef.co/go/tools/ssa" -) - -type packager interface { - Package() *ssa.Package -} - -func CallName(call *ssa.CallCommon) string { - if call.IsInvoke() { - return "" - } - switch v := call.Value.(type) { - case *ssa.Function: - fn, ok := v.Object().(*types.Func) - if !ok { - return "" - } - return lint.FuncName(fn) - case *ssa.Builtin: - return v.Name() - } - return "" -} - -func IsCallTo(call *ssa.CallCommon, name string) bool { return CallName(call) == name } -func IsType(T types.Type, name string) bool { return types.TypeString(T, nil) == name } - -func FilterDebug(instr []ssa.Instruction) []ssa.Instruction { - var out []ssa.Instruction - for _, ins := range instr { - if _, ok := ins.(*ssa.DebugRef); !ok { - out = append(out, ins) - } - } - return out -} - -func IsExample(fn *ssa.Function) bool { - if !strings.HasPrefix(fn.Name(), "Example") { - return false - } - f := fn.Prog.Fset.File(fn.Pos()) - if f == nil { - return false - } - return strings.HasSuffix(f.Name(), "_test.go") -} - -func IsPointerLike(T types.Type) bool { - switch T := T.Underlying().(type) { - case *types.Interface, *types.Chan, *types.Map, *types.Signature, *types.Pointer: - return true - case *types.Basic: - return T.Kind() == types.UnsafePointer - } - return false -} - -func IsIdent(expr ast.Expr, ident string) bool { - id, ok := expr.(*ast.Ident) - return ok && id.Name == ident -} - -// isBlank returns whether id is the blank identifier "_". -// If id == nil, the answer is false. -func IsBlank(id ast.Expr) bool { - ident, _ := id.(*ast.Ident) - return ident != nil && ident.Name == "_" -} - -func IsIntLiteral(expr ast.Expr, literal string) bool { - lit, ok := expr.(*ast.BasicLit) - return ok && lit.Kind == token.INT && lit.Value == literal -} - -// Deprecated: use IsIntLiteral instead -func IsZero(expr ast.Expr) bool { - return IsIntLiteral(expr, "0") -} - -func IsOfType(pass *analysis.Pass, expr ast.Expr, name string) bool { - return IsType(pass.TypesInfo.TypeOf(expr), name) -} - -func IsInTest(pass *analysis.Pass, node lint.Positioner) bool { - // FIXME(dh): this doesn't work for global variables with - // initializers - f := pass.Fset.File(node.Pos()) - return f != nil && strings.HasSuffix(f.Name(), "_test.go") -} - -func IsInMain(pass *analysis.Pass, node lint.Positioner) bool { - if node, ok := node.(packager); ok { - return node.Package().Pkg.Name() == "main" - } - return pass.Pkg.Name() == "main" -} - -func SelectorName(pass *analysis.Pass, expr *ast.SelectorExpr) string { - info := pass.TypesInfo - sel := info.Selections[expr] - if sel == nil { - if x, ok := expr.X.(*ast.Ident); ok { - pkg, ok := info.ObjectOf(x).(*types.PkgName) - if !ok { - // This shouldn't happen - return fmt.Sprintf("%s.%s", x.Name, expr.Sel.Name) - } - return fmt.Sprintf("%s.%s", pkg.Imported().Path(), expr.Sel.Name) - } - panic(fmt.Sprintf("unsupported selector: %v", expr)) - } - return fmt.Sprintf("(%s).%s", sel.Recv(), sel.Obj().Name()) -} - -func IsNil(pass *analysis.Pass, expr ast.Expr) bool { - return pass.TypesInfo.Types[expr].IsNil() -} - -func BoolConst(pass *analysis.Pass, expr ast.Expr) bool { - val := pass.TypesInfo.ObjectOf(expr.(*ast.Ident)).(*types.Const).Val() - return constant.BoolVal(val) -} - -func IsBoolConst(pass *analysis.Pass, expr ast.Expr) bool { - // We explicitly don't support typed bools because more often than - // not, custom bool types are used as binary enums and the - // explicit comparison is desired. - - ident, ok := expr.(*ast.Ident) - if !ok { - return false - } - obj := pass.TypesInfo.ObjectOf(ident) - c, ok := obj.(*types.Const) - if !ok { - return false - } - basic, ok := c.Type().(*types.Basic) - if !ok { - return false - } - if basic.Kind() != types.UntypedBool && basic.Kind() != types.Bool { - return false - } - return true -} - -func ExprToInt(pass *analysis.Pass, expr ast.Expr) (int64, bool) { - tv := pass.TypesInfo.Types[expr] - if tv.Value == nil { - return 0, false - } - if tv.Value.Kind() != constant.Int { - return 0, false - } - return constant.Int64Val(tv.Value) -} - -func ExprToString(pass *analysis.Pass, expr ast.Expr) (string, bool) { - val := pass.TypesInfo.Types[expr].Value - if val == nil { - return "", false - } - if val.Kind() != constant.String { - return "", false - } - return constant.StringVal(val), true -} - -// Dereference returns a pointer's element type; otherwise it returns -// T. -func Dereference(T types.Type) types.Type { - if p, ok := T.Underlying().(*types.Pointer); ok { - return p.Elem() - } - return T -} - -// DereferenceR returns a pointer's element type; otherwise it returns -// T. If the element type is itself a pointer, DereferenceR will be -// applied recursively. -func DereferenceR(T types.Type) types.Type { - if p, ok := T.Underlying().(*types.Pointer); ok { - return DereferenceR(p.Elem()) - } - return T -} - -func IsGoVersion(pass *analysis.Pass, minor int) bool { - version := pass.Analyzer.Flags.Lookup("go").Value.(flag.Getter).Get().(int) - return version >= minor -} - -func CallNameAST(pass *analysis.Pass, call *ast.CallExpr) string { - switch fun := call.Fun.(type) { - case *ast.SelectorExpr: - fn, ok := pass.TypesInfo.ObjectOf(fun.Sel).(*types.Func) - if !ok { - return "" - } - return lint.FuncName(fn) - case *ast.Ident: - obj := pass.TypesInfo.ObjectOf(fun) - switch obj := obj.(type) { - case *types.Func: - return lint.FuncName(obj) - case *types.Builtin: - return obj.Name() - default: - return "" - } - default: - return "" - } -} - -func IsCallToAST(pass *analysis.Pass, node ast.Node, name string) bool { - call, ok := node.(*ast.CallExpr) - if !ok { - return false - } - return CallNameAST(pass, call) == name -} - -func IsCallToAnyAST(pass *analysis.Pass, node ast.Node, names ...string) bool { - for _, name := range names { - if IsCallToAST(pass, node, name) { - return true - } - } - return false -} - -func Render(pass *analysis.Pass, x interface{}) string { - var buf bytes.Buffer - if err := printer.Fprint(&buf, pass.Fset, x); err != nil { - panic(err) - } - return buf.String() -} - -func RenderArgs(pass *analysis.Pass, args []ast.Expr) string { - var ss []string - for _, arg := range args { - ss = append(ss, Render(pass, arg)) - } - return strings.Join(ss, ", ") -} - -func Preamble(f *ast.File) string { - cutoff := f.Package - if f.Doc != nil { - cutoff = f.Doc.Pos() - } - var out []string - for _, cmt := range f.Comments { - if cmt.Pos() >= cutoff { - break - } - out = append(out, cmt.Text()) - } - return strings.Join(out, "\n") -} - -func Inspect(node ast.Node, fn func(node ast.Node) bool) { - if node == nil { - return - } - ast.Inspect(node, fn) -} - -func GroupSpecs(fset *token.FileSet, specs []ast.Spec) [][]ast.Spec { - if len(specs) == 0 { - return nil - } - groups := make([][]ast.Spec, 1) - groups[0] = append(groups[0], specs[0]) - - for _, spec := range specs[1:] { - g := groups[len(groups)-1] - if fset.PositionFor(spec.Pos(), false).Line-1 != - fset.PositionFor(g[len(g)-1].End(), false).Line { - - groups = append(groups, nil) - } - - groups[len(groups)-1] = append(groups[len(groups)-1], spec) - } - - return groups -} - -func IsObject(obj types.Object, name string) bool { - var path string - if pkg := obj.Pkg(); pkg != nil { - path = pkg.Path() + "." - } - return path+obj.Name() == name -} - -type Field struct { - Var *types.Var - Tag string - Path []int -} - -// FlattenFields recursively flattens T and embedded structs, -// returning a list of fields. If multiple fields with the same name -// exist, all will be returned. -func FlattenFields(T *types.Struct) []Field { - return flattenFields(T, nil, nil) -} - -func flattenFields(T *types.Struct, path []int, seen map[types.Type]bool) []Field { - if seen == nil { - seen = map[types.Type]bool{} - } - if seen[T] { - return nil - } - seen[T] = true - var out []Field - for i := 0; i < T.NumFields(); i++ { - field := T.Field(i) - tag := T.Tag(i) - np := append(path[:len(path):len(path)], i) - if field.Anonymous() { - if s, ok := Dereference(field.Type()).Underlying().(*types.Struct); ok { - out = append(out, flattenFields(s, np, seen)...) - } - } else { - out = append(out, Field{field, tag, np}) - } - } - return out -} - -func File(pass *analysis.Pass, node lint.Positioner) *ast.File { - pass.Fset.PositionFor(node.Pos(), true) - m := pass.ResultOf[facts.TokenFile].(map[*token.File]*ast.File) - return m[pass.Fset.File(node.Pos())] -} - -// IsGenerated reports whether pos is in a generated file, It ignores -// //line directives. -func IsGenerated(pass *analysis.Pass, pos token.Pos) bool { - _, ok := Generator(pass, pos) - return ok -} - -// Generator returns the generator that generated the file containing -// pos. It ignores //line directives. -func Generator(pass *analysis.Pass, pos token.Pos) (facts.Generator, bool) { - file := pass.Fset.PositionFor(pos, false).Filename - m := pass.ResultOf[facts.Generated].(map[string]facts.Generator) - g, ok := m[file] - return g, ok -} - -func ReportfFG(pass *analysis.Pass, pos token.Pos, f string, args ...interface{}) { - file := lint.DisplayPosition(pass.Fset, pos).Filename - m := pass.ResultOf[facts.Generated].(map[string]facts.Generator) - if _, ok := m[file]; ok { - return - } - pass.Reportf(pos, f, args...) -} - -func ReportNodef(pass *analysis.Pass, node ast.Node, format string, args ...interface{}) { - msg := fmt.Sprintf(format, args...) - pass.Report(analysis.Diagnostic{Pos: node.Pos(), End: node.End(), Message: msg}) -} - -func ReportNodefFG(pass *analysis.Pass, node ast.Node, format string, args ...interface{}) { - file := lint.DisplayPosition(pass.Fset, node.Pos()).Filename - m := pass.ResultOf[facts.Generated].(map[string]facts.Generator) - if _, ok := m[file]; ok { - return - } - ReportNodef(pass, node, format, args...) -} diff --git a/vendor/honnef.co/go/tools/lint/lintutil/BUILD b/vendor/honnef.co/go/tools/lint/lintutil/BUILD deleted file mode 100644 index a33a03ab473..00000000000 --- a/vendor/honnef.co/go/tools/lint/lintutil/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "stats.go", - "stats_bsd.go", - "stats_posix.go", - "util.go", - ], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/lint/lintutil", - importpath = "honnef.co/go/tools/lint/lintutil", - visibility = ["//visibility:public"], - deps = [ - "//vendor/golang.org/x/tools/go/analysis:go_default_library", - "//vendor/golang.org/x/tools/go/buildutil:go_default_library", - "//vendor/golang.org/x/tools/go/packages:go_default_library", - "//vendor/honnef.co/go/tools/config:go_default_library", - "//vendor/honnef.co/go/tools/internal/cache:go_default_library", - "//vendor/honnef.co/go/tools/lint:go_default_library", - "//vendor/honnef.co/go/tools/lint/lintutil/format:go_default_library", - "//vendor/honnef.co/go/tools/version:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//vendor/honnef.co/go/tools/lint/lintutil/format:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/lint/lintutil/format/BUILD b/vendor/honnef.co/go/tools/lint/lintutil/format/BUILD deleted file mode 100644 index cde608e0acd..00000000000 --- a/vendor/honnef.co/go/tools/lint/lintutil/format/BUILD +++ /dev/null @@ -1,24 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["format.go"], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/lint/lintutil/format", - importpath = "honnef.co/go/tools/lint/lintutil/format", - visibility = ["//visibility:public"], - deps = ["//vendor/honnef.co/go/tools/lint:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/lint/lintutil/format/format.go b/vendor/honnef.co/go/tools/lint/lintutil/format/format.go deleted file mode 100644 index 9385431f88b..00000000000 --- a/vendor/honnef.co/go/tools/lint/lintutil/format/format.go +++ /dev/null @@ -1,135 +0,0 @@ -// Package format provides formatters for linter problems. -package format - -import ( - "encoding/json" - "fmt" - "go/token" - "io" - "os" - "path/filepath" - "text/tabwriter" - - "honnef.co/go/tools/lint" -) - -func shortPath(path string) string { - cwd, err := os.Getwd() - if err != nil { - return path - } - if rel, err := filepath.Rel(cwd, path); err == nil && len(rel) < len(path) { - return rel - } - return path -} - -func relativePositionString(pos token.Position) string { - s := shortPath(pos.Filename) - if pos.IsValid() { - if s != "" { - s += ":" - } - s += fmt.Sprintf("%d:%d", pos.Line, pos.Column) - } - if s == "" { - s = "-" - } - return s -} - -type Statter interface { - Stats(total, errors, warnings int) -} - -type Formatter interface { - Format(p lint.Problem) -} - -type Text struct { - W io.Writer -} - -func (o Text) Format(p lint.Problem) { - fmt.Fprintf(o.W, "%v: %s\n", relativePositionString(p.Pos), p.String()) -} - -type JSON struct { - W io.Writer -} - -func severity(s lint.Severity) string { - switch s { - case lint.Error: - return "error" - case lint.Warning: - return "warning" - case lint.Ignored: - return "ignored" - } - return "" -} - -func (o JSON) Format(p lint.Problem) { - type location struct { - File string `json:"file"` - Line int `json:"line"` - Column int `json:"column"` - } - jp := struct { - Code string `json:"code"` - Severity string `json:"severity,omitempty"` - Location location `json:"location"` - End location `json:"end"` - Message string `json:"message"` - }{ - Code: p.Check, - Severity: severity(p.Severity), - Location: location{ - File: p.Pos.Filename, - Line: p.Pos.Line, - Column: p.Pos.Column, - }, - End: location{ - File: p.End.Filename, - Line: p.End.Line, - Column: p.End.Column, - }, - Message: p.Message, - } - _ = json.NewEncoder(o.W).Encode(jp) -} - -type Stylish struct { - W io.Writer - - prevFile string - tw *tabwriter.Writer -} - -func (o *Stylish) Format(p lint.Problem) { - pos := p.Pos - if pos.Filename == "" { - pos.Filename = "-" - } - - if pos.Filename != o.prevFile { - if o.prevFile != "" { - o.tw.Flush() - fmt.Fprintln(o.W) - } - fmt.Fprintln(o.W, pos.Filename) - o.prevFile = pos.Filename - o.tw = tabwriter.NewWriter(o.W, 0, 4, 2, ' ', 0) - } - fmt.Fprintf(o.tw, " (%d, %d)\t%s\t%s\n", pos.Line, pos.Column, p.Check, p.Message) -} - -func (o *Stylish) Stats(total, errors, warnings int) { - if o.tw != nil { - o.tw.Flush() - fmt.Fprintln(o.W) - } - fmt.Fprintf(o.W, " ✖ %d problems (%d errors, %d warnings)\n", - total, errors, warnings) -} diff --git a/vendor/honnef.co/go/tools/lint/lintutil/stats.go b/vendor/honnef.co/go/tools/lint/lintutil/stats.go deleted file mode 100644 index ba8caf0afdd..00000000000 --- a/vendor/honnef.co/go/tools/lint/lintutil/stats.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build !aix,!android,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris - -package lintutil - -import "os" - -var infoSignals = []os.Signal{} diff --git a/vendor/honnef.co/go/tools/lint/lintutil/stats_bsd.go b/vendor/honnef.co/go/tools/lint/lintutil/stats_bsd.go deleted file mode 100644 index 3a62ede031c..00000000000 --- a/vendor/honnef.co/go/tools/lint/lintutil/stats_bsd.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build darwin dragonfly freebsd netbsd openbsd - -package lintutil - -import ( - "os" - "syscall" -) - -var infoSignals = []os.Signal{syscall.SIGINFO} diff --git a/vendor/honnef.co/go/tools/lint/lintutil/stats_posix.go b/vendor/honnef.co/go/tools/lint/lintutil/stats_posix.go deleted file mode 100644 index 53f21c666b1..00000000000 --- a/vendor/honnef.co/go/tools/lint/lintutil/stats_posix.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build aix android linux solaris - -package lintutil - -import ( - "os" - "syscall" -) - -var infoSignals = []os.Signal{syscall.SIGUSR1} diff --git a/vendor/honnef.co/go/tools/lint/lintutil/util.go b/vendor/honnef.co/go/tools/lint/lintutil/util.go deleted file mode 100644 index fe0279f921c..00000000000 --- a/vendor/honnef.co/go/tools/lint/lintutil/util.go +++ /dev/null @@ -1,392 +0,0 @@ -// Copyright (c) 2013 The Go Authors. All rights reserved. -// -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file or at -// https://developers.google.com/open-source/licenses/bsd. - -// Package lintutil provides helpers for writing linter command lines. -package lintutil // import "honnef.co/go/tools/lint/lintutil" - -import ( - "crypto/sha256" - "errors" - "flag" - "fmt" - "go/build" - "go/token" - "io" - "log" - "os" - "os/signal" - "regexp" - "runtime" - "runtime/pprof" - "strconv" - "strings" - "sync/atomic" - - "honnef.co/go/tools/config" - "honnef.co/go/tools/internal/cache" - "honnef.co/go/tools/lint" - "honnef.co/go/tools/lint/lintutil/format" - "honnef.co/go/tools/version" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/buildutil" - "golang.org/x/tools/go/packages" -) - -func NewVersionFlag() flag.Getter { - tags := build.Default.ReleaseTags - v := tags[len(tags)-1][2:] - version := new(VersionFlag) - if err := version.Set(v); err != nil { - panic(fmt.Sprintf("internal error: %s", err)) - } - return version -} - -type VersionFlag int - -func (v *VersionFlag) String() string { - return fmt.Sprintf("1.%d", *v) - -} - -func (v *VersionFlag) Set(s string) error { - if len(s) < 3 { - return errors.New("invalid Go version") - } - if s[0] != '1' { - return errors.New("invalid Go version") - } - if s[1] != '.' { - return errors.New("invalid Go version") - } - i, err := strconv.Atoi(s[2:]) - *v = VersionFlag(i) - return err -} - -func (v *VersionFlag) Get() interface{} { - return int(*v) -} - -func usage(name string, flags *flag.FlagSet) func() { - return func() { - fmt.Fprintf(os.Stderr, "Usage of %s:\n", name) - fmt.Fprintf(os.Stderr, "\t%s [flags] # runs on package in current directory\n", name) - fmt.Fprintf(os.Stderr, "\t%s [flags] packages\n", name) - fmt.Fprintf(os.Stderr, "\t%s [flags] directory\n", name) - fmt.Fprintf(os.Stderr, "\t%s [flags] files... # must be a single package\n", name) - fmt.Fprintf(os.Stderr, "Flags:\n") - flags.PrintDefaults() - } -} - -type list []string - -func (list *list) String() string { - return `"` + strings.Join(*list, ",") + `"` -} - -func (list *list) Set(s string) error { - if s == "" { - *list = nil - return nil - } - - *list = strings.Split(s, ",") - return nil -} - -func FlagSet(name string) *flag.FlagSet { - flags := flag.NewFlagSet("", flag.ExitOnError) - flags.Usage = usage(name, flags) - flags.String("tags", "", "List of `build tags`") - flags.Bool("tests", true, "Include tests") - flags.Bool("version", false, "Print version and exit") - flags.Bool("show-ignored", false, "Don't filter ignored problems") - flags.String("f", "text", "Output `format` (valid choices are 'stylish', 'text' and 'json')") - flags.String("explain", "", "Print description of `check`") - - flags.String("debug.cpuprofile", "", "Write CPU profile to `file`") - flags.String("debug.memprofile", "", "Write memory profile to `file`") - flags.Bool("debug.version", false, "Print detailed version information about this program") - flags.Bool("debug.no-compile-errors", false, "Don't print compile errors") - - checks := list{"inherit"} - fail := list{"all"} - flags.Var(&checks, "checks", "Comma-separated list of `checks` to enable.") - flags.Var(&fail, "fail", "Comma-separated list of `checks` that can cause a non-zero exit status.") - - tags := build.Default.ReleaseTags - v := tags[len(tags)-1][2:] - version := new(VersionFlag) - if err := version.Set(v); err != nil { - panic(fmt.Sprintf("internal error: %s", err)) - } - - flags.Var(version, "go", "Target Go `version` in the format '1.x'") - return flags -} - -func findCheck(cs []*analysis.Analyzer, check string) (*analysis.Analyzer, bool) { - for _, c := range cs { - if c.Name == check { - return c, true - } - } - return nil, false -} - -func ProcessFlagSet(cs []*analysis.Analyzer, cums []lint.CumulativeChecker, fs *flag.FlagSet) { - tags := fs.Lookup("tags").Value.(flag.Getter).Get().(string) - tests := fs.Lookup("tests").Value.(flag.Getter).Get().(bool) - goVersion := fs.Lookup("go").Value.(flag.Getter).Get().(int) - formatter := fs.Lookup("f").Value.(flag.Getter).Get().(string) - printVersion := fs.Lookup("version").Value.(flag.Getter).Get().(bool) - showIgnored := fs.Lookup("show-ignored").Value.(flag.Getter).Get().(bool) - explain := fs.Lookup("explain").Value.(flag.Getter).Get().(string) - - cpuProfile := fs.Lookup("debug.cpuprofile").Value.(flag.Getter).Get().(string) - memProfile := fs.Lookup("debug.memprofile").Value.(flag.Getter).Get().(string) - debugVersion := fs.Lookup("debug.version").Value.(flag.Getter).Get().(bool) - debugNoCompile := fs.Lookup("debug.no-compile-errors").Value.(flag.Getter).Get().(bool) - - cfg := config.Config{} - cfg.Checks = *fs.Lookup("checks").Value.(*list) - - exit := func(code int) { - if cpuProfile != "" { - pprof.StopCPUProfile() - } - if memProfile != "" { - f, err := os.Create(memProfile) - if err != nil { - panic(err) - } - runtime.GC() - pprof.WriteHeapProfile(f) - } - os.Exit(code) - } - if cpuProfile != "" { - f, err := os.Create(cpuProfile) - if err != nil { - log.Fatal(err) - } - pprof.StartCPUProfile(f) - } - - if debugVersion { - version.Verbose() - exit(0) - } - - if printVersion { - version.Print() - exit(0) - } - - // Validate that the tags argument is well-formed. go/packages - // doesn't detect malformed build flags and returns unhelpful - // errors. - tf := buildutil.TagsFlag{} - if err := tf.Set(tags); err != nil { - fmt.Fprintln(os.Stderr, fmt.Errorf("invalid value %q for flag -tags: %s", tags, err)) - exit(1) - } - - if explain != "" { - var haystack []*analysis.Analyzer - haystack = append(haystack, cs...) - for _, cum := range cums { - haystack = append(haystack, cum.Analyzer()) - } - check, ok := findCheck(haystack, explain) - if !ok { - fmt.Fprintln(os.Stderr, "Couldn't find check", explain) - exit(1) - } - if check.Doc == "" { - fmt.Fprintln(os.Stderr, explain, "has no documentation") - exit(1) - } - fmt.Println(check.Doc) - exit(0) - } - - ps, err := Lint(cs, cums, fs.Args(), &Options{ - Tags: tags, - LintTests: tests, - GoVersion: goVersion, - Config: cfg, - }) - if err != nil { - fmt.Fprintln(os.Stderr, err) - exit(1) - } - - var f format.Formatter - switch formatter { - case "text": - f = format.Text{W: os.Stdout} - case "stylish": - f = &format.Stylish{W: os.Stdout} - case "json": - f = format.JSON{W: os.Stdout} - default: - fmt.Fprintf(os.Stderr, "unsupported output format %q\n", formatter) - exit(2) - } - - var ( - total int - errors int - warnings int - ) - - fail := *fs.Lookup("fail").Value.(*list) - analyzers := make([]*analysis.Analyzer, len(cs), len(cs)+len(cums)) - copy(analyzers, cs) - for _, cum := range cums { - analyzers = append(analyzers, cum.Analyzer()) - } - shouldExit := lint.FilterChecks(analyzers, fail) - shouldExit["compile"] = true - - total = len(ps) - for _, p := range ps { - if p.Check == "compile" && debugNoCompile { - continue - } - if p.Severity == lint.Ignored && !showIgnored { - continue - } - if shouldExit[p.Check] { - errors++ - } else { - p.Severity = lint.Warning - warnings++ - } - f.Format(p) - } - if f, ok := f.(format.Statter); ok { - f.Stats(total, errors, warnings) - } - if errors > 0 { - exit(1) - } - exit(0) -} - -type Options struct { - Config config.Config - - Tags string - LintTests bool - GoVersion int -} - -func computeSalt() ([]byte, error) { - if version.Version != "devel" { - return []byte(version.Version), nil - } - p, err := os.Executable() - if err != nil { - return nil, err - } - f, err := os.Open(p) - if err != nil { - return nil, err - } - defer f.Close() - h := sha256.New() - if _, err := io.Copy(h, f); err != nil { - return nil, err - } - return h.Sum(nil), nil -} - -func Lint(cs []*analysis.Analyzer, cums []lint.CumulativeChecker, paths []string, opt *Options) ([]lint.Problem, error) { - salt, err := computeSalt() - if err != nil { - return nil, fmt.Errorf("could not compute salt for cache: %s", err) - } - cache.SetSalt(salt) - - if opt == nil { - opt = &Options{} - } - - l := &lint.Linter{ - Checkers: cs, - CumulativeCheckers: cums, - GoVersion: opt.GoVersion, - Config: opt.Config, - } - cfg := &packages.Config{} - if opt.LintTests { - cfg.Tests = true - } - if opt.Tags != "" { - cfg.BuildFlags = append(cfg.BuildFlags, "-tags", opt.Tags) - } - - printStats := func() { - // Individual stats are read atomically, but overall there - // is no synchronisation. For printing rough progress - // information, this doesn't matter. - switch atomic.LoadUint32(&l.Stats.State) { - case lint.StateInitializing: - fmt.Fprintln(os.Stderr, "Status: initializing") - case lint.StateGraph: - fmt.Fprintln(os.Stderr, "Status: loading package graph") - case lint.StateProcessing: - fmt.Fprintf(os.Stderr, "Packages: %d/%d initial, %d/%d total; Workers: %d/%d; Problems: %d\n", - atomic.LoadUint32(&l.Stats.ProcessedInitialPackages), - atomic.LoadUint32(&l.Stats.InitialPackages), - atomic.LoadUint32(&l.Stats.ProcessedPackages), - atomic.LoadUint32(&l.Stats.TotalPackages), - atomic.LoadUint32(&l.Stats.ActiveWorkers), - atomic.LoadUint32(&l.Stats.TotalWorkers), - atomic.LoadUint32(&l.Stats.Problems), - ) - case lint.StateCumulative: - fmt.Fprintln(os.Stderr, "Status: processing cumulative checkers") - } - } - if len(infoSignals) > 0 { - ch := make(chan os.Signal, 1) - signal.Notify(ch, infoSignals...) - defer signal.Stop(ch) - go func() { - for range ch { - printStats() - } - }() - } - - return l.Lint(cfg, paths) -} - -var posRe = regexp.MustCompile(`^(.+?):(\d+)(?::(\d+)?)?$`) - -func parsePos(pos string) token.Position { - if pos == "-" || pos == "" { - return token.Position{} - } - parts := posRe.FindStringSubmatch(pos) - if parts == nil { - panic(fmt.Sprintf("internal error: malformed position %q", pos)) - } - file := parts[1] - line, _ := strconv.Atoi(parts[2]) - col, _ := strconv.Atoi(parts[3]) - return token.Position{ - Filename: file, - Line: line, - Column: col, - } -} diff --git a/vendor/honnef.co/go/tools/lint/runner.go b/vendor/honnef.co/go/tools/lint/runner.go deleted file mode 100644 index 3b22a63fa21..00000000000 --- a/vendor/honnef.co/go/tools/lint/runner.go +++ /dev/null @@ -1,970 +0,0 @@ -package lint - -/* -Parallelism - -Runner implements parallel processing of packages by spawning one -goroutine per package in the dependency graph, without any semaphores. -Each goroutine initially waits on the completion of all of its -dependencies, thus establishing correct order of processing. Once all -dependencies finish processing, the goroutine will load the package -from export data or source – this loading is guarded by a semaphore, -sized according to the number of CPU cores. This way, we only have as -many packages occupying memory and CPU resources as there are actual -cores to process them. - -This combination of unbounded goroutines but bounded package loading -means that if we have many parallel, independent subgraphs, they will -all execute in parallel, while not wasting resources for long linear -chains or trying to process more subgraphs in parallel than the system -can handle. - -*/ - -import ( - "bytes" - "encoding/gob" - "encoding/hex" - "fmt" - "go/ast" - "go/token" - "go/types" - "reflect" - "regexp" - "runtime" - "sort" - "strconv" - "strings" - "sync" - "sync/atomic" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/packages" - "golang.org/x/tools/go/types/objectpath" - "honnef.co/go/tools/config" - "honnef.co/go/tools/facts" - "honnef.co/go/tools/internal/cache" - "honnef.co/go/tools/loader" -) - -// If enabled, abuse of the go/analysis API will lead to panics -const sanityCheck = true - -// OPT(dh): for a dependency tree A->B->C->D, if we have cached data -// for B, there should be no need to load C and D individually. Go's -// export data for B contains all the data we need on types, and our -// fact cache could store the union of B, C and D in B. -// -// This may change unused's behavior, however, as it may observe fewer -// interfaces from transitive dependencies. - -type Package struct { - dependents uint64 - - *packages.Package - Imports []*Package - initial bool - fromSource bool - hash string - done chan struct{} - - resultsMu sync.Mutex - // results maps analyzer IDs to analyzer results - results []*result - - cfg *config.Config - gen map[string]facts.Generator - problems []Problem - ignores []Ignore - errs []error - - // these slices are indexed by analysis - facts []map[types.Object][]analysis.Fact - pkgFacts [][]analysis.Fact - - canClearTypes bool -} - -func (pkg *Package) decUse() { - atomic.AddUint64(&pkg.dependents, ^uint64(0)) - if atomic.LoadUint64(&pkg.dependents) == 0 { - // nobody depends on this package anymore - if pkg.canClearTypes { - pkg.Types = nil - } - pkg.facts = nil - pkg.pkgFacts = nil - - for _, imp := range pkg.Imports { - imp.decUse() - } - } -} - -type result struct { - v interface{} - err error - ready chan struct{} -} - -type Runner struct { - ld loader.Loader - cache *cache.Cache - - analyzerIDs analyzerIDs - - // limits parallelism of loading packages - loadSem chan struct{} - - goVersion int - stats *Stats -} - -type analyzerIDs struct { - m map[*analysis.Analyzer]int -} - -func (ids analyzerIDs) get(a *analysis.Analyzer) int { - id, ok := ids.m[a] - if !ok { - panic(fmt.Sprintf("no analyzer ID for %s", a.Name)) - } - return id -} - -type Fact struct { - Path string - Fact analysis.Fact -} - -type analysisAction struct { - analyzer *analysis.Analyzer - analyzerID int - pkg *Package - newPackageFacts []analysis.Fact - problems []Problem - - pkgFacts map[*types.Package][]analysis.Fact -} - -func (ac *analysisAction) String() string { - return fmt.Sprintf("%s @ %s", ac.analyzer, ac.pkg) -} - -func (ac *analysisAction) allObjectFacts() []analysis.ObjectFact { - out := make([]analysis.ObjectFact, 0, len(ac.pkg.facts[ac.analyzerID])) - for obj, facts := range ac.pkg.facts[ac.analyzerID] { - for _, fact := range facts { - out = append(out, analysis.ObjectFact{ - Object: obj, - Fact: fact, - }) - } - } - return out -} - -func (ac *analysisAction) allPackageFacts() []analysis.PackageFact { - out := make([]analysis.PackageFact, 0, len(ac.pkgFacts)) - for pkg, facts := range ac.pkgFacts { - for _, fact := range facts { - out = append(out, analysis.PackageFact{ - Package: pkg, - Fact: fact, - }) - } - } - return out -} - -func (ac *analysisAction) importObjectFact(obj types.Object, fact analysis.Fact) bool { - if sanityCheck && len(ac.analyzer.FactTypes) == 0 { - panic("analysis doesn't export any facts") - } - for _, f := range ac.pkg.facts[ac.analyzerID][obj] { - if reflect.TypeOf(f) == reflect.TypeOf(fact) { - reflect.ValueOf(fact).Elem().Set(reflect.ValueOf(f).Elem()) - return true - } - } - return false -} - -func (ac *analysisAction) importPackageFact(pkg *types.Package, fact analysis.Fact) bool { - if sanityCheck && len(ac.analyzer.FactTypes) == 0 { - panic("analysis doesn't export any facts") - } - for _, f := range ac.pkgFacts[pkg] { - if reflect.TypeOf(f) == reflect.TypeOf(fact) { - reflect.ValueOf(fact).Elem().Set(reflect.ValueOf(f).Elem()) - return true - } - } - return false -} - -func (ac *analysisAction) exportObjectFact(obj types.Object, fact analysis.Fact) { - if sanityCheck && len(ac.analyzer.FactTypes) == 0 { - panic("analysis doesn't export any facts") - } - ac.pkg.facts[ac.analyzerID][obj] = append(ac.pkg.facts[ac.analyzerID][obj], fact) -} - -func (ac *analysisAction) exportPackageFact(fact analysis.Fact) { - if sanityCheck && len(ac.analyzer.FactTypes) == 0 { - panic("analysis doesn't export any facts") - } - ac.pkgFacts[ac.pkg.Types] = append(ac.pkgFacts[ac.pkg.Types], fact) - ac.newPackageFacts = append(ac.newPackageFacts, fact) -} - -func (ac *analysisAction) report(pass *analysis.Pass, d analysis.Diagnostic) { - p := Problem{ - Pos: DisplayPosition(pass.Fset, d.Pos), - End: DisplayPosition(pass.Fset, d.End), - Message: d.Message, - Check: pass.Analyzer.Name, - } - ac.problems = append(ac.problems, p) -} - -func (r *Runner) runAnalysis(ac *analysisAction) (ret interface{}, err error) { - ac.pkg.resultsMu.Lock() - res := ac.pkg.results[r.analyzerIDs.get(ac.analyzer)] - if res != nil { - ac.pkg.resultsMu.Unlock() - <-res.ready - return res.v, res.err - } else { - res = &result{ - ready: make(chan struct{}), - } - ac.pkg.results[r.analyzerIDs.get(ac.analyzer)] = res - ac.pkg.resultsMu.Unlock() - - defer func() { - res.v = ret - res.err = err - close(res.ready) - }() - - pass := new(analysis.Pass) - *pass = analysis.Pass{ - Analyzer: ac.analyzer, - Fset: ac.pkg.Fset, - Files: ac.pkg.Syntax, - // type information may be nil or may be populated. if it is - // nil, it will get populated later. - Pkg: ac.pkg.Types, - TypesInfo: ac.pkg.TypesInfo, - TypesSizes: ac.pkg.TypesSizes, - ResultOf: map[*analysis.Analyzer]interface{}{}, - ImportObjectFact: ac.importObjectFact, - ImportPackageFact: ac.importPackageFact, - ExportObjectFact: ac.exportObjectFact, - ExportPackageFact: ac.exportPackageFact, - Report: func(d analysis.Diagnostic) { - ac.report(pass, d) - }, - AllObjectFacts: ac.allObjectFacts, - AllPackageFacts: ac.allPackageFacts, - } - - if !ac.pkg.initial { - // Don't report problems in dependencies - pass.Report = func(analysis.Diagnostic) {} - } - return r.runAnalysisUser(pass, ac) - } -} - -func (r *Runner) loadCachedFacts(a *analysis.Analyzer, pkg *Package) ([]Fact, bool) { - if len(a.FactTypes) == 0 { - return nil, true - } - - var facts []Fact - // Look in the cache for facts - aID, err := passActionID(pkg, a) - if err != nil { - return nil, false - } - aID = cache.Subkey(aID, "facts") - b, _, err := r.cache.GetBytes(aID) - if err != nil { - // No cached facts, analyse this package like a user-provided one, but ignore diagnostics - return nil, false - } - - if err := gob.NewDecoder(bytes.NewReader(b)).Decode(&facts); err != nil { - // Cached facts are broken, analyse this package like a user-provided one, but ignore diagnostics - return nil, false - } - return facts, true -} - -type dependencyError struct { - dep string - err error -} - -func (err dependencyError) nested() dependencyError { - if o, ok := err.err.(dependencyError); ok { - return o.nested() - } - return err -} - -func (err dependencyError) Error() string { - if o, ok := err.err.(dependencyError); ok { - return o.Error() - } - return fmt.Sprintf("error running dependency %s: %s", err.dep, err.err) -} - -func (r *Runner) makeAnalysisAction(a *analysis.Analyzer, pkg *Package) *analysisAction { - aid := r.analyzerIDs.get(a) - ac := &analysisAction{ - analyzer: a, - analyzerID: aid, - pkg: pkg, - } - - if len(a.FactTypes) == 0 { - return ac - } - - // Merge all package facts of dependencies - ac.pkgFacts = map[*types.Package][]analysis.Fact{} - seen := map[*Package]struct{}{} - var dfs func(*Package) - dfs = func(pkg *Package) { - if _, ok := seen[pkg]; ok { - return - } - seen[pkg] = struct{}{} - s := pkg.pkgFacts[aid] - ac.pkgFacts[pkg.Types] = s[0:len(s):len(s)] - for _, imp := range pkg.Imports { - dfs(imp) - } - } - dfs(pkg) - - return ac -} - -// analyzes that we always want to run, even if they're not being run -// explicitly or as dependencies. these are necessary for the inner -// workings of the runner. -var injectedAnalyses = []*analysis.Analyzer{facts.Generated, config.Analyzer} - -func (r *Runner) runAnalysisUser(pass *analysis.Pass, ac *analysisAction) (interface{}, error) { - if !ac.pkg.fromSource { - panic(fmt.Sprintf("internal error: %s was not loaded from source", ac.pkg)) - } - - // User-provided package, analyse it - // First analyze it with dependencies - for _, req := range ac.analyzer.Requires { - acReq := r.makeAnalysisAction(req, ac.pkg) - ret, err := r.runAnalysis(acReq) - if err != nil { - // We couldn't run a dependency, no point in going on - return nil, dependencyError{req.Name, err} - } - - pass.ResultOf[req] = ret - } - - // Then with this analyzer - ret, err := ac.analyzer.Run(pass) - if err != nil { - return nil, err - } - - if len(ac.analyzer.FactTypes) > 0 { - // Merge new facts into the package and persist them. - var facts []Fact - for _, fact := range ac.newPackageFacts { - id := r.analyzerIDs.get(ac.analyzer) - ac.pkg.pkgFacts[id] = append(ac.pkg.pkgFacts[id], fact) - facts = append(facts, Fact{"", fact}) - } - for obj, afacts := range ac.pkg.facts[ac.analyzerID] { - if obj.Pkg() != ac.pkg.Package.Types { - continue - } - path, err := objectpath.For(obj) - if err != nil { - continue - } - for _, fact := range afacts { - facts = append(facts, Fact{string(path), fact}) - } - } - - buf := &bytes.Buffer{} - if err := gob.NewEncoder(buf).Encode(facts); err != nil { - return nil, err - } - aID, err := passActionID(ac.pkg, ac.analyzer) - if err != nil { - return nil, err - } - aID = cache.Subkey(aID, "facts") - if err := r.cache.PutBytes(aID, buf.Bytes()); err != nil { - return nil, err - } - } - - return ret, nil -} - -func NewRunner(stats *Stats) (*Runner, error) { - cache, err := cache.Default() - if err != nil { - return nil, err - } - - return &Runner{ - cache: cache, - stats: stats, - }, nil -} - -// Run loads packages corresponding to patterns and analyses them with -// analyzers. It returns the loaded packages, which contain reported -// diagnostics as well as extracted ignore directives. -// -// Note that diagnostics have not been filtered at this point yet, to -// accomodate cumulative analyzes that require additional steps to -// produce diagnostics. -func (r *Runner) Run(cfg *packages.Config, patterns []string, analyzers []*analysis.Analyzer, hasCumulative bool) ([]*Package, error) { - r.analyzerIDs = analyzerIDs{m: map[*analysis.Analyzer]int{}} - id := 0 - seen := map[*analysis.Analyzer]struct{}{} - var dfs func(a *analysis.Analyzer) - dfs = func(a *analysis.Analyzer) { - if _, ok := seen[a]; ok { - return - } - seen[a] = struct{}{} - r.analyzerIDs.m[a] = id - id++ - for _, f := range a.FactTypes { - gob.Register(f) - } - for _, req := range a.Requires { - dfs(req) - } - } - for _, a := range analyzers { - if v := a.Flags.Lookup("go"); v != nil { - v.Value.Set(fmt.Sprintf("1.%d", r.goVersion)) - } - dfs(a) - } - for _, a := range injectedAnalyses { - dfs(a) - } - - var dcfg packages.Config - if cfg != nil { - dcfg = *cfg - } - - atomic.StoreUint32(&r.stats.State, StateGraph) - initialPkgs, err := r.ld.Graph(dcfg, patterns...) - if err != nil { - return nil, err - } - - defer r.cache.Trim() - - var allPkgs []*Package - m := map[*packages.Package]*Package{} - packages.Visit(initialPkgs, nil, func(l *packages.Package) { - m[l] = &Package{ - Package: l, - results: make([]*result, len(r.analyzerIDs.m)), - facts: make([]map[types.Object][]analysis.Fact, len(r.analyzerIDs.m)), - pkgFacts: make([][]analysis.Fact, len(r.analyzerIDs.m)), - done: make(chan struct{}), - // every package needs itself - dependents: 1, - canClearTypes: !hasCumulative, - } - allPkgs = append(allPkgs, m[l]) - for i := range m[l].facts { - m[l].facts[i] = map[types.Object][]analysis.Fact{} - } - for _, err := range l.Errors { - m[l].errs = append(m[l].errs, err) - } - for _, v := range l.Imports { - m[v].dependents++ - m[l].Imports = append(m[l].Imports, m[v]) - } - - m[l].hash, err = packageHash(m[l]) - if err != nil { - m[l].errs = append(m[l].errs, err) - } - }) - - pkgs := make([]*Package, len(initialPkgs)) - for i, l := range initialPkgs { - pkgs[i] = m[l] - pkgs[i].initial = true - } - - atomic.StoreUint32(&r.stats.InitialPackages, uint32(len(initialPkgs))) - atomic.StoreUint32(&r.stats.TotalPackages, uint32(len(allPkgs))) - atomic.StoreUint32(&r.stats.State, StateProcessing) - - var wg sync.WaitGroup - wg.Add(len(allPkgs)) - r.loadSem = make(chan struct{}, runtime.GOMAXPROCS(-1)) - atomic.StoreUint32(&r.stats.TotalWorkers, uint32(cap(r.loadSem))) - for _, pkg := range allPkgs { - pkg := pkg - go func() { - r.processPkg(pkg, analyzers) - - if pkg.initial { - atomic.AddUint32(&r.stats.ProcessedInitialPackages, 1) - } - atomic.AddUint32(&r.stats.Problems, uint32(len(pkg.problems))) - wg.Done() - }() - } - wg.Wait() - - return pkgs, nil -} - -var posRe = regexp.MustCompile(`^(.+?):(\d+)(?::(\d+)?)?`) - -func parsePos(pos string) (token.Position, int, error) { - if pos == "-" || pos == "" { - return token.Position{}, 0, nil - } - parts := posRe.FindStringSubmatch(pos) - if parts == nil { - return token.Position{}, 0, fmt.Errorf("malformed position %q", pos) - } - file := parts[1] - line, _ := strconv.Atoi(parts[2]) - col, _ := strconv.Atoi(parts[3]) - return token.Position{ - Filename: file, - Line: line, - Column: col, - }, len(parts[0]), nil -} - -// loadPkg loads a Go package. If the package is in the set of initial -// packages, it will be loaded from source, otherwise it will be -// loaded from export data. In the case that the package was loaded -// from export data, cached facts will also be loaded. -// -// Currently, only cached facts for this package will be loaded, not -// for any of its dependencies. -func (r *Runner) loadPkg(pkg *Package, analyzers []*analysis.Analyzer) error { - if pkg.Types != nil { - panic(fmt.Sprintf("internal error: %s has already been loaded", pkg.Package)) - } - - // Load type information - if pkg.initial { - // Load package from source - pkg.fromSource = true - return r.ld.LoadFromSource(pkg.Package) - } - - // Load package from export data - if err := r.ld.LoadFromExport(pkg.Package); err != nil { - // We asked Go to give us up to date export data, yet - // we can't load it. There must be something wrong. - // - // Attempt loading from source. This should fail (because - // otherwise there would be export data); we just want to - // get the compile errors. If loading from source succeeds - // we discard the result, anyway. Otherwise we'll fail - // when trying to reload from export data later. - // - // FIXME(dh): we no longer reload from export data, so - // theoretically we should be able to continue - pkg.fromSource = true - if err := r.ld.LoadFromSource(pkg.Package); err != nil { - return err - } - // Make sure this package can't be imported successfully - pkg.Package.Errors = append(pkg.Package.Errors, packages.Error{ - Pos: "-", - Msg: fmt.Sprintf("could not load export data: %s", err), - Kind: packages.ParseError, - }) - return fmt.Errorf("could not load export data: %s", err) - } - - failed := false - seen := make([]bool, len(r.analyzerIDs.m)) - var dfs func(*analysis.Analyzer) - dfs = func(a *analysis.Analyzer) { - if seen[r.analyzerIDs.get(a)] { - return - } - seen[r.analyzerIDs.get(a)] = true - - if len(a.FactTypes) > 0 { - facts, ok := r.loadCachedFacts(a, pkg) - if !ok { - failed = true - return - } - - for _, f := range facts { - if f.Path == "" { - // This is a package fact - pkg.pkgFacts[r.analyzerIDs.get(a)] = append(pkg.pkgFacts[r.analyzerIDs.get(a)], f.Fact) - continue - } - obj, err := objectpath.Object(pkg.Types, objectpath.Path(f.Path)) - if err != nil { - // Be lenient about these errors. For example, when - // analysing io/ioutil from source, we may get a fact - // for methods on the devNull type, and objectpath - // will happily create a path for them. However, when - // we later load io/ioutil from export data, the path - // no longer resolves. - // - // If an exported type embeds the unexported type, - // then (part of) the unexported type will become part - // of the type information and our path will resolve - // again. - continue - } - pkg.facts[r.analyzerIDs.get(a)][obj] = append(pkg.facts[r.analyzerIDs.get(a)][obj], f.Fact) - } - } - - for _, req := range a.Requires { - dfs(req) - } - } - for _, a := range analyzers { - dfs(a) - } - - if failed { - pkg.fromSource = true - // XXX we added facts to the maps, we need to get rid of those - return r.ld.LoadFromSource(pkg.Package) - } - - return nil -} - -type analysisError struct { - analyzer *analysis.Analyzer - pkg *Package - err error -} - -func (err analysisError) Error() string { - return fmt.Sprintf("error running analyzer %s on %s: %s", err.analyzer, err.pkg, err.err) -} - -// processPkg processes a package. This involves loading the package, -// either from export data or from source. For packages loaded from -// source, the provides analyzers will be run on the package. -func (r *Runner) processPkg(pkg *Package, analyzers []*analysis.Analyzer) { - defer func() { - // Clear information we no longer need. Make sure to do this - // when returning from processPkg so that we clear - // dependencies, not just initial packages. - pkg.TypesInfo = nil - pkg.Syntax = nil - pkg.results = nil - - atomic.AddUint32(&r.stats.ProcessedPackages, 1) - pkg.decUse() - close(pkg.done) - }() - - // Ensure all packages have the generated map and config. This is - // required by interna of the runner. Analyses that themselves - // make use of either have an explicit dependency so that other - // runners work correctly, too. - analyzers = append(analyzers[0:len(analyzers):len(analyzers)], injectedAnalyses...) - - if len(pkg.errs) != 0 { - return - } - - for _, imp := range pkg.Imports { - <-imp.done - if len(imp.errs) > 0 { - if imp.initial { - // Don't print the error of the dependency since it's - // an initial package and we're already printing the - // error. - pkg.errs = append(pkg.errs, fmt.Errorf("could not analyze dependency %s of %s", imp, pkg)) - } else { - var s string - for _, err := range imp.errs { - s += "\n\t" + err.Error() - } - pkg.errs = append(pkg.errs, fmt.Errorf("could not analyze dependency %s of %s: %s", imp, pkg, s)) - } - return - } - } - if pkg.PkgPath == "unsafe" { - pkg.Types = types.Unsafe - return - } - - r.loadSem <- struct{}{} - atomic.AddUint32(&r.stats.ActiveWorkers, 1) - defer func() { - <-r.loadSem - atomic.AddUint32(&r.stats.ActiveWorkers, ^uint32(0)) - }() - if err := r.loadPkg(pkg, analyzers); err != nil { - pkg.errs = append(pkg.errs, err) - return - } - - // A package's object facts is the union of all of its dependencies. - for _, imp := range pkg.Imports { - for ai, m := range imp.facts { - for obj, facts := range m { - pkg.facts[ai][obj] = facts[0:len(facts):len(facts)] - } - } - } - - if !pkg.fromSource { - // Nothing left to do for the package. - return - } - - // Run analyses on initial packages and those missing facts - var wg sync.WaitGroup - wg.Add(len(analyzers)) - errs := make([]error, len(analyzers)) - var acs []*analysisAction - for i, a := range analyzers { - i := i - a := a - ac := r.makeAnalysisAction(a, pkg) - acs = append(acs, ac) - go func() { - defer wg.Done() - // Only initial packages and packages with missing - // facts will have been loaded from source. - if pkg.initial || r.hasFacts(a) { - if _, err := r.runAnalysis(ac); err != nil { - errs[i] = analysisError{a, pkg, err} - return - } - } - }() - } - wg.Wait() - - depErrors := map[dependencyError]int{} - for _, err := range errs { - if err == nil { - continue - } - switch err := err.(type) { - case analysisError: - switch err := err.err.(type) { - case dependencyError: - depErrors[err.nested()]++ - default: - pkg.errs = append(pkg.errs, err) - } - default: - pkg.errs = append(pkg.errs, err) - } - } - for err, count := range depErrors { - pkg.errs = append(pkg.errs, - fmt.Errorf("could not run %s@%s, preventing %d analyzers from running: %s", err.dep, pkg, count, err.err)) - } - - // We can't process ignores at this point because `unused` needs - // to see more than one package to make its decision. - ignores, problems := parseDirectives(pkg.Package) - pkg.ignores = append(pkg.ignores, ignores...) - pkg.problems = append(pkg.problems, problems...) - for _, ac := range acs { - pkg.problems = append(pkg.problems, ac.problems...) - } - - if pkg.initial { - // Only initial packages have these analyzers run, and only - // initial packages need these. - if pkg.results[r.analyzerIDs.get(config.Analyzer)].v != nil { - pkg.cfg = pkg.results[r.analyzerIDs.get(config.Analyzer)].v.(*config.Config) - } - pkg.gen = pkg.results[r.analyzerIDs.get(facts.Generated)].v.(map[string]facts.Generator) - } - - // In a previous version of the code, we would throw away all type - // information and reload it from export data. That was - // nonsensical. The *types.Package doesn't keep any information - // live that export data wouldn't also. We only need to discard - // the AST and the TypesInfo maps; that happens after we return - // from processPkg. -} - -// hasFacts reports whether an analysis exports any facts. An analysis -// that has a transitive dependency that exports facts is considered -// to be exporting facts. -func (r *Runner) hasFacts(a *analysis.Analyzer) bool { - ret := false - seen := make([]bool, len(r.analyzerIDs.m)) - var dfs func(*analysis.Analyzer) - dfs = func(a *analysis.Analyzer) { - if seen[r.analyzerIDs.get(a)] { - return - } - seen[r.analyzerIDs.get(a)] = true - if len(a.FactTypes) > 0 { - ret = true - } - for _, req := range a.Requires { - if ret { - break - } - dfs(req) - } - } - dfs(a) - return ret -} - -func parseDirective(s string) (cmd string, args []string) { - if !strings.HasPrefix(s, "//lint:") { - return "", nil - } - s = strings.TrimPrefix(s, "//lint:") - fields := strings.Split(s, " ") - return fields[0], fields[1:] -} - -// parseDirectives extracts all linter directives from the source -// files of the package. Malformed directives are returned as problems. -func parseDirectives(pkg *packages.Package) ([]Ignore, []Problem) { - var ignores []Ignore - var problems []Problem - - for _, f := range pkg.Syntax { - found := false - commentLoop: - for _, cg := range f.Comments { - for _, c := range cg.List { - if strings.Contains(c.Text, "//lint:") { - found = true - break commentLoop - } - } - } - if !found { - continue - } - cm := ast.NewCommentMap(pkg.Fset, f, f.Comments) - for node, cgs := range cm { - for _, cg := range cgs { - for _, c := range cg.List { - if !strings.HasPrefix(c.Text, "//lint:") { - continue - } - cmd, args := parseDirective(c.Text) - switch cmd { - case "ignore", "file-ignore": - if len(args) < 2 { - p := Problem{ - Pos: DisplayPosition(pkg.Fset, c.Pos()), - Message: "malformed linter directive; missing the required reason field?", - Severity: Error, - Check: "compile", - } - problems = append(problems, p) - continue - } - default: - // unknown directive, ignore - continue - } - checks := strings.Split(args[0], ",") - pos := DisplayPosition(pkg.Fset, node.Pos()) - var ig Ignore - switch cmd { - case "ignore": - ig = &LineIgnore{ - File: pos.Filename, - Line: pos.Line, - Checks: checks, - Pos: c.Pos(), - } - case "file-ignore": - ig = &FileIgnore{ - File: pos.Filename, - Checks: checks, - } - } - ignores = append(ignores, ig) - } - } - } - } - - return ignores, problems -} - -// packageHash computes a package's hash. The hash is based on all Go -// files that make up the package, as well as the hashes of imported -// packages. -func packageHash(pkg *Package) (string, error) { - key := cache.NewHash("package hash") - fmt.Fprintf(key, "pkgpath %s\n", pkg.PkgPath) - for _, f := range pkg.CompiledGoFiles { - h, err := cache.FileHash(f) - if err != nil { - return "", err - } - fmt.Fprintf(key, "file %s %x\n", f, h) - } - - imps := make([]*Package, len(pkg.Imports)) - copy(imps, pkg.Imports) - sort.Slice(imps, func(i, j int) bool { - return imps[i].PkgPath < imps[j].PkgPath - }) - for _, dep := range imps { - if dep.PkgPath == "unsafe" { - continue - } - - fmt.Fprintf(key, "import %s %s\n", dep.PkgPath, dep.hash) - } - h := key.Sum() - return hex.EncodeToString(h[:]), nil -} - -// passActionID computes an ActionID for an analysis pass. -func passActionID(pkg *Package, analyzer *analysis.Analyzer) (cache.ActionID, error) { - key := cache.NewHash("action ID") - fmt.Fprintf(key, "pkgpath %s\n", pkg.PkgPath) - fmt.Fprintf(key, "pkghash %s\n", pkg.hash) - fmt.Fprintf(key, "analyzer %s\n", analyzer.Name) - - return key.Sum(), nil -} diff --git a/vendor/honnef.co/go/tools/lint/stats.go b/vendor/honnef.co/go/tools/lint/stats.go deleted file mode 100644 index 2f650855937..00000000000 --- a/vendor/honnef.co/go/tools/lint/stats.go +++ /dev/null @@ -1,20 +0,0 @@ -package lint - -const ( - StateInitializing = 0 - StateGraph = 1 - StateProcessing = 2 - StateCumulative = 3 -) - -type Stats struct { - State uint32 - - InitialPackages uint32 - TotalPackages uint32 - ProcessedPackages uint32 - ProcessedInitialPackages uint32 - Problems uint32 - ActiveWorkers uint32 - TotalWorkers uint32 -} diff --git a/vendor/honnef.co/go/tools/loader/BUILD b/vendor/honnef.co/go/tools/loader/BUILD deleted file mode 100644 index cd1e90ce433..00000000000 --- a/vendor/honnef.co/go/tools/loader/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["loader.go"], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/loader", - importpath = "honnef.co/go/tools/loader", - visibility = ["//visibility:public"], - deps = [ - "//vendor/golang.org/x/tools/go/gcexportdata:go_default_library", - "//vendor/golang.org/x/tools/go/packages:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/loader/loader.go b/vendor/honnef.co/go/tools/loader/loader.go deleted file mode 100644 index 9c6885d485f..00000000000 --- a/vendor/honnef.co/go/tools/loader/loader.go +++ /dev/null @@ -1,197 +0,0 @@ -package loader - -import ( - "fmt" - "go/ast" - "go/parser" - "go/scanner" - "go/token" - "go/types" - "log" - "os" - "sync" - - "golang.org/x/tools/go/gcexportdata" - "golang.org/x/tools/go/packages" -) - -type Loader struct { - exportMu sync.RWMutex -} - -// Graph resolves patterns and returns packages with all the -// information required to later load type information, and optionally -// syntax trees. -// -// The provided config can set any setting with the exception of Mode. -func (ld *Loader) Graph(cfg packages.Config, patterns ...string) ([]*packages.Package, error) { - cfg.Mode = packages.NeedName | packages.NeedImports | packages.NeedDeps | packages.NeedExportsFile | packages.NeedFiles | packages.NeedCompiledGoFiles | packages.NeedTypesSizes - pkgs, err := packages.Load(&cfg, patterns...) - if err != nil { - return nil, err - } - fset := token.NewFileSet() - packages.Visit(pkgs, nil, func(pkg *packages.Package) { - pkg.Fset = fset - }) - return pkgs, nil -} - -// LoadFromExport loads a package from export data. All of its -// dependencies must have been loaded already. -func (ld *Loader) LoadFromExport(pkg *packages.Package) error { - ld.exportMu.Lock() - defer ld.exportMu.Unlock() - - pkg.IllTyped = true - for path, pkg := range pkg.Imports { - if pkg.Types == nil { - return fmt.Errorf("dependency %q hasn't been loaded yet", path) - } - } - if pkg.ExportFile == "" { - return fmt.Errorf("no export data for %q", pkg.ID) - } - f, err := os.Open(pkg.ExportFile) - if err != nil { - return err - } - defer f.Close() - - r, err := gcexportdata.NewReader(f) - if err != nil { - return err - } - - view := make(map[string]*types.Package) // view seen by gcexportdata - seen := make(map[*packages.Package]bool) // all visited packages - var visit func(pkgs map[string]*packages.Package) - visit = func(pkgs map[string]*packages.Package) { - for _, pkg := range pkgs { - if !seen[pkg] { - seen[pkg] = true - view[pkg.PkgPath] = pkg.Types - visit(pkg.Imports) - } - } - } - visit(pkg.Imports) - tpkg, err := gcexportdata.Read(r, pkg.Fset, view, pkg.PkgPath) - if err != nil { - return err - } - pkg.Types = tpkg - pkg.IllTyped = false - return nil -} - -// LoadFromSource loads a package from source. All of its dependencies -// must have been loaded already. -func (ld *Loader) LoadFromSource(pkg *packages.Package) error { - ld.exportMu.RLock() - defer ld.exportMu.RUnlock() - - pkg.IllTyped = true - pkg.Types = types.NewPackage(pkg.PkgPath, pkg.Name) - - // OPT(dh): many packages have few files, much fewer than there - // are CPU cores. Additionally, parsing each individual file is - // very fast. A naive parallel implementation of this loop won't - // be faster, and tends to be slower due to extra scheduling, - // bookkeeping and potentially false sharing of cache lines. - pkg.Syntax = make([]*ast.File, len(pkg.CompiledGoFiles)) - for i, file := range pkg.CompiledGoFiles { - f, err := parser.ParseFile(pkg.Fset, file, nil, parser.ParseComments) - if err != nil { - pkg.Errors = append(pkg.Errors, convertError(err)...) - return err - } - pkg.Syntax[i] = f - } - pkg.TypesInfo = &types.Info{ - Types: make(map[ast.Expr]types.TypeAndValue), - Defs: make(map[*ast.Ident]types.Object), - Uses: make(map[*ast.Ident]types.Object), - Implicits: make(map[ast.Node]types.Object), - Scopes: make(map[ast.Node]*types.Scope), - Selections: make(map[*ast.SelectorExpr]*types.Selection), - } - - importer := func(path string) (*types.Package, error) { - if path == "unsafe" { - return types.Unsafe, nil - } - imp := pkg.Imports[path] - if imp == nil { - return nil, nil - } - if len(imp.Errors) > 0 { - return nil, imp.Errors[0] - } - return imp.Types, nil - } - tc := &types.Config{ - Importer: importerFunc(importer), - Error: func(err error) { - pkg.Errors = append(pkg.Errors, convertError(err)...) - }, - } - err := types.NewChecker(tc, pkg.Fset, pkg.Types, pkg.TypesInfo).Files(pkg.Syntax) - if err != nil { - return err - } - pkg.IllTyped = false - return nil -} - -func convertError(err error) []packages.Error { - var errs []packages.Error - // taken from go/packages - switch err := err.(type) { - case packages.Error: - // from driver - errs = append(errs, err) - - case *os.PathError: - // from parser - errs = append(errs, packages.Error{ - Pos: err.Path + ":1", - Msg: err.Err.Error(), - Kind: packages.ParseError, - }) - - case scanner.ErrorList: - // from parser - for _, err := range err { - errs = append(errs, packages.Error{ - Pos: err.Pos.String(), - Msg: err.Msg, - Kind: packages.ParseError, - }) - } - - case types.Error: - // from type checker - errs = append(errs, packages.Error{ - Pos: err.Fset.Position(err.Pos).String(), - Msg: err.Msg, - Kind: packages.TypeError, - }) - - default: - // unexpected impoverished error from parser? - errs = append(errs, packages.Error{ - Pos: "-", - Msg: err.Error(), - Kind: packages.UnknownError, - }) - - // If you see this error message, please file a bug. - log.Printf("internal error: error %q (%T) without position", err, err) - } - return errs -} - -type importerFunc func(path string) (*types.Package, error) - -func (f importerFunc) Import(path string) (*types.Package, error) { return f(path) } diff --git a/vendor/honnef.co/go/tools/printf/BUILD b/vendor/honnef.co/go/tools/printf/BUILD deleted file mode 100644 index 2b966fb799c..00000000000 --- a/vendor/honnef.co/go/tools/printf/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["printf.go"], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/printf", - importpath = "honnef.co/go/tools/printf", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/printf/fuzz.go b/vendor/honnef.co/go/tools/printf/fuzz.go deleted file mode 100644 index 8ebf357fb42..00000000000 --- a/vendor/honnef.co/go/tools/printf/fuzz.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build gofuzz - -package printf - -func Fuzz(data []byte) int { - _, err := Parse(string(data)) - if err == nil { - return 1 - } - return 0 -} diff --git a/vendor/honnef.co/go/tools/printf/printf.go b/vendor/honnef.co/go/tools/printf/printf.go deleted file mode 100644 index 754db9b16d8..00000000000 --- a/vendor/honnef.co/go/tools/printf/printf.go +++ /dev/null @@ -1,197 +0,0 @@ -// Package printf implements a parser for fmt.Printf-style format -// strings. -// -// It parses verbs according to the following syntax: -// Numeric -> '0'-'9' -// Letter -> 'a'-'z' | 'A'-'Z' -// Index -> '[' Numeric+ ']' -// Star -> '*' -// Star -> Index '*' -// -// Precision -> Numeric+ | Star -// Width -> Numeric+ | Star -// -// WidthAndPrecision -> Width '.' Precision -// WidthAndPrecision -> Width '.' -// WidthAndPrecision -> Width -// WidthAndPrecision -> '.' Precision -// WidthAndPrecision -> '.' -// -// Flag -> '+' | '-' | '#' | ' ' | '0' -// Verb -> Letter | '%' -// -// Input -> '%' [ Flag+ ] [ WidthAndPrecision ] [ Index ] Verb -package printf - -import ( - "errors" - "regexp" - "strconv" - "strings" -) - -// ErrInvalid is returned for invalid format strings or verbs. -var ErrInvalid = errors.New("invalid format string") - -type Verb struct { - Letter rune - Flags string - - Width Argument - Precision Argument - // Which value in the argument list the verb uses. - // -1 denotes the next argument, - // values > 0 denote explicit arguments. - // The value 0 denotes that no argument is consumed. This is the case for %%. - Value int - - Raw string -} - -// Argument is an implicit or explicit width or precision. -type Argument interface { - isArgument() -} - -// The Default value, when no width or precision is provided. -type Default struct{} - -// Zero is the implicit zero value. -// This value may only appear for precisions in format strings like %6.f -type Zero struct{} - -// Star is a * value, which may either refer to the next argument (Index == -1) or an explicit argument. -type Star struct{ Index int } - -// A Literal value, such as 6 in %6d. -type Literal int - -func (Default) isArgument() {} -func (Zero) isArgument() {} -func (Star) isArgument() {} -func (Literal) isArgument() {} - -// Parse parses f and returns a list of actions. -// An action may either be a literal string, or a Verb. -func Parse(f string) ([]interface{}, error) { - var out []interface{} - for len(f) > 0 { - if f[0] == '%' { - v, n, err := ParseVerb(f) - if err != nil { - return nil, err - } - f = f[n:] - out = append(out, v) - } else { - n := strings.IndexByte(f, '%') - if n > -1 { - out = append(out, f[:n]) - f = f[n:] - } else { - out = append(out, f) - f = "" - } - } - } - - return out, nil -} - -func atoi(s string) int { - n, _ := strconv.Atoi(s) - return n -} - -// ParseVerb parses the verb at the beginning of f. -// It returns the verb, how much of the input was consumed, and an error, if any. -func ParseVerb(f string) (Verb, int, error) { - if len(f) < 2 { - return Verb{}, 0, ErrInvalid - } - const ( - flags = 1 - - width = 2 - widthStar = 3 - widthIndex = 5 - - dot = 6 - prec = 7 - precStar = 8 - precIndex = 10 - - verbIndex = 11 - verb = 12 - ) - - m := re.FindStringSubmatch(f) - if m == nil { - return Verb{}, 0, ErrInvalid - } - - v := Verb{ - Letter: []rune(m[verb])[0], - Flags: m[flags], - Raw: m[0], - } - - if m[width] != "" { - // Literal width - v.Width = Literal(atoi(m[width])) - } else if m[widthStar] != "" { - // Star width - if m[widthIndex] != "" { - v.Width = Star{atoi(m[widthIndex])} - } else { - v.Width = Star{-1} - } - } else { - // Default width - v.Width = Default{} - } - - if m[dot] == "" { - // default precision - v.Precision = Default{} - } else { - if m[prec] != "" { - // Literal precision - v.Precision = Literal(atoi(m[prec])) - } else if m[precStar] != "" { - // Star precision - if m[precIndex] != "" { - v.Precision = Star{atoi(m[precIndex])} - } else { - v.Precision = Star{-1} - } - } else { - // Zero precision - v.Precision = Zero{} - } - } - - if m[verb] == "%" { - v.Value = 0 - } else if m[verbIndex] != "" { - v.Value = atoi(m[verbIndex]) - } else { - v.Value = -1 - } - - return v, len(m[0]), nil -} - -const ( - flags = `([+#0 -]*)` - verb = `([a-zA-Z%])` - index = `(?:\[([0-9]+)\])` - star = `((` + index + `)?\*)` - width1 = `([0-9]+)` - width2 = star - width = `(?:` + width1 + `|` + width2 + `)` - precision = width - widthAndPrecision = `(?:(?:` + width + `)?(?:(\.)(?:` + precision + `)?)?)` -) - -var re = regexp.MustCompile(`^%` + flags + widthAndPrecision + `?` + index + `?` + verb) diff --git a/vendor/honnef.co/go/tools/simple/BUILD b/vendor/honnef.co/go/tools/simple/BUILD deleted file mode 100644 index 24a3954433b..00000000000 --- a/vendor/honnef.co/go/tools/simple/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "analysis.go", - "doc.go", - "lint.go", - ], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/simple", - importpath = "honnef.co/go/tools/simple", - visibility = ["//visibility:public"], - deps = [ - "//vendor/golang.org/x/tools/go/analysis:go_default_library", - "//vendor/golang.org/x/tools/go/analysis/passes/inspect:go_default_library", - "//vendor/golang.org/x/tools/go/ast/inspector:go_default_library", - "//vendor/golang.org/x/tools/go/types/typeutil:go_default_library", - "//vendor/honnef.co/go/tools/arg:go_default_library", - "//vendor/honnef.co/go/tools/facts:go_default_library", - "//vendor/honnef.co/go/tools/internal/passes/buildssa:go_default_library", - "//vendor/honnef.co/go/tools/internal/sharedcheck:go_default_library", - "//vendor/honnef.co/go/tools/lint:go_default_library", - "//vendor/honnef.co/go/tools/lint/lintdsl:go_default_library", - "//vendor/honnef.co/go/tools/lint/lintutil:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/simple/CONTRIBUTING.md b/vendor/honnef.co/go/tools/simple/CONTRIBUTING.md deleted file mode 100644 index c54c6c50ac9..00000000000 --- a/vendor/honnef.co/go/tools/simple/CONTRIBUTING.md +++ /dev/null @@ -1,15 +0,0 @@ -# Contributing to gosimple - -## Before filing an issue: - -### Are you having trouble building gosimple? - -Check you have the latest version of its dependencies. Run -``` -go get -u honnef.co/go/tools/simple -``` -If you still have problems, consider searching for existing issues before filing a new issue. - -## Before sending a pull request: - -Have you understood the purpose of gosimple? Make sure to carefully read `README`. diff --git a/vendor/honnef.co/go/tools/simple/analysis.go b/vendor/honnef.co/go/tools/simple/analysis.go deleted file mode 100644 index abb1648fab0..00000000000 --- a/vendor/honnef.co/go/tools/simple/analysis.go +++ /dev/null @@ -1,223 +0,0 @@ -package simple - -import ( - "flag" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/analysis/passes/inspect" - "honnef.co/go/tools/facts" - "honnef.co/go/tools/internal/passes/buildssa" - "honnef.co/go/tools/lint/lintutil" -) - -func newFlagSet() flag.FlagSet { - fs := flag.NewFlagSet("", flag.PanicOnError) - fs.Var(lintutil.NewVersionFlag(), "go", "Target Go version") - return *fs -} - -var Analyzers = map[string]*analysis.Analyzer{ - "S1000": { - Name: "S1000", - Run: LintSingleCaseSelect, - Doc: Docs["S1000"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1001": { - Name: "S1001", - Run: LintLoopCopy, - Doc: Docs["S1001"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1002": { - Name: "S1002", - Run: LintIfBoolCmp, - Doc: Docs["S1002"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1003": { - Name: "S1003", - Run: LintStringsContains, - Doc: Docs["S1003"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1004": { - Name: "S1004", - Run: LintBytesCompare, - Doc: Docs["S1004"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1005": { - Name: "S1005", - Run: LintUnnecessaryBlank, - Doc: Docs["S1005"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1006": { - Name: "S1006", - Run: LintForTrue, - Doc: Docs["S1006"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1007": { - Name: "S1007", - Run: LintRegexpRaw, - Doc: Docs["S1007"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1008": { - Name: "S1008", - Run: LintIfReturn, - Doc: Docs["S1008"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1009": { - Name: "S1009", - Run: LintRedundantNilCheckWithLen, - Doc: Docs["S1009"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1010": { - Name: "S1010", - Run: LintSlicing, - Doc: Docs["S1010"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1011": { - Name: "S1011", - Run: LintLoopAppend, - Doc: Docs["S1011"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1012": { - Name: "S1012", - Run: LintTimeSince, - Doc: Docs["S1012"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1016": { - Name: "S1016", - Run: LintSimplerStructConversion, - Doc: Docs["S1016"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1017": { - Name: "S1017", - Run: LintTrim, - Doc: Docs["S1017"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1018": { - Name: "S1018", - Run: LintLoopSlide, - Doc: Docs["S1018"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1019": { - Name: "S1019", - Run: LintMakeLenCap, - Doc: Docs["S1019"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1020": { - Name: "S1020", - Run: LintAssertNotNil, - Doc: Docs["S1020"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1021": { - Name: "S1021", - Run: LintDeclareAssign, - Doc: Docs["S1021"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1023": { - Name: "S1023", - Run: LintRedundantBreak, - Doc: Docs["S1023"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1024": { - Name: "S1024", - Run: LintTimeUntil, - Doc: Docs["S1024"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1025": { - Name: "S1025", - Run: LintRedundantSprintf, - Doc: Docs["S1025"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1028": { - Name: "S1028", - Run: LintErrorsNewSprintf, - Doc: Docs["S1028"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1029": { - Name: "S1029", - Run: LintRangeStringRunes, - Doc: Docs["S1029"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "S1030": { - Name: "S1030", - Run: LintBytesBufferConversions, - Doc: Docs["S1030"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1031": { - Name: "S1031", - Run: LintNilCheckAroundRange, - Doc: Docs["S1031"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1032": { - Name: "S1032", - Run: LintSortHelpers, - Doc: Docs["S1032"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1033": { - Name: "S1033", - Run: LintGuardedDelete, - Doc: Docs["S1033"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "S1034": { - Name: "S1034", - Run: LintSimplifyTypeSwitch, - Doc: Docs["S1034"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, -} diff --git a/vendor/honnef.co/go/tools/simple/doc.go b/vendor/honnef.co/go/tools/simple/doc.go deleted file mode 100644 index eb0072de5dc..00000000000 --- a/vendor/honnef.co/go/tools/simple/doc.go +++ /dev/null @@ -1,425 +0,0 @@ -package simple - -import "honnef.co/go/tools/lint" - -var Docs = map[string]*lint.Documentation{ - "S1000": &lint.Documentation{ - Title: `Use plain channel send or receive instead of single-case select`, - Text: `Select statements with a single case can be replaced with a simple -send or receive. - -Before: - - select { - case x := <-ch: - fmt.Println(x) - } - -After: - - x := <-ch - fmt.Println(x)`, - Since: "2017.1", - }, - - "S1001": &lint.Documentation{ - Title: `Replace for loop with call to copy`, - Text: `Use copy() for copying elements from one slice to another. - -Before: - - for i, x := range src { - dst[i] = x - } - -After: - - copy(dst, src)`, - Since: "2017.1", - }, - - "S1002": &lint.Documentation{ - Title: `Omit comparison with boolean constant`, - Text: `Before: - - if x == true {} - -After: - - if x {}`, - Since: "2017.1", - }, - - "S1003": &lint.Documentation{ - Title: `Replace call to strings.Index with strings.Contains`, - Text: `Before: - - if strings.Index(x, y) != -1 {} - -After: - - if strings.Contains(x, y) {}`, - Since: "2017.1", - }, - - "S1004": &lint.Documentation{ - Title: `Replace call to bytes.Compare with bytes.Equal`, - Text: `Before: - - if bytes.Compare(x, y) == 0 {} - -After: - - if bytes.Equal(x, y) {}`, - Since: "2017.1", - }, - - "S1005": &lint.Documentation{ - Title: `Drop unnecessary use of the blank identifier`, - Text: `In many cases, assigning to the blank identifier is unnecessary. - -Before: - - for _ = range s {} - x, _ = someMap[key] - _ = <-ch - -After: - - for range s{} - x = someMap[key] - <-ch`, - Since: "2017.1", - }, - - "S1006": &lint.Documentation{ - Title: `Use for { ... } for infinite loops`, - Text: `For infinite loops, using for { ... } is the most idiomatic choice.`, - Since: "2017.1", - }, - - "S1007": &lint.Documentation{ - Title: `Simplify regular expression by using raw string literal`, - Text: `Raw string literals use ` + "`" + ` instead of " and do not support -any escape sequences. This means that the backslash (\) can be used -freely, without the need of escaping. - -Since regular expressions have their own escape sequences, raw strings -can improve their readability. - -Before: - - regexp.Compile("\\A(\\w+) profile: total \\d+\\n\\z") - -After: - - regexp.Compile(` + "`" + `\A(\w+) profile: total \d+\n\z` + "`" + `)`, - Since: "2017.1", - }, - - "S1008": &lint.Documentation{ - Title: `Simplify returning boolean expression`, - Text: `Before: - - if { - return true - } - return false - -After: - - return `, - Since: "2017.1", - }, - - "S1009": &lint.Documentation{ - Title: `Omit redundant nil check on slices`, - Text: `The len function is defined for all slices, even nil ones, which have -a length of zero. It is not necessary to check if a slice is not nil -before checking that its length is not zero. - -Before: - - if x != nil && len(x) != 0 {} - -After: - - if len(x) != 0 {}`, - Since: "2017.1", - }, - - "S1010": &lint.Documentation{ - Title: `Omit default slice index`, - Text: `When slicing, the second index defaults to the length of the value, -making s[n:len(s)] and s[n:] equivalent.`, - Since: "2017.1", - }, - - "S1011": &lint.Documentation{ - Title: `Use a single append to concatenate two slices`, - Text: `Before: - - for _, e := range y { - x = append(x, e) - } - -After: - - x = append(x, y...)`, - Since: "2017.1", - }, - - "S1012": &lint.Documentation{ - Title: `Replace time.Now().Sub(x) with time.Since(x)`, - Text: `The time.Since helper has the same effect as using time.Now().Sub(x) -but is easier to read. - -Before: - - time.Now().Sub(x) - -After: - - time.Since(x)`, - Since: "2017.1", - }, - - "S1016": &lint.Documentation{ - Title: `Use a type conversion instead of manually copying struct fields`, - Text: `Two struct types with identical fields can be converted between each -other. In older versions of Go, the fields had to have identical -struct tags. Since Go 1.8, however, struct tags are ignored during -conversions. It is thus not necessary to manually copy every field -individually. - -Before: - - var x T1 - y := T2{ - Field1: x.Field1, - Field2: x.Field2, - } - -After: - - var x T1 - y := T2(x)`, - Since: "2017.1", - }, - - "S1017": &lint.Documentation{ - Title: `Replace manual trimming with strings.TrimPrefix`, - Text: `Instead of using strings.HasPrefix and manual slicing, use the -strings.TrimPrefix function. If the string doesn't start with the -prefix, the original string will be returned. Using strings.TrimPrefix -reduces complexity, and avoids common bugs, such as off-by-one -mistakes. - -Before: - - if strings.HasPrefix(str, prefix) { - str = str[len(prefix):] - } - -After: - - str = strings.TrimPrefix(str, prefix)`, - Since: "2017.1", - }, - - "S1018": &lint.Documentation{ - Title: `Use copy for sliding elements`, - Text: `copy() permits using the same source and destination slice, even with -overlapping ranges. This makes it ideal for sliding elements in a -slice. - -Before: - - for i := 0; i < n; i++ { - bs[i] = bs[offset+i] - } - -After: - - copy(bs[:n], bs[offset:])`, - Since: "2017.1", - }, - - "S1019": &lint.Documentation{ - Title: `Simplify make call by omitting redundant arguments`, - Text: `The make function has default values for the length and capacity -arguments. For channels and maps, the length defaults to zero. -Additionally, for slices the capacity defaults to the length.`, - Since: "2017.1", - }, - - "S1020": &lint.Documentation{ - Title: `Omit redundant nil check in type assertion`, - Text: `Before: - - if _, ok := i.(T); ok && i != nil {} - -After: - - if _, ok := i.(T); ok {}`, - Since: "2017.1", - }, - - "S1021": &lint.Documentation{ - Title: `Merge variable declaration and assignment`, - Text: `Before: - - var x uint - x = 1 - -After: - - var x uint = 1`, - Since: "2017.1", - }, - - "S1023": &lint.Documentation{ - Title: `Omit redundant control flow`, - Text: `Functions that have no return value do not need a return statement as -the final statement of the function. - -Switches in Go do not have automatic fallthrough, unlike languages -like C. It is not necessary to have a break statement as the final -statement in a case block.`, - Since: "2017.1", - }, - - "S1024": &lint.Documentation{ - Title: `Replace x.Sub(time.Now()) with time.Until(x)`, - Text: `The time.Until helper has the same effect as using x.Sub(time.Now()) -but is easier to read. - -Before: - - x.Sub(time.Now()) - -After: - - time.Until(x)`, - Since: "2017.1", - }, - - "S1025": &lint.Documentation{ - Title: `Don't use fmt.Sprintf("%s", x) unnecessarily`, - Text: `In many instances, there are easier and more efficient ways of getting -a value's string representation. Whenever a value's underlying type is -a string already, or the type has a String method, they should be used -directly. - -Given the following shared definitions - - type T1 string - type T2 int - - func (T2) String() string { return "Hello, world" } - - var x string - var y T1 - var z T2 - -we can simplify the following - - fmt.Sprintf("%s", x) - fmt.Sprintf("%s", y) - fmt.Sprintf("%s", z) - -to - - x - string(y) - z.String()`, - Since: "2017.1", - }, - - "S1028": &lint.Documentation{ - Title: `Simplify error construction with fmt.Errorf`, - Text: `Before: - - errors.New(fmt.Sprintf(...)) - -After: - - fmt.Errorf(...)`, - Since: "2017.1", - }, - - "S1029": &lint.Documentation{ - Title: `Range over the string directly`, - Text: `Ranging over a string will yield byte offsets and runes. If the offset -isn't used, this is functionally equivalent to converting the string -to a slice of runes and ranging over that. Ranging directly over the -string will be more performant, however, as it avoids allocating a new -slice, the size of which depends on the length of the string. - -Before: - - for _, r := range []rune(s) {} - -After: - - for _, r := range s {}`, - Since: "2017.1", - }, - - "S1030": &lint.Documentation{ - Title: `Use bytes.Buffer.String or bytes.Buffer.Bytes`, - Text: `bytes.Buffer has both a String and a Bytes method. It is never -necessary to use string(buf.Bytes()) or []byte(buf.String()) – simply -use the other method.`, - Since: "2017.1", - }, - - "S1031": &lint.Documentation{ - Title: `Omit redundant nil check around loop`, - Text: `You can use range on nil slices and maps, the loop will simply never -execute. This makes an additional nil check around the loop -unnecessary. - -Before: - - if s != nil { - for _, x := range s { - ... - } - } - -After: - - for _, x := range s { - ... - }`, - Since: "2017.1", - }, - - "S1032": &lint.Documentation{ - Title: `Use sort.Ints(x), sort.Float64s(x), and sort.Strings(x)`, - Text: `The sort.Ints, sort.Float64s and sort.Strings functions are easier to -read than sort.Sort(sort.IntSlice(x)), sort.Sort(sort.Float64Slice(x)) -and sort.Sort(sort.StringSlice(x)). - -Before: - - sort.Sort(sort.StringSlice(x)) - -After: - - sort.Strings(x)`, - Since: "2019.1", - }, - - "S1033": &lint.Documentation{ - Title: `Unnecessary guard around call to delete`, - Text: `Calling delete on a nil map is a no-op.`, - Since: "2019.2", - }, - - "S1034": &lint.Documentation{ - Title: `Use result of type assertion to simplify cases`, - Since: "2019.2", - }, -} diff --git a/vendor/honnef.co/go/tools/simple/lint.go b/vendor/honnef.co/go/tools/simple/lint.go deleted file mode 100644 index c78a7bb7a42..00000000000 --- a/vendor/honnef.co/go/tools/simple/lint.go +++ /dev/null @@ -1,1816 +0,0 @@ -// Package simple contains a linter for Go source code. -package simple // import "honnef.co/go/tools/simple" - -import ( - "fmt" - "go/ast" - "go/constant" - "go/token" - "go/types" - "reflect" - "sort" - "strings" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/analysis/passes/inspect" - "golang.org/x/tools/go/ast/inspector" - "golang.org/x/tools/go/types/typeutil" - . "honnef.co/go/tools/arg" - "honnef.co/go/tools/internal/passes/buildssa" - "honnef.co/go/tools/internal/sharedcheck" - "honnef.co/go/tools/lint" - . "honnef.co/go/tools/lint/lintdsl" -) - -func LintSingleCaseSelect(pass *analysis.Pass) (interface{}, error) { - isSingleSelect := func(node ast.Node) bool { - v, ok := node.(*ast.SelectStmt) - if !ok { - return false - } - return len(v.Body.List) == 1 - } - - seen := map[ast.Node]struct{}{} - fn := func(node ast.Node) { - switch v := node.(type) { - case *ast.ForStmt: - if len(v.Body.List) != 1 { - return - } - if !isSingleSelect(v.Body.List[0]) { - return - } - if _, ok := v.Body.List[0].(*ast.SelectStmt).Body.List[0].(*ast.CommClause).Comm.(*ast.SendStmt); ok { - // Don't suggest using range for channel sends - return - } - seen[v.Body.List[0]] = struct{}{} - ReportNodefFG(pass, node, "should use for range instead of for { select {} }") - case *ast.SelectStmt: - if _, ok := seen[v]; ok { - return - } - if !isSingleSelect(v) { - return - } - ReportNodefFG(pass, node, "should use a simple channel send/receive instead of select with a single case") - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil), (*ast.SelectStmt)(nil)}, fn) - return nil, nil -} - -func LintLoopCopy(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - loop := node.(*ast.RangeStmt) - - if loop.Key == nil { - return - } - if len(loop.Body.List) != 1 { - return - } - stmt, ok := loop.Body.List[0].(*ast.AssignStmt) - if !ok { - return - } - if stmt.Tok != token.ASSIGN || len(stmt.Lhs) != 1 || len(stmt.Rhs) != 1 { - return - } - lhs, ok := stmt.Lhs[0].(*ast.IndexExpr) - if !ok { - return - } - - if _, ok := pass.TypesInfo.TypeOf(lhs.X).(*types.Slice); !ok { - return - } - lidx, ok := lhs.Index.(*ast.Ident) - if !ok { - return - } - key, ok := loop.Key.(*ast.Ident) - if !ok { - return - } - if pass.TypesInfo.TypeOf(lhs) == nil || pass.TypesInfo.TypeOf(stmt.Rhs[0]) == nil { - return - } - if pass.TypesInfo.ObjectOf(lidx) != pass.TypesInfo.ObjectOf(key) { - return - } - if !types.Identical(pass.TypesInfo.TypeOf(lhs), pass.TypesInfo.TypeOf(stmt.Rhs[0])) { - return - } - if _, ok := pass.TypesInfo.TypeOf(loop.X).(*types.Slice); !ok { - return - } - - if rhs, ok := stmt.Rhs[0].(*ast.IndexExpr); ok { - rx, ok := rhs.X.(*ast.Ident) - _ = rx - if !ok { - return - } - ridx, ok := rhs.Index.(*ast.Ident) - if !ok { - return - } - if pass.TypesInfo.ObjectOf(ridx) != pass.TypesInfo.ObjectOf(key) { - return - } - } else if rhs, ok := stmt.Rhs[0].(*ast.Ident); ok { - value, ok := loop.Value.(*ast.Ident) - if !ok { - return - } - if pass.TypesInfo.ObjectOf(rhs) != pass.TypesInfo.ObjectOf(value) { - return - } - } else { - return - } - ReportNodefFG(pass, loop, "should use copy() instead of a loop") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.RangeStmt)(nil)}, fn) - return nil, nil -} - -func LintIfBoolCmp(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - expr := node.(*ast.BinaryExpr) - if expr.Op != token.EQL && expr.Op != token.NEQ { - return - } - x := IsBoolConst(pass, expr.X) - y := IsBoolConst(pass, expr.Y) - if !x && !y { - return - } - var other ast.Expr - var val bool - if x { - val = BoolConst(pass, expr.X) - other = expr.Y - } else { - val = BoolConst(pass, expr.Y) - other = expr.X - } - basic, ok := pass.TypesInfo.TypeOf(other).Underlying().(*types.Basic) - if !ok || basic.Kind() != types.Bool { - return - } - op := "" - if (expr.Op == token.EQL && !val) || (expr.Op == token.NEQ && val) { - op = "!" - } - r := op + Render(pass, other) - l1 := len(r) - r = strings.TrimLeft(r, "!") - if (l1-len(r))%2 == 1 { - r = "!" + r - } - if IsInTest(pass, node) { - return - } - ReportNodefFG(pass, expr, "should omit comparison to bool constant, can be simplified to %s", r) - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn) - return nil, nil -} - -func LintBytesBufferConversions(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - call := node.(*ast.CallExpr) - if len(call.Args) != 1 { - return - } - - argCall, ok := call.Args[0].(*ast.CallExpr) - if !ok { - return - } - sel, ok := argCall.Fun.(*ast.SelectorExpr) - if !ok { - return - } - - typ := pass.TypesInfo.TypeOf(call.Fun) - if typ == types.Universe.Lookup("string").Type() && IsCallToAST(pass, call.Args[0], "(*bytes.Buffer).Bytes") { - ReportNodefFG(pass, call, "should use %v.String() instead of %v", Render(pass, sel.X), Render(pass, call)) - } else if typ, ok := typ.(*types.Slice); ok && typ.Elem() == types.Universe.Lookup("byte").Type() && IsCallToAST(pass, call.Args[0], "(*bytes.Buffer).String") { - ReportNodefFG(pass, call, "should use %v.Bytes() instead of %v", Render(pass, sel.X), Render(pass, call)) - } - - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func LintStringsContains(pass *analysis.Pass) (interface{}, error) { - // map of value to token to bool value - allowed := map[int64]map[token.Token]bool{ - -1: {token.GTR: true, token.NEQ: true, token.EQL: false}, - 0: {token.GEQ: true, token.LSS: false}, - } - fn := func(node ast.Node) { - expr := node.(*ast.BinaryExpr) - switch expr.Op { - case token.GEQ, token.GTR, token.NEQ, token.LSS, token.EQL: - default: - return - } - - value, ok := ExprToInt(pass, expr.Y) - if !ok { - return - } - - allowedOps, ok := allowed[value] - if !ok { - return - } - b, ok := allowedOps[expr.Op] - if !ok { - return - } - - call, ok := expr.X.(*ast.CallExpr) - if !ok { - return - } - sel, ok := call.Fun.(*ast.SelectorExpr) - if !ok { - return - } - pkgIdent, ok := sel.X.(*ast.Ident) - if !ok { - return - } - funIdent := sel.Sel - if pkgIdent.Name != "strings" && pkgIdent.Name != "bytes" { - return - } - newFunc := "" - switch funIdent.Name { - case "IndexRune": - newFunc = "ContainsRune" - case "IndexAny": - newFunc = "ContainsAny" - case "Index": - newFunc = "Contains" - default: - return - } - - prefix := "" - if !b { - prefix = "!" - } - ReportNodefFG(pass, node, "should use %s%s.%s(%s) instead", prefix, pkgIdent.Name, newFunc, RenderArgs(pass, call.Args)) - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn) - return nil, nil -} - -func LintBytesCompare(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - expr := node.(*ast.BinaryExpr) - if expr.Op != token.NEQ && expr.Op != token.EQL { - return - } - call, ok := expr.X.(*ast.CallExpr) - if !ok { - return - } - if !IsCallToAST(pass, call, "bytes.Compare") { - return - } - value, ok := ExprToInt(pass, expr.Y) - if !ok || value != 0 { - return - } - args := RenderArgs(pass, call.Args) - prefix := "" - if expr.Op == token.NEQ { - prefix = "!" - } - ReportNodefFG(pass, node, "should use %sbytes.Equal(%s) instead", prefix, args) - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn) - return nil, nil -} - -func LintForTrue(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - loop := node.(*ast.ForStmt) - if loop.Init != nil || loop.Post != nil { - return - } - if !IsBoolConst(pass, loop.Cond) || !BoolConst(pass, loop.Cond) { - return - } - ReportNodefFG(pass, loop, "should use for {} instead of for true {}") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil)}, fn) - return nil, nil -} - -func LintRegexpRaw(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - call := node.(*ast.CallExpr) - if !IsCallToAST(pass, call, "regexp.MustCompile") && - !IsCallToAST(pass, call, "regexp.Compile") { - return - } - sel, ok := call.Fun.(*ast.SelectorExpr) - if !ok { - return - } - if len(call.Args) != 1 { - // invalid function call - return - } - lit, ok := call.Args[Arg("regexp.Compile.expr")].(*ast.BasicLit) - if !ok { - // TODO(dominikh): support string concat, maybe support constants - return - } - if lit.Kind != token.STRING { - // invalid function call - return - } - if lit.Value[0] != '"' { - // already a raw string - return - } - val := lit.Value - if !strings.Contains(val, `\\`) { - return - } - if strings.Contains(val, "`") { - return - } - - bs := false - for _, c := range val { - if !bs && c == '\\' { - bs = true - continue - } - if bs && c == '\\' { - bs = false - continue - } - if bs { - // backslash followed by non-backslash -> escape sequence - return - } - } - - ReportNodefFG(pass, call, "should use raw string (`...`) with regexp.%s to avoid having to escape twice", sel.Sel.Name) - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func LintIfReturn(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - block := node.(*ast.BlockStmt) - l := len(block.List) - if l < 2 { - return - } - n1, n2 := block.List[l-2], block.List[l-1] - - if len(block.List) >= 3 { - if _, ok := block.List[l-3].(*ast.IfStmt); ok { - // Do not flag a series of if statements - return - } - } - // if statement with no init, no else, a single condition - // checking an identifier or function call and just a return - // statement in the body, that returns a boolean constant - ifs, ok := n1.(*ast.IfStmt) - if !ok { - return - } - if ifs.Else != nil || ifs.Init != nil { - return - } - if len(ifs.Body.List) != 1 { - return - } - if op, ok := ifs.Cond.(*ast.BinaryExpr); ok { - switch op.Op { - case token.EQL, token.LSS, token.GTR, token.NEQ, token.LEQ, token.GEQ: - default: - return - } - } - ret1, ok := ifs.Body.List[0].(*ast.ReturnStmt) - if !ok { - return - } - if len(ret1.Results) != 1 { - return - } - if !IsBoolConst(pass, ret1.Results[0]) { - return - } - - ret2, ok := n2.(*ast.ReturnStmt) - if !ok { - return - } - if len(ret2.Results) != 1 { - return - } - if !IsBoolConst(pass, ret2.Results[0]) { - return - } - - if ret1.Results[0].(*ast.Ident).Name == ret2.Results[0].(*ast.Ident).Name { - // we want the function to return true and false, not the - // same value both times. - return - } - - ReportNodefFG(pass, n1, "should use 'return ' instead of 'if { return }; return '") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BlockStmt)(nil)}, fn) - return nil, nil -} - -// LintRedundantNilCheckWithLen checks for the following reduntant nil-checks: -// -// if x == nil || len(x) == 0 {} -// if x != nil && len(x) != 0 {} -// if x != nil && len(x) == N {} (where N != 0) -// if x != nil && len(x) > N {} -// if x != nil && len(x) >= N {} (where N != 0) -// -func LintRedundantNilCheckWithLen(pass *analysis.Pass) (interface{}, error) { - isConstZero := func(expr ast.Expr) (isConst bool, isZero bool) { - _, ok := expr.(*ast.BasicLit) - if ok { - return true, IsZero(expr) - } - id, ok := expr.(*ast.Ident) - if !ok { - return false, false - } - c, ok := pass.TypesInfo.ObjectOf(id).(*types.Const) - if !ok { - return false, false - } - return true, c.Val().Kind() == constant.Int && c.Val().String() == "0" - } - - fn := func(node ast.Node) { - // check that expr is "x || y" or "x && y" - expr := node.(*ast.BinaryExpr) - if expr.Op != token.LOR && expr.Op != token.LAND { - return - } - eqNil := expr.Op == token.LOR - - // check that x is "xx == nil" or "xx != nil" - x, ok := expr.X.(*ast.BinaryExpr) - if !ok { - return - } - if eqNil && x.Op != token.EQL { - return - } - if !eqNil && x.Op != token.NEQ { - return - } - xx, ok := x.X.(*ast.Ident) - if !ok { - return - } - if !IsNil(pass, x.Y) { - return - } - - // check that y is "len(xx) == 0" or "len(xx) ... " - y, ok := expr.Y.(*ast.BinaryExpr) - if !ok { - return - } - if eqNil && y.Op != token.EQL { // must be len(xx) *==* 0 - return - } - yx, ok := y.X.(*ast.CallExpr) - if !ok { - return - } - yxFun, ok := yx.Fun.(*ast.Ident) - if !ok || yxFun.Name != "len" || len(yx.Args) != 1 { - return - } - yxArg, ok := yx.Args[Arg("len.v")].(*ast.Ident) - if !ok { - return - } - if yxArg.Name != xx.Name { - return - } - - if eqNil && !IsZero(y.Y) { // must be len(x) == *0* - return - } - - if !eqNil { - isConst, isZero := isConstZero(y.Y) - if !isConst { - return - } - switch y.Op { - case token.EQL: - // avoid false positive for "xx != nil && len(xx) == 0" - if isZero { - return - } - case token.GEQ: - // avoid false positive for "xx != nil && len(xx) >= 0" - if isZero { - return - } - case token.NEQ: - // avoid false positive for "xx != nil && len(xx) != " - if !isZero { - return - } - case token.GTR: - // ok - default: - return - } - } - - // finally check that xx type is one of array, slice, map or chan - // this is to prevent false positive in case if xx is a pointer to an array - var nilType string - switch pass.TypesInfo.TypeOf(xx).(type) { - case *types.Slice: - nilType = "nil slices" - case *types.Map: - nilType = "nil maps" - case *types.Chan: - nilType = "nil channels" - default: - return - } - ReportNodefFG(pass, expr, "should omit nil check; len() for %s is defined as zero", nilType) - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn) - return nil, nil -} - -func LintSlicing(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - n := node.(*ast.SliceExpr) - if n.Max != nil { - return - } - s, ok := n.X.(*ast.Ident) - if !ok || s.Obj == nil { - return - } - call, ok := n.High.(*ast.CallExpr) - if !ok || len(call.Args) != 1 || call.Ellipsis.IsValid() { - return - } - fun, ok := call.Fun.(*ast.Ident) - if !ok || fun.Name != "len" { - return - } - if _, ok := pass.TypesInfo.ObjectOf(fun).(*types.Builtin); !ok { - return - } - arg, ok := call.Args[Arg("len.v")].(*ast.Ident) - if !ok || arg.Obj != s.Obj { - return - } - ReportNodefFG(pass, n, "should omit second index in slice, s[a:len(s)] is identical to s[a:]") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.SliceExpr)(nil)}, fn) - return nil, nil -} - -func refersTo(pass *analysis.Pass, expr ast.Expr, ident *ast.Ident) bool { - found := false - fn := func(node ast.Node) bool { - ident2, ok := node.(*ast.Ident) - if !ok { - return true - } - if pass.TypesInfo.ObjectOf(ident) == pass.TypesInfo.ObjectOf(ident2) { - found = true - return false - } - return true - } - ast.Inspect(expr, fn) - return found -} - -func LintLoopAppend(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - loop := node.(*ast.RangeStmt) - if !IsBlank(loop.Key) { - return - } - val, ok := loop.Value.(*ast.Ident) - if !ok { - return - } - if len(loop.Body.List) != 1 { - return - } - stmt, ok := loop.Body.List[0].(*ast.AssignStmt) - if !ok { - return - } - if stmt.Tok != token.ASSIGN || len(stmt.Lhs) != 1 || len(stmt.Rhs) != 1 { - return - } - if refersTo(pass, stmt.Lhs[0], val) { - return - } - call, ok := stmt.Rhs[0].(*ast.CallExpr) - if !ok { - return - } - if len(call.Args) != 2 || call.Ellipsis.IsValid() { - return - } - fun, ok := call.Fun.(*ast.Ident) - if !ok { - return - } - obj := pass.TypesInfo.ObjectOf(fun) - fn, ok := obj.(*types.Builtin) - if !ok || fn.Name() != "append" { - return - } - - src := pass.TypesInfo.TypeOf(loop.X) - dst := pass.TypesInfo.TypeOf(call.Args[Arg("append.slice")]) - // TODO(dominikh) remove nil check once Go issue #15173 has - // been fixed - if src == nil { - return - } - if !types.Identical(src, dst) { - return - } - - if Render(pass, stmt.Lhs[0]) != Render(pass, call.Args[Arg("append.slice")]) { - return - } - - el, ok := call.Args[Arg("append.elems")].(*ast.Ident) - if !ok { - return - } - if pass.TypesInfo.ObjectOf(val) != pass.TypesInfo.ObjectOf(el) { - return - } - ReportNodefFG(pass, loop, "should replace loop with %s = append(%s, %s...)", - Render(pass, stmt.Lhs[0]), Render(pass, call.Args[Arg("append.slice")]), Render(pass, loop.X)) - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.RangeStmt)(nil)}, fn) - return nil, nil -} - -func LintTimeSince(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - call := node.(*ast.CallExpr) - sel, ok := call.Fun.(*ast.SelectorExpr) - if !ok { - return - } - if !IsCallToAST(pass, sel.X, "time.Now") { - return - } - if sel.Sel.Name != "Sub" { - return - } - ReportNodefFG(pass, call, "should use time.Since instead of time.Now().Sub") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func LintTimeUntil(pass *analysis.Pass) (interface{}, error) { - if !IsGoVersion(pass, 8) { - return nil, nil - } - fn := func(node ast.Node) { - call := node.(*ast.CallExpr) - if !IsCallToAST(pass, call, "(time.Time).Sub") { - return - } - if !IsCallToAST(pass, call.Args[Arg("(time.Time).Sub.u")], "time.Now") { - return - } - ReportNodefFG(pass, call, "should use time.Until instead of t.Sub(time.Now())") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func LintUnnecessaryBlank(pass *analysis.Pass) (interface{}, error) { - fn1 := func(node ast.Node) { - assign := node.(*ast.AssignStmt) - if len(assign.Lhs) != 2 || len(assign.Rhs) != 1 { - return - } - if !IsBlank(assign.Lhs[1]) { - return - } - switch rhs := assign.Rhs[0].(type) { - case *ast.IndexExpr: - // The type-checker should make sure that it's a map, but - // let's be safe. - if _, ok := pass.TypesInfo.TypeOf(rhs.X).Underlying().(*types.Map); !ok { - return - } - case *ast.UnaryExpr: - if rhs.Op != token.ARROW { - return - } - default: - return - } - cp := *assign - cp.Lhs = cp.Lhs[0:1] - ReportNodefFG(pass, assign, "should write %s instead of %s", Render(pass, &cp), Render(pass, assign)) - } - - fn2 := func(node ast.Node) { - stmt := node.(*ast.AssignStmt) - if len(stmt.Lhs) != len(stmt.Rhs) { - return - } - for i, lh := range stmt.Lhs { - rh := stmt.Rhs[i] - if !IsBlank(lh) { - continue - } - expr, ok := rh.(*ast.UnaryExpr) - if !ok { - continue - } - if expr.Op != token.ARROW { - continue - } - ReportNodefFG(pass, lh, "'_ = <-ch' can be simplified to '<-ch'") - } - } - - fn3 := func(node ast.Node) { - rs := node.(*ast.RangeStmt) - - // for x, _ - if !IsBlank(rs.Key) && IsBlank(rs.Value) { - ReportNodefFG(pass, rs.Value, "should omit value from range; this loop is equivalent to `for %s %s range ...`", Render(pass, rs.Key), rs.Tok) - } - // for _, _ || for _ - if IsBlank(rs.Key) && (IsBlank(rs.Value) || rs.Value == nil) { - ReportNodefFG(pass, rs.Key, "should omit values from range; this loop is equivalent to `for range ...`") - } - } - - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.AssignStmt)(nil)}, fn1) - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.AssignStmt)(nil)}, fn2) - if IsGoVersion(pass, 4) { - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.RangeStmt)(nil)}, fn3) - } - return nil, nil -} - -func LintSimplerStructConversion(pass *analysis.Pass) (interface{}, error) { - var skip ast.Node - fn := func(node ast.Node) { - // Do not suggest type conversion between pointers - if unary, ok := node.(*ast.UnaryExpr); ok && unary.Op == token.AND { - if lit, ok := unary.X.(*ast.CompositeLit); ok { - skip = lit - } - return - } - - if node == skip { - return - } - - lit, ok := node.(*ast.CompositeLit) - if !ok { - return - } - typ1, _ := pass.TypesInfo.TypeOf(lit.Type).(*types.Named) - if typ1 == nil { - return - } - s1, ok := typ1.Underlying().(*types.Struct) - if !ok { - return - } - - var typ2 *types.Named - var ident *ast.Ident - getSelType := func(expr ast.Expr) (types.Type, *ast.Ident, bool) { - sel, ok := expr.(*ast.SelectorExpr) - if !ok { - return nil, nil, false - } - ident, ok := sel.X.(*ast.Ident) - if !ok { - return nil, nil, false - } - typ := pass.TypesInfo.TypeOf(sel.X) - return typ, ident, typ != nil - } - if len(lit.Elts) == 0 { - return - } - if s1.NumFields() != len(lit.Elts) { - return - } - for i, elt := range lit.Elts { - var t types.Type - var id *ast.Ident - var ok bool - switch elt := elt.(type) { - case *ast.SelectorExpr: - t, id, ok = getSelType(elt) - if !ok { - return - } - if i >= s1.NumFields() || s1.Field(i).Name() != elt.Sel.Name { - return - } - case *ast.KeyValueExpr: - var sel *ast.SelectorExpr - sel, ok = elt.Value.(*ast.SelectorExpr) - if !ok { - return - } - - if elt.Key.(*ast.Ident).Name != sel.Sel.Name { - return - } - t, id, ok = getSelType(elt.Value) - } - if !ok { - return - } - // All fields must be initialized from the same object - if ident != nil && ident.Obj != id.Obj { - return - } - typ2, _ = t.(*types.Named) - if typ2 == nil { - return - } - ident = id - } - - if typ2 == nil { - return - } - - if typ1.Obj().Pkg() != typ2.Obj().Pkg() { - // Do not suggest type conversions between different - // packages. Types in different packages might only match - // by coincidence. Furthermore, if the dependency ever - // adds more fields to its type, it could break the code - // that relies on the type conversion to work. - return - } - - s2, ok := typ2.Underlying().(*types.Struct) - if !ok { - return - } - if typ1 == typ2 { - return - } - if IsGoVersion(pass, 8) { - if !types.IdenticalIgnoreTags(s1, s2) { - return - } - } else { - if !types.Identical(s1, s2) { - return - } - } - ReportNodefFG(pass, node, "should convert %s (type %s) to %s instead of using struct literal", - ident.Name, typ2.Obj().Name(), typ1.Obj().Name()) - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.UnaryExpr)(nil), (*ast.CompositeLit)(nil)}, fn) - return nil, nil -} - -func LintTrim(pass *analysis.Pass) (interface{}, error) { - sameNonDynamic := func(node1, node2 ast.Node) bool { - if reflect.TypeOf(node1) != reflect.TypeOf(node2) { - return false - } - - switch node1 := node1.(type) { - case *ast.Ident: - return node1.Obj == node2.(*ast.Ident).Obj - case *ast.SelectorExpr: - return Render(pass, node1) == Render(pass, node2) - case *ast.IndexExpr: - return Render(pass, node1) == Render(pass, node2) - } - return false - } - - isLenOnIdent := func(fn ast.Expr, ident ast.Expr) bool { - call, ok := fn.(*ast.CallExpr) - if !ok { - return false - } - if fn, ok := call.Fun.(*ast.Ident); !ok || fn.Name != "len" { - return false - } - if len(call.Args) != 1 { - return false - } - return sameNonDynamic(call.Args[Arg("len.v")], ident) - } - - fn := func(node ast.Node) { - var pkg string - var fun string - - ifstmt := node.(*ast.IfStmt) - if ifstmt.Init != nil { - return - } - if ifstmt.Else != nil { - return - } - if len(ifstmt.Body.List) != 1 { - return - } - condCall, ok := ifstmt.Cond.(*ast.CallExpr) - if !ok { - return - } - switch { - case IsCallToAST(pass, condCall, "strings.HasPrefix"): - pkg = "strings" - fun = "HasPrefix" - case IsCallToAST(pass, condCall, "strings.HasSuffix"): - pkg = "strings" - fun = "HasSuffix" - case IsCallToAST(pass, condCall, "strings.Contains"): - pkg = "strings" - fun = "Contains" - case IsCallToAST(pass, condCall, "bytes.HasPrefix"): - pkg = "bytes" - fun = "HasPrefix" - case IsCallToAST(pass, condCall, "bytes.HasSuffix"): - pkg = "bytes" - fun = "HasSuffix" - case IsCallToAST(pass, condCall, "bytes.Contains"): - pkg = "bytes" - fun = "Contains" - default: - return - } - - assign, ok := ifstmt.Body.List[0].(*ast.AssignStmt) - if !ok { - return - } - if assign.Tok != token.ASSIGN { - return - } - if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 { - return - } - if !sameNonDynamic(condCall.Args[0], assign.Lhs[0]) { - return - } - - switch rhs := assign.Rhs[0].(type) { - case *ast.CallExpr: - if len(rhs.Args) < 2 || !sameNonDynamic(condCall.Args[0], rhs.Args[0]) || !sameNonDynamic(condCall.Args[1], rhs.Args[1]) { - return - } - if IsCallToAST(pass, condCall, "strings.HasPrefix") && IsCallToAST(pass, rhs, "strings.TrimPrefix") || - IsCallToAST(pass, condCall, "strings.HasSuffix") && IsCallToAST(pass, rhs, "strings.TrimSuffix") || - IsCallToAST(pass, condCall, "strings.Contains") && IsCallToAST(pass, rhs, "strings.Replace") || - IsCallToAST(pass, condCall, "bytes.HasPrefix") && IsCallToAST(pass, rhs, "bytes.TrimPrefix") || - IsCallToAST(pass, condCall, "bytes.HasSuffix") && IsCallToAST(pass, rhs, "bytes.TrimSuffix") || - IsCallToAST(pass, condCall, "bytes.Contains") && IsCallToAST(pass, rhs, "bytes.Replace") { - ReportNodefFG(pass, ifstmt, "should replace this if statement with an unconditional %s", CallNameAST(pass, rhs)) - } - return - case *ast.SliceExpr: - slice := rhs - if !ok { - return - } - if slice.Slice3 { - return - } - if !sameNonDynamic(slice.X, condCall.Args[0]) { - return - } - var index ast.Expr - switch fun { - case "HasPrefix": - // TODO(dh) We could detect a High that is len(s), but another - // rule will already flag that, anyway. - if slice.High != nil { - return - } - index = slice.Low - case "HasSuffix": - if slice.Low != nil { - n, ok := ExprToInt(pass, slice.Low) - if !ok || n != 0 { - return - } - } - index = slice.High - } - - switch index := index.(type) { - case *ast.CallExpr: - if fun != "HasPrefix" { - return - } - if fn, ok := index.Fun.(*ast.Ident); !ok || fn.Name != "len" { - return - } - if len(index.Args) != 1 { - return - } - id3 := index.Args[Arg("len.v")] - switch oid3 := condCall.Args[1].(type) { - case *ast.BasicLit: - if pkg != "strings" { - return - } - lit, ok := id3.(*ast.BasicLit) - if !ok { - return - } - s1, ok1 := ExprToString(pass, lit) - s2, ok2 := ExprToString(pass, condCall.Args[1]) - if !ok1 || !ok2 || s1 != s2 { - return - } - default: - if !sameNonDynamic(id3, oid3) { - return - } - } - case *ast.BasicLit, *ast.Ident: - if fun != "HasPrefix" { - return - } - if pkg != "strings" { - return - } - string, ok1 := ExprToString(pass, condCall.Args[1]) - int, ok2 := ExprToInt(pass, slice.Low) - if !ok1 || !ok2 || int != int64(len(string)) { - return - } - case *ast.BinaryExpr: - if fun != "HasSuffix" { - return - } - if index.Op != token.SUB { - return - } - if !isLenOnIdent(index.X, condCall.Args[0]) || - !isLenOnIdent(index.Y, condCall.Args[1]) { - return - } - default: - return - } - - var replacement string - switch fun { - case "HasPrefix": - replacement = "TrimPrefix" - case "HasSuffix": - replacement = "TrimSuffix" - } - ReportNodefFG(pass, ifstmt, "should replace this if statement with an unconditional %s.%s", pkg, replacement) - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn) - return nil, nil -} - -func LintLoopSlide(pass *analysis.Pass) (interface{}, error) { - // TODO(dh): detect bs[i+offset] in addition to bs[offset+i] - // TODO(dh): consider merging this function with LintLoopCopy - // TODO(dh): detect length that is an expression, not a variable name - // TODO(dh): support sliding to a different offset than the beginning of the slice - - fn := func(node ast.Node) { - /* - for i := 0; i < n; i++ { - bs[i] = bs[offset+i] - } - - ↓ - - copy(bs[:n], bs[offset:offset+n]) - */ - - loop := node.(*ast.ForStmt) - if len(loop.Body.List) != 1 || loop.Init == nil || loop.Cond == nil || loop.Post == nil { - return - } - assign, ok := loop.Init.(*ast.AssignStmt) - if !ok || len(assign.Lhs) != 1 || len(assign.Rhs) != 1 || !IsZero(assign.Rhs[0]) { - return - } - initvar, ok := assign.Lhs[0].(*ast.Ident) - if !ok { - return - } - post, ok := loop.Post.(*ast.IncDecStmt) - if !ok || post.Tok != token.INC { - return - } - postvar, ok := post.X.(*ast.Ident) - if !ok || pass.TypesInfo.ObjectOf(postvar) != pass.TypesInfo.ObjectOf(initvar) { - return - } - bin, ok := loop.Cond.(*ast.BinaryExpr) - if !ok || bin.Op != token.LSS { - return - } - binx, ok := bin.X.(*ast.Ident) - if !ok || pass.TypesInfo.ObjectOf(binx) != pass.TypesInfo.ObjectOf(initvar) { - return - } - biny, ok := bin.Y.(*ast.Ident) - if !ok { - return - } - - assign, ok = loop.Body.List[0].(*ast.AssignStmt) - if !ok || len(assign.Lhs) != 1 || len(assign.Rhs) != 1 || assign.Tok != token.ASSIGN { - return - } - lhs, ok := assign.Lhs[0].(*ast.IndexExpr) - if !ok { - return - } - rhs, ok := assign.Rhs[0].(*ast.IndexExpr) - if !ok { - return - } - - bs1, ok := lhs.X.(*ast.Ident) - if !ok { - return - } - bs2, ok := rhs.X.(*ast.Ident) - if !ok { - return - } - obj1 := pass.TypesInfo.ObjectOf(bs1) - obj2 := pass.TypesInfo.ObjectOf(bs2) - if obj1 != obj2 { - return - } - if _, ok := obj1.Type().Underlying().(*types.Slice); !ok { - return - } - - index1, ok := lhs.Index.(*ast.Ident) - if !ok || pass.TypesInfo.ObjectOf(index1) != pass.TypesInfo.ObjectOf(initvar) { - return - } - index2, ok := rhs.Index.(*ast.BinaryExpr) - if !ok || index2.Op != token.ADD { - return - } - add1, ok := index2.X.(*ast.Ident) - if !ok { - return - } - add2, ok := index2.Y.(*ast.Ident) - if !ok || pass.TypesInfo.ObjectOf(add2) != pass.TypesInfo.ObjectOf(initvar) { - return - } - - ReportNodefFG(pass, loop, "should use copy(%s[:%s], %s[%s:]) instead", Render(pass, bs1), Render(pass, biny), Render(pass, bs1), Render(pass, add1)) - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil)}, fn) - return nil, nil -} - -func LintMakeLenCap(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - call := node.(*ast.CallExpr) - if fn, ok := call.Fun.(*ast.Ident); !ok || fn.Name != "make" { - // FIXME check whether make is indeed the built-in function - return - } - switch len(call.Args) { - case 2: - // make(T, len) - if _, ok := pass.TypesInfo.TypeOf(call.Args[Arg("make.t")]).Underlying().(*types.Slice); ok { - break - } - if IsZero(call.Args[Arg("make.size[0]")]) { - ReportNodefFG(pass, call.Args[Arg("make.size[0]")], "should use make(%s) instead", Render(pass, call.Args[Arg("make.t")])) - } - case 3: - // make(T, len, cap) - if Render(pass, call.Args[Arg("make.size[0]")]) == Render(pass, call.Args[Arg("make.size[1]")]) { - ReportNodefFG(pass, call.Args[Arg("make.size[0]")], - "should use make(%s, %s) instead", - Render(pass, call.Args[Arg("make.t")]), Render(pass, call.Args[Arg("make.size[0]")])) - } - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func LintAssertNotNil(pass *analysis.Pass) (interface{}, error) { - isNilCheck := func(ident *ast.Ident, expr ast.Expr) bool { - xbinop, ok := expr.(*ast.BinaryExpr) - if !ok || xbinop.Op != token.NEQ { - return false - } - xident, ok := xbinop.X.(*ast.Ident) - if !ok || xident.Obj != ident.Obj { - return false - } - if !IsNil(pass, xbinop.Y) { - return false - } - return true - } - isOKCheck := func(ident *ast.Ident, expr ast.Expr) bool { - yident, ok := expr.(*ast.Ident) - if !ok || yident.Obj != ident.Obj { - return false - } - return true - } - fn1 := func(node ast.Node) { - ifstmt := node.(*ast.IfStmt) - assign, ok := ifstmt.Init.(*ast.AssignStmt) - if !ok || len(assign.Lhs) != 2 || len(assign.Rhs) != 1 || !IsBlank(assign.Lhs[0]) { - return - } - assert, ok := assign.Rhs[0].(*ast.TypeAssertExpr) - if !ok { - return - } - binop, ok := ifstmt.Cond.(*ast.BinaryExpr) - if !ok || binop.Op != token.LAND { - return - } - assertIdent, ok := assert.X.(*ast.Ident) - if !ok { - return - } - assignIdent, ok := assign.Lhs[1].(*ast.Ident) - if !ok { - return - } - if !(isNilCheck(assertIdent, binop.X) && isOKCheck(assignIdent, binop.Y)) && - !(isNilCheck(assertIdent, binop.Y) && isOKCheck(assignIdent, binop.X)) { - return - } - ReportNodefFG(pass, ifstmt, "when %s is true, %s can't be nil", Render(pass, assignIdent), Render(pass, assertIdent)) - } - fn2 := func(node ast.Node) { - // Check that outer ifstmt is an 'if x != nil {}' - ifstmt := node.(*ast.IfStmt) - if ifstmt.Init != nil { - return - } - if ifstmt.Else != nil { - return - } - if len(ifstmt.Body.List) != 1 { - return - } - binop, ok := ifstmt.Cond.(*ast.BinaryExpr) - if !ok { - return - } - if binop.Op != token.NEQ { - return - } - lhs, ok := binop.X.(*ast.Ident) - if !ok { - return - } - if !IsNil(pass, binop.Y) { - return - } - - // Check that inner ifstmt is an `if _, ok := x.(T); ok {}` - ifstmt, ok = ifstmt.Body.List[0].(*ast.IfStmt) - if !ok { - return - } - assign, ok := ifstmt.Init.(*ast.AssignStmt) - if !ok || len(assign.Lhs) != 2 || len(assign.Rhs) != 1 || !IsBlank(assign.Lhs[0]) { - return - } - assert, ok := assign.Rhs[0].(*ast.TypeAssertExpr) - if !ok { - return - } - assertIdent, ok := assert.X.(*ast.Ident) - if !ok { - return - } - if lhs.Obj != assertIdent.Obj { - return - } - assignIdent, ok := assign.Lhs[1].(*ast.Ident) - if !ok { - return - } - if !isOKCheck(assignIdent, ifstmt.Cond) { - return - } - ReportNodefFG(pass, ifstmt, "when %s is true, %s can't be nil", Render(pass, assignIdent), Render(pass, assertIdent)) - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn1) - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn2) - return nil, nil -} - -func LintDeclareAssign(pass *analysis.Pass) (interface{}, error) { - hasMultipleAssignments := func(root ast.Node, ident *ast.Ident) bool { - num := 0 - ast.Inspect(root, func(node ast.Node) bool { - if num >= 2 { - return false - } - assign, ok := node.(*ast.AssignStmt) - if !ok { - return true - } - for _, lhs := range assign.Lhs { - if oident, ok := lhs.(*ast.Ident); ok { - if oident.Obj == ident.Obj { - num++ - } - } - } - - return true - }) - return num >= 2 - } - fn := func(node ast.Node) { - block := node.(*ast.BlockStmt) - if len(block.List) < 2 { - return - } - for i, stmt := range block.List[:len(block.List)-1] { - _ = i - decl, ok := stmt.(*ast.DeclStmt) - if !ok { - continue - } - gdecl, ok := decl.Decl.(*ast.GenDecl) - if !ok || gdecl.Tok != token.VAR || len(gdecl.Specs) != 1 { - continue - } - vspec, ok := gdecl.Specs[0].(*ast.ValueSpec) - if !ok || len(vspec.Names) != 1 || len(vspec.Values) != 0 { - continue - } - - assign, ok := block.List[i+1].(*ast.AssignStmt) - if !ok || assign.Tok != token.ASSIGN { - continue - } - if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 { - continue - } - ident, ok := assign.Lhs[0].(*ast.Ident) - if !ok { - continue - } - if vspec.Names[0].Obj != ident.Obj { - continue - } - - if refersTo(pass, assign.Rhs[0], ident) { - continue - } - if hasMultipleAssignments(block, ident) { - continue - } - - ReportNodefFG(pass, decl, "should merge variable declaration with assignment on next line") - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BlockStmt)(nil)}, fn) - return nil, nil -} - -func LintRedundantBreak(pass *analysis.Pass) (interface{}, error) { - fn1 := func(node ast.Node) { - clause := node.(*ast.CaseClause) - if len(clause.Body) < 2 { - return - } - branch, ok := clause.Body[len(clause.Body)-1].(*ast.BranchStmt) - if !ok || branch.Tok != token.BREAK || branch.Label != nil { - return - } - ReportNodefFG(pass, branch, "redundant break statement") - } - fn2 := func(node ast.Node) { - var ret *ast.FieldList - var body *ast.BlockStmt - switch x := node.(type) { - case *ast.FuncDecl: - ret = x.Type.Results - body = x.Body - case *ast.FuncLit: - ret = x.Type.Results - body = x.Body - default: - panic(fmt.Sprintf("unreachable: %T", node)) - } - // if the func has results, a return can't be redundant. - // similarly, if there are no statements, there can be - // no return. - if ret != nil || body == nil || len(body.List) < 1 { - return - } - rst, ok := body.List[len(body.List)-1].(*ast.ReturnStmt) - if !ok { - return - } - // we don't need to check rst.Results as we already - // checked x.Type.Results to be nil. - ReportNodefFG(pass, rst, "redundant return statement") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CaseClause)(nil)}, fn1) - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.FuncDecl)(nil), (*ast.FuncLit)(nil)}, fn2) - return nil, nil -} - -func isStringer(T types.Type, msCache *typeutil.MethodSetCache) bool { - ms := msCache.MethodSet(T) - sel := ms.Lookup(nil, "String") - if sel == nil { - return false - } - fn, ok := sel.Obj().(*types.Func) - if !ok { - // should be unreachable - return false - } - sig := fn.Type().(*types.Signature) - if sig.Params().Len() != 0 { - return false - } - if sig.Results().Len() != 1 { - return false - } - if !IsType(sig.Results().At(0).Type(), "string") { - return false - } - return true -} - -func LintRedundantSprintf(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - call := node.(*ast.CallExpr) - if !IsCallToAST(pass, call, "fmt.Sprintf") { - return - } - if len(call.Args) != 2 { - return - } - if s, ok := ExprToString(pass, call.Args[Arg("fmt.Sprintf.format")]); !ok || s != "%s" { - return - } - arg := call.Args[Arg("fmt.Sprintf.a[0]")] - typ := pass.TypesInfo.TypeOf(arg) - - ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).Pkg - if isStringer(typ, &ssapkg.Prog.MethodSets) { - ReportNodef(pass, call, "should use String() instead of fmt.Sprintf") - return - } - - if typ.Underlying() == types.Universe.Lookup("string").Type() { - if typ == types.Universe.Lookup("string").Type() { - ReportNodefFG(pass, call, "the argument is already a string, there's no need to use fmt.Sprintf") - } else { - ReportNodefFG(pass, call, "the argument's underlying type is a string, should use a simple conversion instead of fmt.Sprintf") - } - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func LintErrorsNewSprintf(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - if !IsCallToAST(pass, node, "errors.New") { - return - } - call := node.(*ast.CallExpr) - if !IsCallToAST(pass, call.Args[Arg("errors.New.text")], "fmt.Sprintf") { - return - } - ReportNodefFG(pass, node, "should use fmt.Errorf(...) instead of errors.New(fmt.Sprintf(...))") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func LintRangeStringRunes(pass *analysis.Pass) (interface{}, error) { - return sharedcheck.CheckRangeStringRunes(pass) -} - -func LintNilCheckAroundRange(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - ifstmt := node.(*ast.IfStmt) - cond, ok := ifstmt.Cond.(*ast.BinaryExpr) - if !ok { - return - } - - if cond.Op != token.NEQ || !IsNil(pass, cond.Y) || len(ifstmt.Body.List) != 1 { - return - } - - loop, ok := ifstmt.Body.List[0].(*ast.RangeStmt) - if !ok { - return - } - ifXIdent, ok := cond.X.(*ast.Ident) - if !ok { - return - } - rangeXIdent, ok := loop.X.(*ast.Ident) - if !ok { - return - } - if ifXIdent.Obj != rangeXIdent.Obj { - return - } - switch pass.TypesInfo.TypeOf(rangeXIdent).(type) { - case *types.Slice, *types.Map: - ReportNodefFG(pass, node, "unnecessary nil check around range") - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn) - return nil, nil -} - -func isPermissibleSort(pass *analysis.Pass, node ast.Node) bool { - call := node.(*ast.CallExpr) - typeconv, ok := call.Args[0].(*ast.CallExpr) - if !ok { - return true - } - - sel, ok := typeconv.Fun.(*ast.SelectorExpr) - if !ok { - return true - } - name := SelectorName(pass, sel) - switch name { - case "sort.IntSlice", "sort.Float64Slice", "sort.StringSlice": - default: - return true - } - - return false -} - -func LintSortHelpers(pass *analysis.Pass) (interface{}, error) { - type Error struct { - node ast.Node - msg string - } - var allErrors []Error - fn := func(node ast.Node) { - var body *ast.BlockStmt - switch node := node.(type) { - case *ast.FuncLit: - body = node.Body - case *ast.FuncDecl: - body = node.Body - default: - panic(fmt.Sprintf("unreachable: %T", node)) - } - if body == nil { - return - } - - var errors []Error - permissible := false - fnSorts := func(node ast.Node) bool { - if permissible { - return false - } - if !IsCallToAST(pass, node, "sort.Sort") { - return true - } - if isPermissibleSort(pass, node) { - permissible = true - return false - } - call := node.(*ast.CallExpr) - typeconv := call.Args[Arg("sort.Sort.data")].(*ast.CallExpr) - sel := typeconv.Fun.(*ast.SelectorExpr) - name := SelectorName(pass, sel) - - switch name { - case "sort.IntSlice": - errors = append(errors, Error{node, "should use sort.Ints(...) instead of sort.Sort(sort.IntSlice(...))"}) - case "sort.Float64Slice": - errors = append(errors, Error{node, "should use sort.Float64s(...) instead of sort.Sort(sort.Float64Slice(...))"}) - case "sort.StringSlice": - errors = append(errors, Error{node, "should use sort.Strings(...) instead of sort.Sort(sort.StringSlice(...))"}) - } - return true - } - ast.Inspect(body, fnSorts) - - if permissible { - return - } - allErrors = append(allErrors, errors...) - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.FuncLit)(nil), (*ast.FuncDecl)(nil)}, fn) - sort.Slice(allErrors, func(i, j int) bool { - return allErrors[i].node.Pos() < allErrors[j].node.Pos() - }) - var prev token.Pos - for _, err := range allErrors { - if err.node.Pos() == prev { - continue - } - prev = err.node.Pos() - ReportNodefFG(pass, err.node, "%s", err.msg) - } - return nil, nil -} - -func LintGuardedDelete(pass *analysis.Pass) (interface{}, error) { - isCommaOkMapIndex := func(stmt ast.Stmt) (b *ast.Ident, m ast.Expr, key ast.Expr, ok bool) { - // Has to be of the form `_, = [] - - assign, ok := stmt.(*ast.AssignStmt) - if !ok { - return nil, nil, nil, false - } - if len(assign.Lhs) != 2 || len(assign.Rhs) != 1 { - return nil, nil, nil, false - } - if !IsBlank(assign.Lhs[0]) { - return nil, nil, nil, false - } - ident, ok := assign.Lhs[1].(*ast.Ident) - if !ok { - return nil, nil, nil, false - } - index, ok := assign.Rhs[0].(*ast.IndexExpr) - if !ok { - return nil, nil, nil, false - } - if _, ok := pass.TypesInfo.TypeOf(index.X).(*types.Map); !ok { - return nil, nil, nil, false - } - key = index.Index - return ident, index.X, key, true - } - fn := func(node ast.Node) { - stmt := node.(*ast.IfStmt) - if len(stmt.Body.List) != 1 { - return - } - if stmt.Else != nil { - return - } - expr, ok := stmt.Body.List[0].(*ast.ExprStmt) - if !ok { - return - } - call, ok := expr.X.(*ast.CallExpr) - if !ok { - return - } - if !IsCallToAST(pass, call, "delete") { - return - } - b, m, key, ok := isCommaOkMapIndex(stmt.Init) - if !ok { - return - } - if cond, ok := stmt.Cond.(*ast.Ident); !ok || pass.TypesInfo.ObjectOf(cond) != pass.TypesInfo.ObjectOf(b) { - return - } - if Render(pass, call.Args[0]) != Render(pass, m) || Render(pass, call.Args[1]) != Render(pass, key) { - return - } - ReportNodefFG(pass, stmt, "unnecessary guard around call to delete") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn) - return nil, nil -} - -func LintSimplifyTypeSwitch(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - stmt := node.(*ast.TypeSwitchStmt) - if stmt.Init != nil { - // bailing out for now, can't anticipate how type switches with initializers are being used - return - } - expr, ok := stmt.Assign.(*ast.ExprStmt) - if !ok { - // the user is in fact assigning the result - return - } - assert := expr.X.(*ast.TypeAssertExpr) - ident, ok := assert.X.(*ast.Ident) - if !ok { - return - } - x := pass.TypesInfo.ObjectOf(ident) - var allOffenders []ast.Node - for _, clause := range stmt.Body.List { - clause := clause.(*ast.CaseClause) - if len(clause.List) != 1 { - continue - } - hasUnrelatedAssertion := false - var offenders []ast.Node - ast.Inspect(clause, func(node ast.Node) bool { - assert2, ok := node.(*ast.TypeAssertExpr) - if !ok { - return true - } - ident, ok := assert2.X.(*ast.Ident) - if !ok { - hasUnrelatedAssertion = true - return false - } - if pass.TypesInfo.ObjectOf(ident) != x { - hasUnrelatedAssertion = true - return false - } - - if !types.Identical(pass.TypesInfo.TypeOf(clause.List[0]), pass.TypesInfo.TypeOf(assert2.Type)) { - hasUnrelatedAssertion = true - return false - } - offenders = append(offenders, assert2) - return true - }) - if !hasUnrelatedAssertion { - // don't flag cases that have other type assertions - // unrelated to the one in the case clause. often - // times, this is done for symmetry, when two - // different values have to be asserted to the same - // type. - allOffenders = append(allOffenders, offenders...) - } - } - if len(allOffenders) != 0 { - at := "" - for _, offender := range allOffenders { - pos := lint.DisplayPosition(pass.Fset, offender.Pos()) - at += "\n\t" + pos.String() - } - ReportNodefFG(pass, expr, "assigning the result of this type assertion to a variable (switch %s := %s.(type)) could eliminate the following type assertions:%s", Render(pass, ident), Render(pass, ident), at) - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.TypeSwitchStmt)(nil)}, fn) - return nil, nil -} diff --git a/vendor/honnef.co/go/tools/ssa/BUILD b/vendor/honnef.co/go/tools/ssa/BUILD deleted file mode 100644 index b1af4e44b62..00000000000 --- a/vendor/honnef.co/go/tools/ssa/BUILD +++ /dev/null @@ -1,50 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "blockopt.go", - "builder.go", - "const.go", - "create.go", - "doc.go", - "dom.go", - "emit.go", - "func.go", - "identical.go", - "identical_17.go", - "lift.go", - "lvalue.go", - "methods.go", - "mode.go", - "print.go", - "sanity.go", - "source.go", - "ssa.go", - "testmain.go", - "util.go", - "wrappers.go", - "write.go", - ], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/ssa", - importpath = "honnef.co/go/tools/ssa", - visibility = ["//visibility:public"], - deps = [ - "//vendor/golang.org/x/tools/go/ast/astutil:go_default_library", - "//vendor/golang.org/x/tools/go/types/typeutil:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/ssa/LICENSE b/vendor/honnef.co/go/tools/ssa/LICENSE deleted file mode 100644 index aee48041e11..00000000000 --- a/vendor/honnef.co/go/tools/ssa/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. -Copyright (c) 2016 Dominik Honnef. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/honnef.co/go/tools/ssa/blockopt.go b/vendor/honnef.co/go/tools/ssa/blockopt.go deleted file mode 100644 index 22c9a4c0d42..00000000000 --- a/vendor/honnef.co/go/tools/ssa/blockopt.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// Simple block optimizations to simplify the control flow graph. - -// TODO(adonovan): opt: instead of creating several "unreachable" blocks -// per function in the Builder, reuse a single one (e.g. at Blocks[1]) -// to reduce garbage. - -import ( - "fmt" - "os" -) - -// If true, perform sanity checking and show progress at each -// successive iteration of optimizeBlocks. Very verbose. -const debugBlockOpt = false - -// markReachable sets Index=-1 for all blocks reachable from b. -func markReachable(b *BasicBlock) { - b.Index = -1 - for _, succ := range b.Succs { - if succ.Index == 0 { - markReachable(succ) - } - } -} - -func DeleteUnreachableBlocks(f *Function) { - deleteUnreachableBlocks(f) -} - -// deleteUnreachableBlocks marks all reachable blocks of f and -// eliminates (nils) all others, including possibly cyclic subgraphs. -// -func deleteUnreachableBlocks(f *Function) { - const white, black = 0, -1 - // We borrow b.Index temporarily as the mark bit. - for _, b := range f.Blocks { - b.Index = white - } - markReachable(f.Blocks[0]) - if f.Recover != nil { - markReachable(f.Recover) - } - for i, b := range f.Blocks { - if b.Index == white { - for _, c := range b.Succs { - if c.Index == black { - c.removePred(b) // delete white->black edge - } - } - if debugBlockOpt { - fmt.Fprintln(os.Stderr, "unreachable", b) - } - f.Blocks[i] = nil // delete b - } - } - f.removeNilBlocks() -} - -// jumpThreading attempts to apply simple jump-threading to block b, -// in which a->b->c become a->c if b is just a Jump. -// The result is true if the optimization was applied. -// -func jumpThreading(f *Function, b *BasicBlock) bool { - if b.Index == 0 { - return false // don't apply to entry block - } - if b.Instrs == nil { - return false - } - if _, ok := b.Instrs[0].(*Jump); !ok { - return false // not just a jump - } - c := b.Succs[0] - if c == b { - return false // don't apply to degenerate jump-to-self. - } - if c.hasPhi() { - return false // not sound without more effort - } - for j, a := range b.Preds { - a.replaceSucc(b, c) - - // If a now has two edges to c, replace its degenerate If by Jump. - if len(a.Succs) == 2 && a.Succs[0] == c && a.Succs[1] == c { - jump := new(Jump) - jump.setBlock(a) - a.Instrs[len(a.Instrs)-1] = jump - a.Succs = a.Succs[:1] - c.removePred(b) - } else { - if j == 0 { - c.replacePred(b, a) - } else { - c.Preds = append(c.Preds, a) - } - } - - if debugBlockOpt { - fmt.Fprintln(os.Stderr, "jumpThreading", a, b, c) - } - } - f.Blocks[b.Index] = nil // delete b - return true -} - -// fuseBlocks attempts to apply the block fusion optimization to block -// a, in which a->b becomes ab if len(a.Succs)==len(b.Preds)==1. -// The result is true if the optimization was applied. -// -func fuseBlocks(f *Function, a *BasicBlock) bool { - if len(a.Succs) != 1 { - return false - } - b := a.Succs[0] - if len(b.Preds) != 1 { - return false - } - - // Degenerate &&/|| ops may result in a straight-line CFG - // containing φ-nodes. (Ideally we'd replace such them with - // their sole operand but that requires Referrers, built later.) - if b.hasPhi() { - return false // not sound without further effort - } - - // Eliminate jump at end of A, then copy all of B across. - a.Instrs = append(a.Instrs[:len(a.Instrs)-1], b.Instrs...) - for _, instr := range b.Instrs { - instr.setBlock(a) - } - - // A inherits B's successors - a.Succs = append(a.succs2[:0], b.Succs...) - - // Fix up Preds links of all successors of B. - for _, c := range b.Succs { - c.replacePred(b, a) - } - - if debugBlockOpt { - fmt.Fprintln(os.Stderr, "fuseBlocks", a, b) - } - - f.Blocks[b.Index] = nil // delete b - return true -} - -func OptimizeBlocks(f *Function) { - optimizeBlocks(f) -} - -// optimizeBlocks() performs some simple block optimizations on a -// completed function: dead block elimination, block fusion, jump -// threading. -// -func optimizeBlocks(f *Function) { - deleteUnreachableBlocks(f) - - // Loop until no further progress. - changed := true - for changed { - changed = false - - if debugBlockOpt { - f.WriteTo(os.Stderr) - mustSanityCheck(f, nil) - } - - for _, b := range f.Blocks { - // f.Blocks will temporarily contain nils to indicate - // deleted blocks; we remove them at the end. - if b == nil { - continue - } - - // Fuse blocks. b->c becomes bc. - if fuseBlocks(f, b) { - changed = true - } - - // a->b->c becomes a->c if b contains only a Jump. - if jumpThreading(f, b) { - changed = true - continue // (b was disconnected) - } - } - } - f.removeNilBlocks() -} diff --git a/vendor/honnef.co/go/tools/ssa/builder.go b/vendor/honnef.co/go/tools/ssa/builder.go deleted file mode 100644 index 317ac061166..00000000000 --- a/vendor/honnef.co/go/tools/ssa/builder.go +++ /dev/null @@ -1,2379 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// This file implements the BUILD phase of SSA construction. -// -// SSA construction has two phases, CREATE and BUILD. In the CREATE phase -// (create.go), all packages are constructed and type-checked and -// definitions of all package members are created, method-sets are -// computed, and wrapper methods are synthesized. -// ssa.Packages are created in arbitrary order. -// -// In the BUILD phase (builder.go), the builder traverses the AST of -// each Go source function and generates SSA instructions for the -// function body. Initializer expressions for package-level variables -// are emitted to the package's init() function in the order specified -// by go/types.Info.InitOrder, then code for each function in the -// package is generated in lexical order. -// The BUILD phases for distinct packages are independent and are -// executed in parallel. -// -// TODO(adonovan): indeed, building functions is now embarrassingly parallel. -// Audit for concurrency then benchmark using more goroutines. -// -// The builder's and Program's indices (maps) are populated and -// mutated during the CREATE phase, but during the BUILD phase they -// remain constant. The sole exception is Prog.methodSets and its -// related maps, which are protected by a dedicated mutex. - -import ( - "fmt" - "go/ast" - "go/constant" - "go/token" - "go/types" - "os" - "sync" -) - -type opaqueType struct { - types.Type - name string -} - -func (t *opaqueType) String() string { return t.name } - -var ( - varOk = newVar("ok", tBool) - varIndex = newVar("index", tInt) - - // Type constants. - tBool = types.Typ[types.Bool] - tByte = types.Typ[types.Byte] - tInt = types.Typ[types.Int] - tInvalid = types.Typ[types.Invalid] - tString = types.Typ[types.String] - tUntypedNil = types.Typ[types.UntypedNil] - tRangeIter = &opaqueType{nil, "iter"} // the type of all "range" iterators - tEface = types.NewInterfaceType(nil, nil).Complete() - - // SSA Value constants. - vZero = intConst(0) - vOne = intConst(1) - vTrue = NewConst(constant.MakeBool(true), tBool) -) - -// builder holds state associated with the package currently being built. -// Its methods contain all the logic for AST-to-SSA conversion. -type builder struct{} - -// cond emits to fn code to evaluate boolean condition e and jump -// to t or f depending on its value, performing various simplifications. -// -// Postcondition: fn.currentBlock is nil. -// -func (b *builder) cond(fn *Function, e ast.Expr, t, f *BasicBlock) { - switch e := e.(type) { - case *ast.ParenExpr: - b.cond(fn, e.X, t, f) - return - - case *ast.BinaryExpr: - switch e.Op { - case token.LAND: - ltrue := fn.newBasicBlock("cond.true") - b.cond(fn, e.X, ltrue, f) - fn.currentBlock = ltrue - b.cond(fn, e.Y, t, f) - return - - case token.LOR: - lfalse := fn.newBasicBlock("cond.false") - b.cond(fn, e.X, t, lfalse) - fn.currentBlock = lfalse - b.cond(fn, e.Y, t, f) - return - } - - case *ast.UnaryExpr: - if e.Op == token.NOT { - b.cond(fn, e.X, f, t) - return - } - } - - // A traditional compiler would simplify "if false" (etc) here - // but we do not, for better fidelity to the source code. - // - // The value of a constant condition may be platform-specific, - // and may cause blocks that are reachable in some configuration - // to be hidden from subsequent analyses such as bug-finding tools. - emitIf(fn, b.expr(fn, e), t, f) -} - -// logicalBinop emits code to fn to evaluate e, a &&- or -// ||-expression whose reified boolean value is wanted. -// The value is returned. -// -func (b *builder) logicalBinop(fn *Function, e *ast.BinaryExpr) Value { - rhs := fn.newBasicBlock("binop.rhs") - done := fn.newBasicBlock("binop.done") - - // T(e) = T(e.X) = T(e.Y) after untyped constants have been - // eliminated. - // TODO(adonovan): not true; MyBool==MyBool yields UntypedBool. - t := fn.Pkg.typeOf(e) - - var short Value // value of the short-circuit path - switch e.Op { - case token.LAND: - b.cond(fn, e.X, rhs, done) - short = NewConst(constant.MakeBool(false), t) - - case token.LOR: - b.cond(fn, e.X, done, rhs) - short = NewConst(constant.MakeBool(true), t) - } - - // Is rhs unreachable? - if rhs.Preds == nil { - // Simplify false&&y to false, true||y to true. - fn.currentBlock = done - return short - } - - // Is done unreachable? - if done.Preds == nil { - // Simplify true&&y (or false||y) to y. - fn.currentBlock = rhs - return b.expr(fn, e.Y) - } - - // All edges from e.X to done carry the short-circuit value. - var edges []Value - for range done.Preds { - edges = append(edges, short) - } - - // The edge from e.Y to done carries the value of e.Y. - fn.currentBlock = rhs - edges = append(edges, b.expr(fn, e.Y)) - emitJump(fn, done) - fn.currentBlock = done - - phi := &Phi{Edges: edges, Comment: e.Op.String()} - phi.pos = e.OpPos - phi.typ = t - return done.emit(phi) -} - -// exprN lowers a multi-result expression e to SSA form, emitting code -// to fn and returning a single Value whose type is a *types.Tuple. -// The caller must access the components via Extract. -// -// Multi-result expressions include CallExprs in a multi-value -// assignment or return statement, and "value,ok" uses of -// TypeAssertExpr, IndexExpr (when X is a map), and UnaryExpr (when Op -// is token.ARROW). -// -func (b *builder) exprN(fn *Function, e ast.Expr) Value { - typ := fn.Pkg.typeOf(e).(*types.Tuple) - switch e := e.(type) { - case *ast.ParenExpr: - return b.exprN(fn, e.X) - - case *ast.CallExpr: - // Currently, no built-in function nor type conversion - // has multiple results, so we can avoid some of the - // cases for single-valued CallExpr. - var c Call - b.setCall(fn, e, &c.Call) - c.typ = typ - return fn.emit(&c) - - case *ast.IndexExpr: - mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map) - lookup := &Lookup{ - X: b.expr(fn, e.X), - Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()), - CommaOk: true, - } - lookup.setType(typ) - lookup.setPos(e.Lbrack) - return fn.emit(lookup) - - case *ast.TypeAssertExpr: - return emitTypeTest(fn, b.expr(fn, e.X), typ.At(0).Type(), e.Lparen) - - case *ast.UnaryExpr: // must be receive <- - unop := &UnOp{ - Op: token.ARROW, - X: b.expr(fn, e.X), - CommaOk: true, - } - unop.setType(typ) - unop.setPos(e.OpPos) - return fn.emit(unop) - } - panic(fmt.Sprintf("exprN(%T) in %s", e, fn)) -} - -// builtin emits to fn SSA instructions to implement a call to the -// built-in function obj with the specified arguments -// and return type. It returns the value defined by the result. -// -// The result is nil if no special handling was required; in this case -// the caller should treat this like an ordinary library function -// call. -// -func (b *builder) builtin(fn *Function, obj *types.Builtin, args []ast.Expr, typ types.Type, pos token.Pos) Value { - switch obj.Name() { - case "make": - switch typ.Underlying().(type) { - case *types.Slice: - n := b.expr(fn, args[1]) - m := n - if len(args) == 3 { - m = b.expr(fn, args[2]) - } - if m, ok := m.(*Const); ok { - // treat make([]T, n, m) as new([m]T)[:n] - cap := m.Int64() - at := types.NewArray(typ.Underlying().(*types.Slice).Elem(), cap) - alloc := emitNew(fn, at, pos) - alloc.Comment = "makeslice" - v := &Slice{ - X: alloc, - High: n, - } - v.setPos(pos) - v.setType(typ) - return fn.emit(v) - } - v := &MakeSlice{ - Len: n, - Cap: m, - } - v.setPos(pos) - v.setType(typ) - return fn.emit(v) - - case *types.Map: - var res Value - if len(args) == 2 { - res = b.expr(fn, args[1]) - } - v := &MakeMap{Reserve: res} - v.setPos(pos) - v.setType(typ) - return fn.emit(v) - - case *types.Chan: - var sz Value = vZero - if len(args) == 2 { - sz = b.expr(fn, args[1]) - } - v := &MakeChan{Size: sz} - v.setPos(pos) - v.setType(typ) - return fn.emit(v) - } - - case "new": - alloc := emitNew(fn, deref(typ), pos) - alloc.Comment = "new" - return alloc - - case "len", "cap": - // Special case: len or cap of an array or *array is - // based on the type, not the value which may be nil. - // We must still evaluate the value, though. (If it - // was side-effect free, the whole call would have - // been constant-folded.) - t := deref(fn.Pkg.typeOf(args[0])).Underlying() - if at, ok := t.(*types.Array); ok { - b.expr(fn, args[0]) // for effects only - return intConst(at.Len()) - } - // Otherwise treat as normal. - - case "panic": - fn.emit(&Panic{ - X: emitConv(fn, b.expr(fn, args[0]), tEface), - pos: pos, - }) - fn.currentBlock = fn.newBasicBlock("unreachable") - return vTrue // any non-nil Value will do - } - return nil // treat all others as a regular function call -} - -// addr lowers a single-result addressable expression e to SSA form, -// emitting code to fn and returning the location (an lvalue) defined -// by the expression. -// -// If escaping is true, addr marks the base variable of the -// addressable expression e as being a potentially escaping pointer -// value. For example, in this code: -// -// a := A{ -// b: [1]B{B{c: 1}} -// } -// return &a.b[0].c -// -// the application of & causes a.b[0].c to have its address taken, -// which means that ultimately the local variable a must be -// heap-allocated. This is a simple but very conservative escape -// analysis. -// -// Operations forming potentially escaping pointers include: -// - &x, including when implicit in method call or composite literals. -// - a[:] iff a is an array (not *array) -// - references to variables in lexically enclosing functions. -// -func (b *builder) addr(fn *Function, e ast.Expr, escaping bool) lvalue { - switch e := e.(type) { - case *ast.Ident: - if isBlankIdent(e) { - return blank{} - } - obj := fn.Pkg.objectOf(e) - v := fn.Prog.packageLevelValue(obj) // var (address) - if v == nil { - v = fn.lookup(obj, escaping) - } - return &address{addr: v, pos: e.Pos(), expr: e} - - case *ast.CompositeLit: - t := deref(fn.Pkg.typeOf(e)) - var v *Alloc - if escaping { - v = emitNew(fn, t, e.Lbrace) - } else { - v = fn.addLocal(t, e.Lbrace) - } - v.Comment = "complit" - var sb storebuf - b.compLit(fn, v, e, true, &sb) - sb.emit(fn) - return &address{addr: v, pos: e.Lbrace, expr: e} - - case *ast.ParenExpr: - return b.addr(fn, e.X, escaping) - - case *ast.SelectorExpr: - sel, ok := fn.Pkg.info.Selections[e] - if !ok { - // qualified identifier - return b.addr(fn, e.Sel, escaping) - } - if sel.Kind() != types.FieldVal { - panic(sel) - } - wantAddr := true - v := b.receiver(fn, e.X, wantAddr, escaping, sel) - last := len(sel.Index()) - 1 - return &address{ - addr: emitFieldSelection(fn, v, sel.Index()[last], true, e.Sel), - pos: e.Sel.Pos(), - expr: e.Sel, - } - - case *ast.IndexExpr: - var x Value - var et types.Type - switch t := fn.Pkg.typeOf(e.X).Underlying().(type) { - case *types.Array: - x = b.addr(fn, e.X, escaping).address(fn) - et = types.NewPointer(t.Elem()) - case *types.Pointer: // *array - x = b.expr(fn, e.X) - et = types.NewPointer(t.Elem().Underlying().(*types.Array).Elem()) - case *types.Slice: - x = b.expr(fn, e.X) - et = types.NewPointer(t.Elem()) - case *types.Map: - return &element{ - m: b.expr(fn, e.X), - k: emitConv(fn, b.expr(fn, e.Index), t.Key()), - t: t.Elem(), - pos: e.Lbrack, - } - default: - panic("unexpected container type in IndexExpr: " + t.String()) - } - v := &IndexAddr{ - X: x, - Index: emitConv(fn, b.expr(fn, e.Index), tInt), - } - v.setPos(e.Lbrack) - v.setType(et) - return &address{addr: fn.emit(v), pos: e.Lbrack, expr: e} - - case *ast.StarExpr: - return &address{addr: b.expr(fn, e.X), pos: e.Star, expr: e} - } - - panic(fmt.Sprintf("unexpected address expression: %T", e)) -} - -type store struct { - lhs lvalue - rhs Value -} - -type storebuf struct{ stores []store } - -func (sb *storebuf) store(lhs lvalue, rhs Value) { - sb.stores = append(sb.stores, store{lhs, rhs}) -} - -func (sb *storebuf) emit(fn *Function) { - for _, s := range sb.stores { - s.lhs.store(fn, s.rhs) - } -} - -// assign emits to fn code to initialize the lvalue loc with the value -// of expression e. If isZero is true, assign assumes that loc holds -// the zero value for its type. -// -// This is equivalent to loc.store(fn, b.expr(fn, e)), but may generate -// better code in some cases, e.g., for composite literals in an -// addressable location. -// -// If sb is not nil, assign generates code to evaluate expression e, but -// not to update loc. Instead, the necessary stores are appended to the -// storebuf sb so that they can be executed later. This allows correct -// in-place update of existing variables when the RHS is a composite -// literal that may reference parts of the LHS. -// -func (b *builder) assign(fn *Function, loc lvalue, e ast.Expr, isZero bool, sb *storebuf) { - // Can we initialize it in place? - if e, ok := unparen(e).(*ast.CompositeLit); ok { - // A CompositeLit never evaluates to a pointer, - // so if the type of the location is a pointer, - // an &-operation is implied. - if _, ok := loc.(blank); !ok { // avoid calling blank.typ() - if isPointer(loc.typ()) { - ptr := b.addr(fn, e, true).address(fn) - // copy address - if sb != nil { - sb.store(loc, ptr) - } else { - loc.store(fn, ptr) - } - return - } - } - - if _, ok := loc.(*address); ok { - if isInterface(loc.typ()) { - // e.g. var x interface{} = T{...} - // Can't in-place initialize an interface value. - // Fall back to copying. - } else { - // x = T{...} or x := T{...} - addr := loc.address(fn) - if sb != nil { - b.compLit(fn, addr, e, isZero, sb) - } else { - var sb storebuf - b.compLit(fn, addr, e, isZero, &sb) - sb.emit(fn) - } - - // Subtle: emit debug ref for aggregate types only; - // slice and map are handled by store ops in compLit. - switch loc.typ().Underlying().(type) { - case *types.Struct, *types.Array: - emitDebugRef(fn, e, addr, true) - } - - return - } - } - } - - // simple case: just copy - rhs := b.expr(fn, e) - if sb != nil { - sb.store(loc, rhs) - } else { - loc.store(fn, rhs) - } -} - -// expr lowers a single-result expression e to SSA form, emitting code -// to fn and returning the Value defined by the expression. -// -func (b *builder) expr(fn *Function, e ast.Expr) Value { - e = unparen(e) - - tv := fn.Pkg.info.Types[e] - - // Is expression a constant? - if tv.Value != nil { - return NewConst(tv.Value, tv.Type) - } - - var v Value - if tv.Addressable() { - // Prefer pointer arithmetic ({Index,Field}Addr) followed - // by Load over subelement extraction (e.g. Index, Field), - // to avoid large copies. - v = b.addr(fn, e, false).load(fn) - } else { - v = b.expr0(fn, e, tv) - } - if fn.debugInfo() { - emitDebugRef(fn, e, v, false) - } - return v -} - -func (b *builder) expr0(fn *Function, e ast.Expr, tv types.TypeAndValue) Value { - switch e := e.(type) { - case *ast.BasicLit: - panic("non-constant BasicLit") // unreachable - - case *ast.FuncLit: - fn2 := &Function{ - name: fmt.Sprintf("%s$%d", fn.Name(), 1+len(fn.AnonFuncs)), - Signature: fn.Pkg.typeOf(e.Type).Underlying().(*types.Signature), - pos: e.Type.Func, - parent: fn, - Pkg: fn.Pkg, - Prog: fn.Prog, - syntax: e, - } - fn.AnonFuncs = append(fn.AnonFuncs, fn2) - b.buildFunction(fn2) - if fn2.FreeVars == nil { - return fn2 - } - v := &MakeClosure{Fn: fn2} - v.setType(tv.Type) - for _, fv := range fn2.FreeVars { - v.Bindings = append(v.Bindings, fv.outer) - fv.outer = nil - } - return fn.emit(v) - - case *ast.TypeAssertExpr: // single-result form only - return emitTypeAssert(fn, b.expr(fn, e.X), tv.Type, e.Lparen) - - case *ast.CallExpr: - if fn.Pkg.info.Types[e.Fun].IsType() { - // Explicit type conversion, e.g. string(x) or big.Int(x) - x := b.expr(fn, e.Args[0]) - y := emitConv(fn, x, tv.Type) - if y != x { - switch y := y.(type) { - case *Convert: - y.pos = e.Lparen - case *ChangeType: - y.pos = e.Lparen - case *MakeInterface: - y.pos = e.Lparen - } - } - return y - } - // Call to "intrinsic" built-ins, e.g. new, make, panic. - if id, ok := unparen(e.Fun).(*ast.Ident); ok { - if obj, ok := fn.Pkg.info.Uses[id].(*types.Builtin); ok { - if v := b.builtin(fn, obj, e.Args, tv.Type, e.Lparen); v != nil { - return v - } - } - } - // Regular function call. - var v Call - b.setCall(fn, e, &v.Call) - v.setType(tv.Type) - return fn.emit(&v) - - case *ast.UnaryExpr: - switch e.Op { - case token.AND: // &X --- potentially escaping. - addr := b.addr(fn, e.X, true) - if _, ok := unparen(e.X).(*ast.StarExpr); ok { - // &*p must panic if p is nil (http://golang.org/s/go12nil). - // For simplicity, we'll just (suboptimally) rely - // on the side effects of a load. - // TODO(adonovan): emit dedicated nilcheck. - addr.load(fn) - } - return addr.address(fn) - case token.ADD: - return b.expr(fn, e.X) - case token.NOT, token.ARROW, token.SUB, token.XOR: // ! <- - ^ - v := &UnOp{ - Op: e.Op, - X: b.expr(fn, e.X), - } - v.setPos(e.OpPos) - v.setType(tv.Type) - return fn.emit(v) - default: - panic(e.Op) - } - - case *ast.BinaryExpr: - switch e.Op { - case token.LAND, token.LOR: - return b.logicalBinop(fn, e) - case token.SHL, token.SHR: - fallthrough - case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT: - return emitArith(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), tv.Type, e.OpPos) - - case token.EQL, token.NEQ, token.GTR, token.LSS, token.LEQ, token.GEQ: - cmp := emitCompare(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), e.OpPos) - // The type of x==y may be UntypedBool. - return emitConv(fn, cmp, DefaultType(tv.Type)) - default: - panic("illegal op in BinaryExpr: " + e.Op.String()) - } - - case *ast.SliceExpr: - var low, high, max Value - var x Value - switch fn.Pkg.typeOf(e.X).Underlying().(type) { - case *types.Array: - // Potentially escaping. - x = b.addr(fn, e.X, true).address(fn) - case *types.Basic, *types.Slice, *types.Pointer: // *array - x = b.expr(fn, e.X) - default: - panic("unreachable") - } - if e.High != nil { - high = b.expr(fn, e.High) - } - if e.Low != nil { - low = b.expr(fn, e.Low) - } - if e.Slice3 { - max = b.expr(fn, e.Max) - } - v := &Slice{ - X: x, - Low: low, - High: high, - Max: max, - } - v.setPos(e.Lbrack) - v.setType(tv.Type) - return fn.emit(v) - - case *ast.Ident: - obj := fn.Pkg.info.Uses[e] - // Universal built-in or nil? - switch obj := obj.(type) { - case *types.Builtin: - return &Builtin{name: obj.Name(), sig: tv.Type.(*types.Signature)} - case *types.Nil: - return nilConst(tv.Type) - } - // Package-level func or var? - if v := fn.Prog.packageLevelValue(obj); v != nil { - if _, ok := obj.(*types.Var); ok { - return emitLoad(fn, v) // var (address) - } - return v // (func) - } - // Local var. - return emitLoad(fn, fn.lookup(obj, false)) // var (address) - - case *ast.SelectorExpr: - sel, ok := fn.Pkg.info.Selections[e] - if !ok { - // qualified identifier - return b.expr(fn, e.Sel) - } - switch sel.Kind() { - case types.MethodExpr: - // (*T).f or T.f, the method f from the method-set of type T. - // The result is a "thunk". - return emitConv(fn, makeThunk(fn.Prog, sel), tv.Type) - - case types.MethodVal: - // e.f where e is an expression and f is a method. - // The result is a "bound". - obj := sel.Obj().(*types.Func) - rt := recvType(obj) - wantAddr := isPointer(rt) - escaping := true - v := b.receiver(fn, e.X, wantAddr, escaping, sel) - if isInterface(rt) { - // If v has interface type I, - // we must emit a check that v is non-nil. - // We use: typeassert v.(I). - emitTypeAssert(fn, v, rt, token.NoPos) - } - c := &MakeClosure{ - Fn: makeBound(fn.Prog, obj), - Bindings: []Value{v}, - } - c.setPos(e.Sel.Pos()) - c.setType(tv.Type) - return fn.emit(c) - - case types.FieldVal: - indices := sel.Index() - last := len(indices) - 1 - v := b.expr(fn, e.X) - v = emitImplicitSelections(fn, v, indices[:last]) - v = emitFieldSelection(fn, v, indices[last], false, e.Sel) - return v - } - - panic("unexpected expression-relative selector") - - case *ast.IndexExpr: - switch t := fn.Pkg.typeOf(e.X).Underlying().(type) { - case *types.Array: - // Non-addressable array (in a register). - v := &Index{ - X: b.expr(fn, e.X), - Index: emitConv(fn, b.expr(fn, e.Index), tInt), - } - v.setPos(e.Lbrack) - v.setType(t.Elem()) - return fn.emit(v) - - case *types.Map: - // Maps are not addressable. - mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map) - v := &Lookup{ - X: b.expr(fn, e.X), - Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()), - } - v.setPos(e.Lbrack) - v.setType(mapt.Elem()) - return fn.emit(v) - - case *types.Basic: // => string - // Strings are not addressable. - v := &Lookup{ - X: b.expr(fn, e.X), - Index: b.expr(fn, e.Index), - } - v.setPos(e.Lbrack) - v.setType(tByte) - return fn.emit(v) - - case *types.Slice, *types.Pointer: // *array - // Addressable slice/array; use IndexAddr and Load. - return b.addr(fn, e, false).load(fn) - - default: - panic("unexpected container type in IndexExpr: " + t.String()) - } - - case *ast.CompositeLit, *ast.StarExpr: - // Addressable types (lvalues) - return b.addr(fn, e, false).load(fn) - } - - panic(fmt.Sprintf("unexpected expr: %T", e)) -} - -// stmtList emits to fn code for all statements in list. -func (b *builder) stmtList(fn *Function, list []ast.Stmt) { - for _, s := range list { - b.stmt(fn, s) - } -} - -// receiver emits to fn code for expression e in the "receiver" -// position of selection e.f (where f may be a field or a method) and -// returns the effective receiver after applying the implicit field -// selections of sel. -// -// wantAddr requests that the result is an an address. If -// !sel.Indirect(), this may require that e be built in addr() mode; it -// must thus be addressable. -// -// escaping is defined as per builder.addr(). -// -func (b *builder) receiver(fn *Function, e ast.Expr, wantAddr, escaping bool, sel *types.Selection) Value { - var v Value - if wantAddr && !sel.Indirect() && !isPointer(fn.Pkg.typeOf(e)) { - v = b.addr(fn, e, escaping).address(fn) - } else { - v = b.expr(fn, e) - } - - last := len(sel.Index()) - 1 - v = emitImplicitSelections(fn, v, sel.Index()[:last]) - if !wantAddr && isPointer(v.Type()) { - v = emitLoad(fn, v) - } - return v -} - -// setCallFunc populates the function parts of a CallCommon structure -// (Func, Method, Recv, Args[0]) based on the kind of invocation -// occurring in e. -// -func (b *builder) setCallFunc(fn *Function, e *ast.CallExpr, c *CallCommon) { - c.pos = e.Lparen - - // Is this a method call? - if selector, ok := unparen(e.Fun).(*ast.SelectorExpr); ok { - sel, ok := fn.Pkg.info.Selections[selector] - if ok && sel.Kind() == types.MethodVal { - obj := sel.Obj().(*types.Func) - recv := recvType(obj) - wantAddr := isPointer(recv) - escaping := true - v := b.receiver(fn, selector.X, wantAddr, escaping, sel) - if isInterface(recv) { - // Invoke-mode call. - c.Value = v - c.Method = obj - } else { - // "Call"-mode call. - c.Value = fn.Prog.declaredFunc(obj) - c.Args = append(c.Args, v) - } - return - } - - // sel.Kind()==MethodExpr indicates T.f() or (*T).f(): - // a statically dispatched call to the method f in the - // method-set of T or *T. T may be an interface. - // - // e.Fun would evaluate to a concrete method, interface - // wrapper function, or promotion wrapper. - // - // For now, we evaluate it in the usual way. - // - // TODO(adonovan): opt: inline expr() here, to make the - // call static and to avoid generation of wrappers. - // It's somewhat tricky as it may consume the first - // actual parameter if the call is "invoke" mode. - // - // Examples: - // type T struct{}; func (T) f() {} // "call" mode - // type T interface { f() } // "invoke" mode - // - // type S struct{ T } - // - // var s S - // S.f(s) - // (*S).f(&s) - // - // Suggested approach: - // - consume the first actual parameter expression - // and build it with b.expr(). - // - apply implicit field selections. - // - use MethodVal logic to populate fields of c. - } - - // Evaluate the function operand in the usual way. - c.Value = b.expr(fn, e.Fun) -} - -// emitCallArgs emits to f code for the actual parameters of call e to -// a (possibly built-in) function of effective type sig. -// The argument values are appended to args, which is then returned. -// -func (b *builder) emitCallArgs(fn *Function, sig *types.Signature, e *ast.CallExpr, args []Value) []Value { - // f(x, y, z...): pass slice z straight through. - if e.Ellipsis != 0 { - for i, arg := range e.Args { - v := emitConv(fn, b.expr(fn, arg), sig.Params().At(i).Type()) - args = append(args, v) - } - return args - } - - offset := len(args) // 1 if call has receiver, 0 otherwise - - // Evaluate actual parameter expressions. - // - // If this is a chained call of the form f(g()) where g has - // multiple return values (MRV), they are flattened out into - // args; a suffix of them may end up in a varargs slice. - for _, arg := range e.Args { - v := b.expr(fn, arg) - if ttuple, ok := v.Type().(*types.Tuple); ok { // MRV chain - for i, n := 0, ttuple.Len(); i < n; i++ { - args = append(args, emitExtract(fn, v, i)) - } - } else { - args = append(args, v) - } - } - - // Actual->formal assignability conversions for normal parameters. - np := sig.Params().Len() // number of normal parameters - if sig.Variadic() { - np-- - } - for i := 0; i < np; i++ { - args[offset+i] = emitConv(fn, args[offset+i], sig.Params().At(i).Type()) - } - - // Actual->formal assignability conversions for variadic parameter, - // and construction of slice. - if sig.Variadic() { - varargs := args[offset+np:] - st := sig.Params().At(np).Type().(*types.Slice) - vt := st.Elem() - if len(varargs) == 0 { - args = append(args, nilConst(st)) - } else { - // Replace a suffix of args with a slice containing it. - at := types.NewArray(vt, int64(len(varargs))) - a := emitNew(fn, at, token.NoPos) - a.setPos(e.Rparen) - a.Comment = "varargs" - for i, arg := range varargs { - iaddr := &IndexAddr{ - X: a, - Index: intConst(int64(i)), - } - iaddr.setType(types.NewPointer(vt)) - fn.emit(iaddr) - emitStore(fn, iaddr, arg, arg.Pos()) - } - s := &Slice{X: a} - s.setType(st) - args[offset+np] = fn.emit(s) - args = args[:offset+np+1] - } - } - return args -} - -// setCall emits to fn code to evaluate all the parameters of a function -// call e, and populates *c with those values. -// -func (b *builder) setCall(fn *Function, e *ast.CallExpr, c *CallCommon) { - // First deal with the f(...) part and optional receiver. - b.setCallFunc(fn, e, c) - - // Then append the other actual parameters. - sig, _ := fn.Pkg.typeOf(e.Fun).Underlying().(*types.Signature) - if sig == nil { - panic(fmt.Sprintf("no signature for call of %s", e.Fun)) - } - c.Args = b.emitCallArgs(fn, sig, e, c.Args) -} - -// assignOp emits to fn code to perform loc = val. -func (b *builder) assignOp(fn *Function, loc lvalue, val Value, op token.Token, pos token.Pos) { - oldv := loc.load(fn) - loc.store(fn, emitArith(fn, op, oldv, emitConv(fn, val, oldv.Type()), loc.typ(), pos)) -} - -// localValueSpec emits to fn code to define all of the vars in the -// function-local ValueSpec, spec. -// -func (b *builder) localValueSpec(fn *Function, spec *ast.ValueSpec) { - switch { - case len(spec.Values) == len(spec.Names): - // e.g. var x, y = 0, 1 - // 1:1 assignment - for i, id := range spec.Names { - if !isBlankIdent(id) { - fn.addLocalForIdent(id) - } - lval := b.addr(fn, id, false) // non-escaping - b.assign(fn, lval, spec.Values[i], true, nil) - } - - case len(spec.Values) == 0: - // e.g. var x, y int - // Locals are implicitly zero-initialized. - for _, id := range spec.Names { - if !isBlankIdent(id) { - lhs := fn.addLocalForIdent(id) - if fn.debugInfo() { - emitDebugRef(fn, id, lhs, true) - } - } - } - - default: - // e.g. var x, y = pos() - tuple := b.exprN(fn, spec.Values[0]) - for i, id := range spec.Names { - if !isBlankIdent(id) { - fn.addLocalForIdent(id) - lhs := b.addr(fn, id, false) // non-escaping - lhs.store(fn, emitExtract(fn, tuple, i)) - } - } - } -} - -// assignStmt emits code to fn for a parallel assignment of rhss to lhss. -// isDef is true if this is a short variable declaration (:=). -// -// Note the similarity with localValueSpec. -// -func (b *builder) assignStmt(fn *Function, lhss, rhss []ast.Expr, isDef bool) { - // Side effects of all LHSs and RHSs must occur in left-to-right order. - lvals := make([]lvalue, len(lhss)) - isZero := make([]bool, len(lhss)) - for i, lhs := range lhss { - var lval lvalue = blank{} - if !isBlankIdent(lhs) { - if isDef { - if obj := fn.Pkg.info.Defs[lhs.(*ast.Ident)]; obj != nil { - fn.addNamedLocal(obj) - isZero[i] = true - } - } - lval = b.addr(fn, lhs, false) // non-escaping - } - lvals[i] = lval - } - if len(lhss) == len(rhss) { - // Simple assignment: x = f() (!isDef) - // Parallel assignment: x, y = f(), g() (!isDef) - // or short var decl: x, y := f(), g() (isDef) - // - // In all cases, the RHSs may refer to the LHSs, - // so we need a storebuf. - var sb storebuf - for i := range rhss { - b.assign(fn, lvals[i], rhss[i], isZero[i], &sb) - } - sb.emit(fn) - } else { - // e.g. x, y = pos() - tuple := b.exprN(fn, rhss[0]) - emitDebugRef(fn, rhss[0], tuple, false) - for i, lval := range lvals { - lval.store(fn, emitExtract(fn, tuple, i)) - } - } -} - -// arrayLen returns the length of the array whose composite literal elements are elts. -func (b *builder) arrayLen(fn *Function, elts []ast.Expr) int64 { - var max int64 = -1 - var i int64 = -1 - for _, e := range elts { - if kv, ok := e.(*ast.KeyValueExpr); ok { - i = b.expr(fn, kv.Key).(*Const).Int64() - } else { - i++ - } - if i > max { - max = i - } - } - return max + 1 -} - -// compLit emits to fn code to initialize a composite literal e at -// address addr with type typ. -// -// Nested composite literals are recursively initialized in place -// where possible. If isZero is true, compLit assumes that addr -// holds the zero value for typ. -// -// Because the elements of a composite literal may refer to the -// variables being updated, as in the second line below, -// x := T{a: 1} -// x = T{a: x.a} -// all the reads must occur before all the writes. Thus all stores to -// loc are emitted to the storebuf sb for later execution. -// -// A CompositeLit may have pointer type only in the recursive (nested) -// case when the type name is implicit. e.g. in []*T{{}}, the inner -// literal has type *T behaves like &T{}. -// In that case, addr must hold a T, not a *T. -// -func (b *builder) compLit(fn *Function, addr Value, e *ast.CompositeLit, isZero bool, sb *storebuf) { - typ := deref(fn.Pkg.typeOf(e)) - switch t := typ.Underlying().(type) { - case *types.Struct: - if !isZero && len(e.Elts) != t.NumFields() { - // memclear - sb.store(&address{addr, e.Lbrace, nil}, - zeroValue(fn, deref(addr.Type()))) - isZero = true - } - for i, e := range e.Elts { - fieldIndex := i - pos := e.Pos() - if kv, ok := e.(*ast.KeyValueExpr); ok { - fname := kv.Key.(*ast.Ident).Name - for i, n := 0, t.NumFields(); i < n; i++ { - sf := t.Field(i) - if sf.Name() == fname { - fieldIndex = i - pos = kv.Colon - e = kv.Value - break - } - } - } - sf := t.Field(fieldIndex) - faddr := &FieldAddr{ - X: addr, - Field: fieldIndex, - } - faddr.setType(types.NewPointer(sf.Type())) - fn.emit(faddr) - b.assign(fn, &address{addr: faddr, pos: pos, expr: e}, e, isZero, sb) - } - - case *types.Array, *types.Slice: - var at *types.Array - var array Value - switch t := t.(type) { - case *types.Slice: - at = types.NewArray(t.Elem(), b.arrayLen(fn, e.Elts)) - alloc := emitNew(fn, at, e.Lbrace) - alloc.Comment = "slicelit" - array = alloc - case *types.Array: - at = t - array = addr - - if !isZero && int64(len(e.Elts)) != at.Len() { - // memclear - sb.store(&address{array, e.Lbrace, nil}, - zeroValue(fn, deref(array.Type()))) - } - } - - var idx *Const - for _, e := range e.Elts { - pos := e.Pos() - if kv, ok := e.(*ast.KeyValueExpr); ok { - idx = b.expr(fn, kv.Key).(*Const) - pos = kv.Colon - e = kv.Value - } else { - var idxval int64 - if idx != nil { - idxval = idx.Int64() + 1 - } - idx = intConst(idxval) - } - iaddr := &IndexAddr{ - X: array, - Index: idx, - } - iaddr.setType(types.NewPointer(at.Elem())) - fn.emit(iaddr) - if t != at { // slice - // backing array is unaliased => storebuf not needed. - b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, nil) - } else { - b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, sb) - } - } - - if t != at { // slice - s := &Slice{X: array} - s.setPos(e.Lbrace) - s.setType(typ) - sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, fn.emit(s)) - } - - case *types.Map: - m := &MakeMap{Reserve: intConst(int64(len(e.Elts)))} - m.setPos(e.Lbrace) - m.setType(typ) - fn.emit(m) - for _, e := range e.Elts { - e := e.(*ast.KeyValueExpr) - - // If a key expression in a map literal is itself a - // composite literal, the type may be omitted. - // For example: - // map[*struct{}]bool{{}: true} - // An &-operation may be implied: - // map[*struct{}]bool{&struct{}{}: true} - var key Value - if _, ok := unparen(e.Key).(*ast.CompositeLit); ok && isPointer(t.Key()) { - // A CompositeLit never evaluates to a pointer, - // so if the type of the location is a pointer, - // an &-operation is implied. - key = b.addr(fn, e.Key, true).address(fn) - } else { - key = b.expr(fn, e.Key) - } - - loc := element{ - m: m, - k: emitConv(fn, key, t.Key()), - t: t.Elem(), - pos: e.Colon, - } - - // We call assign() only because it takes care - // of any &-operation required in the recursive - // case, e.g., - // map[int]*struct{}{0: {}} implies &struct{}{}. - // In-place update is of course impossible, - // and no storebuf is needed. - b.assign(fn, &loc, e.Value, true, nil) - } - sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, m) - - default: - panic("unexpected CompositeLit type: " + t.String()) - } -} - -// switchStmt emits to fn code for the switch statement s, optionally -// labelled by label. -// -func (b *builder) switchStmt(fn *Function, s *ast.SwitchStmt, label *lblock) { - // We treat SwitchStmt like a sequential if-else chain. - // Multiway dispatch can be recovered later by ssautil.Switches() - // to those cases that are free of side effects. - if s.Init != nil { - b.stmt(fn, s.Init) - } - var tag Value = vTrue - if s.Tag != nil { - tag = b.expr(fn, s.Tag) - } - done := fn.newBasicBlock("switch.done") - if label != nil { - label._break = done - } - // We pull the default case (if present) down to the end. - // But each fallthrough label must point to the next - // body block in source order, so we preallocate a - // body block (fallthru) for the next case. - // Unfortunately this makes for a confusing block order. - var dfltBody *[]ast.Stmt - var dfltFallthrough *BasicBlock - var fallthru, dfltBlock *BasicBlock - ncases := len(s.Body.List) - for i, clause := range s.Body.List { - body := fallthru - if body == nil { - body = fn.newBasicBlock("switch.body") // first case only - } - - // Preallocate body block for the next case. - fallthru = done - if i+1 < ncases { - fallthru = fn.newBasicBlock("switch.body") - } - - cc := clause.(*ast.CaseClause) - if cc.List == nil { - // Default case. - dfltBody = &cc.Body - dfltFallthrough = fallthru - dfltBlock = body - continue - } - - var nextCond *BasicBlock - for _, cond := range cc.List { - nextCond = fn.newBasicBlock("switch.next") - // TODO(adonovan): opt: when tag==vTrue, we'd - // get better code if we use b.cond(cond) - // instead of BinOp(EQL, tag, b.expr(cond)) - // followed by If. Don't forget conversions - // though. - cond := emitCompare(fn, token.EQL, tag, b.expr(fn, cond), cond.Pos()) - emitIf(fn, cond, body, nextCond) - fn.currentBlock = nextCond - } - fn.currentBlock = body - fn.targets = &targets{ - tail: fn.targets, - _break: done, - _fallthrough: fallthru, - } - b.stmtList(fn, cc.Body) - fn.targets = fn.targets.tail - emitJump(fn, done) - fn.currentBlock = nextCond - } - if dfltBlock != nil { - emitJump(fn, dfltBlock) - fn.currentBlock = dfltBlock - fn.targets = &targets{ - tail: fn.targets, - _break: done, - _fallthrough: dfltFallthrough, - } - b.stmtList(fn, *dfltBody) - fn.targets = fn.targets.tail - } - emitJump(fn, done) - fn.currentBlock = done -} - -// typeSwitchStmt emits to fn code for the type switch statement s, optionally -// labelled by label. -// -func (b *builder) typeSwitchStmt(fn *Function, s *ast.TypeSwitchStmt, label *lblock) { - // We treat TypeSwitchStmt like a sequential if-else chain. - // Multiway dispatch can be recovered later by ssautil.Switches(). - - // Typeswitch lowering: - // - // var x X - // switch y := x.(type) { - // case T1, T2: S1 // >1 (y := x) - // case nil: SN // nil (y := x) - // default: SD // 0 types (y := x) - // case T3: S3 // 1 type (y := x.(T3)) - // } - // - // ...s.Init... - // x := eval x - // .caseT1: - // t1, ok1 := typeswitch,ok x - // if ok1 then goto S1 else goto .caseT2 - // .caseT2: - // t2, ok2 := typeswitch,ok x - // if ok2 then goto S1 else goto .caseNil - // .S1: - // y := x - // ...S1... - // goto done - // .caseNil: - // if t2, ok2 := typeswitch,ok x - // if x == nil then goto SN else goto .caseT3 - // .SN: - // y := x - // ...SN... - // goto done - // .caseT3: - // t3, ok3 := typeswitch,ok x - // if ok3 then goto S3 else goto default - // .S3: - // y := t3 - // ...S3... - // goto done - // .default: - // y := x - // ...SD... - // goto done - // .done: - - if s.Init != nil { - b.stmt(fn, s.Init) - } - - var x Value - switch ass := s.Assign.(type) { - case *ast.ExprStmt: // x.(type) - x = b.expr(fn, unparen(ass.X).(*ast.TypeAssertExpr).X) - case *ast.AssignStmt: // y := x.(type) - x = b.expr(fn, unparen(ass.Rhs[0]).(*ast.TypeAssertExpr).X) - } - - done := fn.newBasicBlock("typeswitch.done") - if label != nil { - label._break = done - } - var default_ *ast.CaseClause - for _, clause := range s.Body.List { - cc := clause.(*ast.CaseClause) - if cc.List == nil { - default_ = cc - continue - } - body := fn.newBasicBlock("typeswitch.body") - var next *BasicBlock - var casetype types.Type - var ti Value // ti, ok := typeassert,ok x - for _, cond := range cc.List { - next = fn.newBasicBlock("typeswitch.next") - casetype = fn.Pkg.typeOf(cond) - var condv Value - if casetype == tUntypedNil { - condv = emitCompare(fn, token.EQL, x, nilConst(x.Type()), token.NoPos) - ti = x - } else { - yok := emitTypeTest(fn, x, casetype, cc.Case) - ti = emitExtract(fn, yok, 0) - condv = emitExtract(fn, yok, 1) - } - emitIf(fn, condv, body, next) - fn.currentBlock = next - } - if len(cc.List) != 1 { - ti = x - } - fn.currentBlock = body - b.typeCaseBody(fn, cc, ti, done) - fn.currentBlock = next - } - if default_ != nil { - b.typeCaseBody(fn, default_, x, done) - } else { - emitJump(fn, done) - } - fn.currentBlock = done -} - -func (b *builder) typeCaseBody(fn *Function, cc *ast.CaseClause, x Value, done *BasicBlock) { - if obj := fn.Pkg.info.Implicits[cc]; obj != nil { - // In a switch y := x.(type), each case clause - // implicitly declares a distinct object y. - // In a single-type case, y has that type. - // In multi-type cases, 'case nil' and default, - // y has the same type as the interface operand. - emitStore(fn, fn.addNamedLocal(obj), x, obj.Pos()) - } - fn.targets = &targets{ - tail: fn.targets, - _break: done, - } - b.stmtList(fn, cc.Body) - fn.targets = fn.targets.tail - emitJump(fn, done) -} - -// selectStmt emits to fn code for the select statement s, optionally -// labelled by label. -// -func (b *builder) selectStmt(fn *Function, s *ast.SelectStmt, label *lblock) { - // A blocking select of a single case degenerates to a - // simple send or receive. - // TODO(adonovan): opt: is this optimization worth its weight? - if len(s.Body.List) == 1 { - clause := s.Body.List[0].(*ast.CommClause) - if clause.Comm != nil { - b.stmt(fn, clause.Comm) - done := fn.newBasicBlock("select.done") - if label != nil { - label._break = done - } - fn.targets = &targets{ - tail: fn.targets, - _break: done, - } - b.stmtList(fn, clause.Body) - fn.targets = fn.targets.tail - emitJump(fn, done) - fn.currentBlock = done - return - } - } - - // First evaluate all channels in all cases, and find - // the directions of each state. - var states []*SelectState - blocking := true - debugInfo := fn.debugInfo() - for _, clause := range s.Body.List { - var st *SelectState - switch comm := clause.(*ast.CommClause).Comm.(type) { - case nil: // default case - blocking = false - continue - - case *ast.SendStmt: // ch<- i - ch := b.expr(fn, comm.Chan) - st = &SelectState{ - Dir: types.SendOnly, - Chan: ch, - Send: emitConv(fn, b.expr(fn, comm.Value), - ch.Type().Underlying().(*types.Chan).Elem()), - Pos: comm.Arrow, - } - if debugInfo { - st.DebugNode = comm - } - - case *ast.AssignStmt: // x := <-ch - recv := unparen(comm.Rhs[0]).(*ast.UnaryExpr) - st = &SelectState{ - Dir: types.RecvOnly, - Chan: b.expr(fn, recv.X), - Pos: recv.OpPos, - } - if debugInfo { - st.DebugNode = recv - } - - case *ast.ExprStmt: // <-ch - recv := unparen(comm.X).(*ast.UnaryExpr) - st = &SelectState{ - Dir: types.RecvOnly, - Chan: b.expr(fn, recv.X), - Pos: recv.OpPos, - } - if debugInfo { - st.DebugNode = recv - } - } - states = append(states, st) - } - - // We dispatch on the (fair) result of Select using a - // sequential if-else chain, in effect: - // - // idx, recvOk, r0...r_n-1 := select(...) - // if idx == 0 { // receive on channel 0 (first receive => r0) - // x, ok := r0, recvOk - // ...state0... - // } else if v == 1 { // send on channel 1 - // ...state1... - // } else { - // ...default... - // } - sel := &Select{ - States: states, - Blocking: blocking, - } - sel.setPos(s.Select) - var vars []*types.Var - vars = append(vars, varIndex, varOk) - for _, st := range states { - if st.Dir == types.RecvOnly { - tElem := st.Chan.Type().Underlying().(*types.Chan).Elem() - vars = append(vars, anonVar(tElem)) - } - } - sel.setType(types.NewTuple(vars...)) - - fn.emit(sel) - idx := emitExtract(fn, sel, 0) - - done := fn.newBasicBlock("select.done") - if label != nil { - label._break = done - } - - var defaultBody *[]ast.Stmt - state := 0 - r := 2 // index in 'sel' tuple of value; increments if st.Dir==RECV - for _, cc := range s.Body.List { - clause := cc.(*ast.CommClause) - if clause.Comm == nil { - defaultBody = &clause.Body - continue - } - body := fn.newBasicBlock("select.body") - next := fn.newBasicBlock("select.next") - emitIf(fn, emitCompare(fn, token.EQL, idx, intConst(int64(state)), token.NoPos), body, next) - fn.currentBlock = body - fn.targets = &targets{ - tail: fn.targets, - _break: done, - } - switch comm := clause.Comm.(type) { - case *ast.ExprStmt: // <-ch - if debugInfo { - v := emitExtract(fn, sel, r) - emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false) - } - r++ - - case *ast.AssignStmt: // x := <-states[state].Chan - if comm.Tok == token.DEFINE { - fn.addLocalForIdent(comm.Lhs[0].(*ast.Ident)) - } - x := b.addr(fn, comm.Lhs[0], false) // non-escaping - v := emitExtract(fn, sel, r) - if debugInfo { - emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false) - } - x.store(fn, v) - - if len(comm.Lhs) == 2 { // x, ok := ... - if comm.Tok == token.DEFINE { - fn.addLocalForIdent(comm.Lhs[1].(*ast.Ident)) - } - ok := b.addr(fn, comm.Lhs[1], false) // non-escaping - ok.store(fn, emitExtract(fn, sel, 1)) - } - r++ - } - b.stmtList(fn, clause.Body) - fn.targets = fn.targets.tail - emitJump(fn, done) - fn.currentBlock = next - state++ - } - if defaultBody != nil { - fn.targets = &targets{ - tail: fn.targets, - _break: done, - } - b.stmtList(fn, *defaultBody) - fn.targets = fn.targets.tail - } else { - // A blocking select must match some case. - // (This should really be a runtime.errorString, not a string.) - fn.emit(&Panic{ - X: emitConv(fn, stringConst("blocking select matched no case"), tEface), - }) - fn.currentBlock = fn.newBasicBlock("unreachable") - } - emitJump(fn, done) - fn.currentBlock = done -} - -// forStmt emits to fn code for the for statement s, optionally -// labelled by label. -// -func (b *builder) forStmt(fn *Function, s *ast.ForStmt, label *lblock) { - // ...init... - // jump loop - // loop: - // if cond goto body else done - // body: - // ...body... - // jump post - // post: (target of continue) - // ...post... - // jump loop - // done: (target of break) - if s.Init != nil { - b.stmt(fn, s.Init) - } - body := fn.newBasicBlock("for.body") - done := fn.newBasicBlock("for.done") // target of 'break' - loop := body // target of back-edge - if s.Cond != nil { - loop = fn.newBasicBlock("for.loop") - } - cont := loop // target of 'continue' - if s.Post != nil { - cont = fn.newBasicBlock("for.post") - } - if label != nil { - label._break = done - label._continue = cont - } - emitJump(fn, loop) - fn.currentBlock = loop - if loop != body { - b.cond(fn, s.Cond, body, done) - fn.currentBlock = body - } - fn.targets = &targets{ - tail: fn.targets, - _break: done, - _continue: cont, - } - b.stmt(fn, s.Body) - fn.targets = fn.targets.tail - emitJump(fn, cont) - - if s.Post != nil { - fn.currentBlock = cont - b.stmt(fn, s.Post) - emitJump(fn, loop) // back-edge - } - fn.currentBlock = done -} - -// rangeIndexed emits to fn the header for an integer-indexed loop -// over array, *array or slice value x. -// The v result is defined only if tv is non-nil. -// forPos is the position of the "for" token. -// -func (b *builder) rangeIndexed(fn *Function, x Value, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) { - // - // length = len(x) - // index = -1 - // loop: (target of continue) - // index++ - // if index < length goto body else done - // body: - // k = index - // v = x[index] - // ...body... - // jump loop - // done: (target of break) - - // Determine number of iterations. - var length Value - if arr, ok := deref(x.Type()).Underlying().(*types.Array); ok { - // For array or *array, the number of iterations is - // known statically thanks to the type. We avoid a - // data dependence upon x, permitting later dead-code - // elimination if x is pure, static unrolling, etc. - // Ranging over a nil *array may have >0 iterations. - // We still generate code for x, in case it has effects. - length = intConst(arr.Len()) - } else { - // length = len(x). - var c Call - c.Call.Value = makeLen(x.Type()) - c.Call.Args = []Value{x} - c.setType(tInt) - length = fn.emit(&c) - } - - index := fn.addLocal(tInt, token.NoPos) - emitStore(fn, index, intConst(-1), pos) - - loop = fn.newBasicBlock("rangeindex.loop") - emitJump(fn, loop) - fn.currentBlock = loop - - incr := &BinOp{ - Op: token.ADD, - X: emitLoad(fn, index), - Y: vOne, - } - incr.setType(tInt) - emitStore(fn, index, fn.emit(incr), pos) - - body := fn.newBasicBlock("rangeindex.body") - done = fn.newBasicBlock("rangeindex.done") - emitIf(fn, emitCompare(fn, token.LSS, incr, length, token.NoPos), body, done) - fn.currentBlock = body - - k = emitLoad(fn, index) - if tv != nil { - switch t := x.Type().Underlying().(type) { - case *types.Array: - instr := &Index{ - X: x, - Index: k, - } - instr.setType(t.Elem()) - v = fn.emit(instr) - - case *types.Pointer: // *array - instr := &IndexAddr{ - X: x, - Index: k, - } - instr.setType(types.NewPointer(t.Elem().Underlying().(*types.Array).Elem())) - v = emitLoad(fn, fn.emit(instr)) - - case *types.Slice: - instr := &IndexAddr{ - X: x, - Index: k, - } - instr.setType(types.NewPointer(t.Elem())) - v = emitLoad(fn, fn.emit(instr)) - - default: - panic("rangeIndexed x:" + t.String()) - } - } - return -} - -// rangeIter emits to fn the header for a loop using -// Range/Next/Extract to iterate over map or string value x. -// tk and tv are the types of the key/value results k and v, or nil -// if the respective component is not wanted. -// -func (b *builder) rangeIter(fn *Function, x Value, tk, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) { - // - // it = range x - // loop: (target of continue) - // okv = next it (ok, key, value) - // ok = extract okv #0 - // if ok goto body else done - // body: - // k = extract okv #1 - // v = extract okv #2 - // ...body... - // jump loop - // done: (target of break) - // - - if tk == nil { - tk = tInvalid - } - if tv == nil { - tv = tInvalid - } - - rng := &Range{X: x} - rng.setPos(pos) - rng.setType(tRangeIter) - it := fn.emit(rng) - - loop = fn.newBasicBlock("rangeiter.loop") - emitJump(fn, loop) - fn.currentBlock = loop - - _, isString := x.Type().Underlying().(*types.Basic) - - okv := &Next{ - Iter: it, - IsString: isString, - } - okv.setType(types.NewTuple( - varOk, - newVar("k", tk), - newVar("v", tv), - )) - fn.emit(okv) - - body := fn.newBasicBlock("rangeiter.body") - done = fn.newBasicBlock("rangeiter.done") - emitIf(fn, emitExtract(fn, okv, 0), body, done) - fn.currentBlock = body - - if tk != tInvalid { - k = emitExtract(fn, okv, 1) - } - if tv != tInvalid { - v = emitExtract(fn, okv, 2) - } - return -} - -// rangeChan emits to fn the header for a loop that receives from -// channel x until it fails. -// tk is the channel's element type, or nil if the k result is -// not wanted -// pos is the position of the '=' or ':=' token. -// -func (b *builder) rangeChan(fn *Function, x Value, tk types.Type, pos token.Pos) (k Value, loop, done *BasicBlock) { - // - // loop: (target of continue) - // ko = <-x (key, ok) - // ok = extract ko #1 - // if ok goto body else done - // body: - // k = extract ko #0 - // ... - // goto loop - // done: (target of break) - - loop = fn.newBasicBlock("rangechan.loop") - emitJump(fn, loop) - fn.currentBlock = loop - recv := &UnOp{ - Op: token.ARROW, - X: x, - CommaOk: true, - } - recv.setPos(pos) - recv.setType(types.NewTuple( - newVar("k", x.Type().Underlying().(*types.Chan).Elem()), - varOk, - )) - ko := fn.emit(recv) - body := fn.newBasicBlock("rangechan.body") - done = fn.newBasicBlock("rangechan.done") - emitIf(fn, emitExtract(fn, ko, 1), body, done) - fn.currentBlock = body - if tk != nil { - k = emitExtract(fn, ko, 0) - } - return -} - -// rangeStmt emits to fn code for the range statement s, optionally -// labelled by label. -// -func (b *builder) rangeStmt(fn *Function, s *ast.RangeStmt, label *lblock) { - var tk, tv types.Type - if s.Key != nil && !isBlankIdent(s.Key) { - tk = fn.Pkg.typeOf(s.Key) - } - if s.Value != nil && !isBlankIdent(s.Value) { - tv = fn.Pkg.typeOf(s.Value) - } - - // If iteration variables are defined (:=), this - // occurs once outside the loop. - // - // Unlike a short variable declaration, a RangeStmt - // using := never redeclares an existing variable; it - // always creates a new one. - if s.Tok == token.DEFINE { - if tk != nil { - fn.addLocalForIdent(s.Key.(*ast.Ident)) - } - if tv != nil { - fn.addLocalForIdent(s.Value.(*ast.Ident)) - } - } - - x := b.expr(fn, s.X) - - var k, v Value - var loop, done *BasicBlock - switch rt := x.Type().Underlying().(type) { - case *types.Slice, *types.Array, *types.Pointer: // *array - k, v, loop, done = b.rangeIndexed(fn, x, tv, s.For) - - case *types.Chan: - k, loop, done = b.rangeChan(fn, x, tk, s.For) - - case *types.Map, *types.Basic: // string - k, v, loop, done = b.rangeIter(fn, x, tk, tv, s.For) - - default: - panic("Cannot range over: " + rt.String()) - } - - // Evaluate both LHS expressions before we update either. - var kl, vl lvalue - if tk != nil { - kl = b.addr(fn, s.Key, false) // non-escaping - } - if tv != nil { - vl = b.addr(fn, s.Value, false) // non-escaping - } - if tk != nil { - kl.store(fn, k) - } - if tv != nil { - vl.store(fn, v) - } - - if label != nil { - label._break = done - label._continue = loop - } - - fn.targets = &targets{ - tail: fn.targets, - _break: done, - _continue: loop, - } - b.stmt(fn, s.Body) - fn.targets = fn.targets.tail - emitJump(fn, loop) // back-edge - fn.currentBlock = done -} - -// stmt lowers statement s to SSA form, emitting code to fn. -func (b *builder) stmt(fn *Function, _s ast.Stmt) { - // The label of the current statement. If non-nil, its _goto - // target is always set; its _break and _continue are set only - // within the body of switch/typeswitch/select/for/range. - // It is effectively an additional default-nil parameter of stmt(). - var label *lblock -start: - switch s := _s.(type) { - case *ast.EmptyStmt: - // ignore. (Usually removed by gofmt.) - - case *ast.DeclStmt: // Con, Var or Typ - d := s.Decl.(*ast.GenDecl) - if d.Tok == token.VAR { - for _, spec := range d.Specs { - if vs, ok := spec.(*ast.ValueSpec); ok { - b.localValueSpec(fn, vs) - } - } - } - - case *ast.LabeledStmt: - label = fn.labelledBlock(s.Label) - emitJump(fn, label._goto) - fn.currentBlock = label._goto - _s = s.Stmt - goto start // effectively: tailcall stmt(fn, s.Stmt, label) - - case *ast.ExprStmt: - b.expr(fn, s.X) - - case *ast.SendStmt: - fn.emit(&Send{ - Chan: b.expr(fn, s.Chan), - X: emitConv(fn, b.expr(fn, s.Value), - fn.Pkg.typeOf(s.Chan).Underlying().(*types.Chan).Elem()), - pos: s.Arrow, - }) - - case *ast.IncDecStmt: - op := token.ADD - if s.Tok == token.DEC { - op = token.SUB - } - loc := b.addr(fn, s.X, false) - b.assignOp(fn, loc, NewConst(constant.MakeInt64(1), loc.typ()), op, s.Pos()) - - case *ast.AssignStmt: - switch s.Tok { - case token.ASSIGN, token.DEFINE: - b.assignStmt(fn, s.Lhs, s.Rhs, s.Tok == token.DEFINE) - - default: // +=, etc. - op := s.Tok + token.ADD - token.ADD_ASSIGN - b.assignOp(fn, b.addr(fn, s.Lhs[0], false), b.expr(fn, s.Rhs[0]), op, s.Pos()) - } - - case *ast.GoStmt: - // The "intrinsics" new/make/len/cap are forbidden here. - // panic is treated like an ordinary function call. - v := Go{pos: s.Go} - b.setCall(fn, s.Call, &v.Call) - fn.emit(&v) - - case *ast.DeferStmt: - // The "intrinsics" new/make/len/cap are forbidden here. - // panic is treated like an ordinary function call. - v := Defer{pos: s.Defer} - b.setCall(fn, s.Call, &v.Call) - fn.emit(&v) - - // A deferred call can cause recovery from panic, - // and control resumes at the Recover block. - createRecoverBlock(fn) - - case *ast.ReturnStmt: - var results []Value - if len(s.Results) == 1 && fn.Signature.Results().Len() > 1 { - // Return of one expression in a multi-valued function. - tuple := b.exprN(fn, s.Results[0]) - ttuple := tuple.Type().(*types.Tuple) - for i, n := 0, ttuple.Len(); i < n; i++ { - results = append(results, - emitConv(fn, emitExtract(fn, tuple, i), - fn.Signature.Results().At(i).Type())) - } - } else { - // 1:1 return, or no-arg return in non-void function. - for i, r := range s.Results { - v := emitConv(fn, b.expr(fn, r), fn.Signature.Results().At(i).Type()) - results = append(results, v) - } - } - if fn.namedResults != nil { - // Function has named result parameters (NRPs). - // Perform parallel assignment of return operands to NRPs. - for i, r := range results { - emitStore(fn, fn.namedResults[i], r, s.Return) - } - } - // Run function calls deferred in this - // function when explicitly returning from it. - fn.emit(new(RunDefers)) - if fn.namedResults != nil { - // Reload NRPs to form the result tuple. - results = results[:0] - for _, r := range fn.namedResults { - results = append(results, emitLoad(fn, r)) - } - } - fn.emit(&Return{Results: results, pos: s.Return}) - fn.currentBlock = fn.newBasicBlock("unreachable") - - case *ast.BranchStmt: - var block *BasicBlock - switch s.Tok { - case token.BREAK: - if s.Label != nil { - block = fn.labelledBlock(s.Label)._break - } else { - for t := fn.targets; t != nil && block == nil; t = t.tail { - block = t._break - } - } - - case token.CONTINUE: - if s.Label != nil { - block = fn.labelledBlock(s.Label)._continue - } else { - for t := fn.targets; t != nil && block == nil; t = t.tail { - block = t._continue - } - } - - case token.FALLTHROUGH: - for t := fn.targets; t != nil && block == nil; t = t.tail { - block = t._fallthrough - } - - case token.GOTO: - block = fn.labelledBlock(s.Label)._goto - } - emitJump(fn, block) - fn.currentBlock = fn.newBasicBlock("unreachable") - - case *ast.BlockStmt: - b.stmtList(fn, s.List) - - case *ast.IfStmt: - if s.Init != nil { - b.stmt(fn, s.Init) - } - then := fn.newBasicBlock("if.then") - done := fn.newBasicBlock("if.done") - els := done - if s.Else != nil { - els = fn.newBasicBlock("if.else") - } - b.cond(fn, s.Cond, then, els) - fn.currentBlock = then - b.stmt(fn, s.Body) - emitJump(fn, done) - - if s.Else != nil { - fn.currentBlock = els - b.stmt(fn, s.Else) - emitJump(fn, done) - } - - fn.currentBlock = done - - case *ast.SwitchStmt: - b.switchStmt(fn, s, label) - - case *ast.TypeSwitchStmt: - b.typeSwitchStmt(fn, s, label) - - case *ast.SelectStmt: - b.selectStmt(fn, s, label) - - case *ast.ForStmt: - b.forStmt(fn, s, label) - - case *ast.RangeStmt: - b.rangeStmt(fn, s, label) - - default: - panic(fmt.Sprintf("unexpected statement kind: %T", s)) - } -} - -// buildFunction builds SSA code for the body of function fn. Idempotent. -func (b *builder) buildFunction(fn *Function) { - if fn.Blocks != nil { - return // building already started - } - - var recvField *ast.FieldList - var body *ast.BlockStmt - var functype *ast.FuncType - switch n := fn.syntax.(type) { - case nil: - return // not a Go source function. (Synthetic, or from object file.) - case *ast.FuncDecl: - functype = n.Type - recvField = n.Recv - body = n.Body - case *ast.FuncLit: - functype = n.Type - body = n.Body - default: - panic(n) - } - - if body == nil { - // External function. - if fn.Params == nil { - // This condition ensures we add a non-empty - // params list once only, but we may attempt - // the degenerate empty case repeatedly. - // TODO(adonovan): opt: don't do that. - - // We set Function.Params even though there is no body - // code to reference them. This simplifies clients. - if recv := fn.Signature.Recv(); recv != nil { - fn.addParamObj(recv) - } - params := fn.Signature.Params() - for i, n := 0, params.Len(); i < n; i++ { - fn.addParamObj(params.At(i)) - } - } - return - } - if fn.Prog.mode&LogSource != 0 { - defer logStack("build function %s @ %s", fn, fn.Prog.Fset.Position(fn.pos))() - } - fn.startBody() - fn.createSyntacticParams(recvField, functype) - b.stmt(fn, body) - if cb := fn.currentBlock; cb != nil && (cb == fn.Blocks[0] || cb == fn.Recover || cb.Preds != nil) { - // Control fell off the end of the function's body block. - // - // Block optimizations eliminate the current block, if - // unreachable. It is a builder invariant that - // if this no-arg return is ill-typed for - // fn.Signature.Results, this block must be - // unreachable. The sanity checker checks this. - fn.emit(new(RunDefers)) - fn.emit(new(Return)) - } - fn.finishBody() -} - -// buildFuncDecl builds SSA code for the function or method declared -// by decl in package pkg. -// -func (b *builder) buildFuncDecl(pkg *Package, decl *ast.FuncDecl) { - id := decl.Name - if isBlankIdent(id) { - return // discard - } - fn := pkg.values[pkg.info.Defs[id]].(*Function) - if decl.Recv == nil && id.Name == "init" { - var v Call - v.Call.Value = fn - v.setType(types.NewTuple()) - pkg.init.emit(&v) - } - b.buildFunction(fn) -} - -// Build calls Package.Build for each package in prog. -// Building occurs in parallel unless the BuildSerially mode flag was set. -// -// Build is intended for whole-program analysis; a typical compiler -// need only build a single package. -// -// Build is idempotent and thread-safe. -// -func (prog *Program) Build() { - var wg sync.WaitGroup - for _, p := range prog.packages { - if prog.mode&BuildSerially != 0 { - p.Build() - } else { - wg.Add(1) - go func(p *Package) { - p.Build() - wg.Done() - }(p) - } - } - wg.Wait() -} - -// Build builds SSA code for all functions and vars in package p. -// -// Precondition: CreatePackage must have been called for all of p's -// direct imports (and hence its direct imports must have been -// error-free). -// -// Build is idempotent and thread-safe. -// -func (p *Package) Build() { p.buildOnce.Do(p.build) } - -func (p *Package) build() { - if p.info == nil { - return // synthetic package, e.g. "testmain" - } - - // Ensure we have runtime type info for all exported members. - // TODO(adonovan): ideally belongs in memberFromObject, but - // that would require package creation in topological order. - for name, mem := range p.Members { - if ast.IsExported(name) { - p.Prog.needMethodsOf(mem.Type()) - } - } - if p.Prog.mode&LogSource != 0 { - defer logStack("build %s", p)() - } - init := p.init - init.startBody() - - var done *BasicBlock - - if p.Prog.mode&BareInits == 0 { - // Make init() skip if package is already initialized. - initguard := p.Var("init$guard") - doinit := init.newBasicBlock("init.start") - done = init.newBasicBlock("init.done") - emitIf(init, emitLoad(init, initguard), done, doinit) - init.currentBlock = doinit - emitStore(init, initguard, vTrue, token.NoPos) - - // Call the init() function of each package we import. - for _, pkg := range p.Pkg.Imports() { - prereq := p.Prog.packages[pkg] - if prereq == nil { - panic(fmt.Sprintf("Package(%q).Build(): unsatisfied import: Program.CreatePackage(%q) was not called", p.Pkg.Path(), pkg.Path())) - } - var v Call - v.Call.Value = prereq.init - v.Call.pos = init.pos - v.setType(types.NewTuple()) - init.emit(&v) - } - } - - var b builder - - // Initialize package-level vars in correct order. - for _, varinit := range p.info.InitOrder { - if init.Prog.mode&LogSource != 0 { - fmt.Fprintf(os.Stderr, "build global initializer %v @ %s\n", - varinit.Lhs, p.Prog.Fset.Position(varinit.Rhs.Pos())) - } - if len(varinit.Lhs) == 1 { - // 1:1 initialization: var x, y = a(), b() - var lval lvalue - if v := varinit.Lhs[0]; v.Name() != "_" { - lval = &address{addr: p.values[v].(*Global), pos: v.Pos()} - } else { - lval = blank{} - } - b.assign(init, lval, varinit.Rhs, true, nil) - } else { - // n:1 initialization: var x, y := f() - tuple := b.exprN(init, varinit.Rhs) - for i, v := range varinit.Lhs { - if v.Name() == "_" { - continue - } - emitStore(init, p.values[v].(*Global), emitExtract(init, tuple, i), v.Pos()) - } - } - } - - // Build all package-level functions, init functions - // and methods, including unreachable/blank ones. - // We build them in source order, but it's not significant. - for _, file := range p.files { - for _, decl := range file.Decls { - if decl, ok := decl.(*ast.FuncDecl); ok { - b.buildFuncDecl(p, decl) - } - } - } - - // Finish up init(). - if p.Prog.mode&BareInits == 0 { - emitJump(init, done) - init.currentBlock = done - } - init.emit(new(Return)) - init.finishBody() - - p.info = nil // We no longer need ASTs or go/types deductions. - - if p.Prog.mode&SanityCheckFunctions != 0 { - sanityCheckPackage(p) - } -} - -// Like ObjectOf, but panics instead of returning nil. -// Only valid during p's create and build phases. -func (p *Package) objectOf(id *ast.Ident) types.Object { - if o := p.info.ObjectOf(id); o != nil { - return o - } - panic(fmt.Sprintf("no types.Object for ast.Ident %s @ %s", - id.Name, p.Prog.Fset.Position(id.Pos()))) -} - -// Like TypeOf, but panics instead of returning nil. -// Only valid during p's create and build phases. -func (p *Package) typeOf(e ast.Expr) types.Type { - if T := p.info.TypeOf(e); T != nil { - return T - } - panic(fmt.Sprintf("no type for %T @ %s", - e, p.Prog.Fset.Position(e.Pos()))) -} diff --git a/vendor/honnef.co/go/tools/ssa/const.go b/vendor/honnef.co/go/tools/ssa/const.go deleted file mode 100644 index f95d9e11400..00000000000 --- a/vendor/honnef.co/go/tools/ssa/const.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// This file defines the Const SSA value type. - -import ( - "fmt" - "go/constant" - "go/token" - "go/types" - "strconv" -) - -// NewConst returns a new constant of the specified value and type. -// val must be valid according to the specification of Const.Value. -// -func NewConst(val constant.Value, typ types.Type) *Const { - return &Const{typ, val} -} - -// intConst returns an 'int' constant that evaluates to i. -// (i is an int64 in case the host is narrower than the target.) -func intConst(i int64) *Const { - return NewConst(constant.MakeInt64(i), tInt) -} - -// nilConst returns a nil constant of the specified type, which may -// be any reference type, including interfaces. -// -func nilConst(typ types.Type) *Const { - return NewConst(nil, typ) -} - -// stringConst returns a 'string' constant that evaluates to s. -func stringConst(s string) *Const { - return NewConst(constant.MakeString(s), tString) -} - -// zeroConst returns a new "zero" constant of the specified type, -// which must not be an array or struct type: the zero values of -// aggregates are well-defined but cannot be represented by Const. -// -func zeroConst(t types.Type) *Const { - switch t := t.(type) { - case *types.Basic: - switch { - case t.Info()&types.IsBoolean != 0: - return NewConst(constant.MakeBool(false), t) - case t.Info()&types.IsNumeric != 0: - return NewConst(constant.MakeInt64(0), t) - case t.Info()&types.IsString != 0: - return NewConst(constant.MakeString(""), t) - case t.Kind() == types.UnsafePointer: - fallthrough - case t.Kind() == types.UntypedNil: - return nilConst(t) - default: - panic(fmt.Sprint("zeroConst for unexpected type:", t)) - } - case *types.Pointer, *types.Slice, *types.Interface, *types.Chan, *types.Map, *types.Signature: - return nilConst(t) - case *types.Named: - return NewConst(zeroConst(t.Underlying()).Value, t) - case *types.Array, *types.Struct, *types.Tuple: - panic(fmt.Sprint("zeroConst applied to aggregate:", t)) - } - panic(fmt.Sprint("zeroConst: unexpected ", t)) -} - -func (c *Const) RelString(from *types.Package) string { - var s string - if c.Value == nil { - s = "nil" - } else if c.Value.Kind() == constant.String { - s = constant.StringVal(c.Value) - const max = 20 - // TODO(adonovan): don't cut a rune in half. - if len(s) > max { - s = s[:max-3] + "..." // abbreviate - } - s = strconv.Quote(s) - } else { - s = c.Value.String() - } - return s + ":" + relType(c.Type(), from) -} - -func (c *Const) Name() string { - return c.RelString(nil) -} - -func (c *Const) String() string { - return c.Name() -} - -func (c *Const) Type() types.Type { - return c.typ -} - -func (c *Const) Referrers() *[]Instruction { - return nil -} - -func (c *Const) Parent() *Function { return nil } - -func (c *Const) Pos() token.Pos { - return token.NoPos -} - -// IsNil returns true if this constant represents a typed or untyped nil value. -func (c *Const) IsNil() bool { - return c.Value == nil -} - -// TODO(adonovan): move everything below into honnef.co/go/tools/ssa/interp. - -// Int64 returns the numeric value of this constant truncated to fit -// a signed 64-bit integer. -// -func (c *Const) Int64() int64 { - switch x := constant.ToInt(c.Value); x.Kind() { - case constant.Int: - if i, ok := constant.Int64Val(x); ok { - return i - } - return 0 - case constant.Float: - f, _ := constant.Float64Val(x) - return int64(f) - } - panic(fmt.Sprintf("unexpected constant value: %T", c.Value)) -} - -// Uint64 returns the numeric value of this constant truncated to fit -// an unsigned 64-bit integer. -// -func (c *Const) Uint64() uint64 { - switch x := constant.ToInt(c.Value); x.Kind() { - case constant.Int: - if u, ok := constant.Uint64Val(x); ok { - return u - } - return 0 - case constant.Float: - f, _ := constant.Float64Val(x) - return uint64(f) - } - panic(fmt.Sprintf("unexpected constant value: %T", c.Value)) -} - -// Float64 returns the numeric value of this constant truncated to fit -// a float64. -// -func (c *Const) Float64() float64 { - f, _ := constant.Float64Val(c.Value) - return f -} - -// Complex128 returns the complex value of this constant truncated to -// fit a complex128. -// -func (c *Const) Complex128() complex128 { - re, _ := constant.Float64Val(constant.Real(c.Value)) - im, _ := constant.Float64Val(constant.Imag(c.Value)) - return complex(re, im) -} diff --git a/vendor/honnef.co/go/tools/ssa/create.go b/vendor/honnef.co/go/tools/ssa/create.go deleted file mode 100644 index 85163a0c5a7..00000000000 --- a/vendor/honnef.co/go/tools/ssa/create.go +++ /dev/null @@ -1,270 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// This file implements the CREATE phase of SSA construction. -// See builder.go for explanation. - -import ( - "fmt" - "go/ast" - "go/token" - "go/types" - "os" - "sync" - - "golang.org/x/tools/go/types/typeutil" -) - -// NewProgram returns a new SSA Program. -// -// mode controls diagnostics and checking during SSA construction. -// -func NewProgram(fset *token.FileSet, mode BuilderMode) *Program { - prog := &Program{ - Fset: fset, - imported: make(map[string]*Package), - packages: make(map[*types.Package]*Package), - thunks: make(map[selectionKey]*Function), - bounds: make(map[*types.Func]*Function), - mode: mode, - } - - h := typeutil.MakeHasher() // protected by methodsMu, in effect - prog.methodSets.SetHasher(h) - prog.canon.SetHasher(h) - - return prog -} - -// memberFromObject populates package pkg with a member for the -// typechecker object obj. -// -// For objects from Go source code, syntax is the associated syntax -// tree (for funcs and vars only); it will be used during the build -// phase. -// -func memberFromObject(pkg *Package, obj types.Object, syntax ast.Node) { - name := obj.Name() - switch obj := obj.(type) { - case *types.Builtin: - if pkg.Pkg != types.Unsafe { - panic("unexpected builtin object: " + obj.String()) - } - - case *types.TypeName: - pkg.Members[name] = &Type{ - object: obj, - pkg: pkg, - } - - case *types.Const: - c := &NamedConst{ - object: obj, - Value: NewConst(obj.Val(), obj.Type()), - pkg: pkg, - } - pkg.values[obj] = c.Value - pkg.Members[name] = c - - case *types.Var: - g := &Global{ - Pkg: pkg, - name: name, - object: obj, - typ: types.NewPointer(obj.Type()), // address - pos: obj.Pos(), - } - pkg.values[obj] = g - pkg.Members[name] = g - - case *types.Func: - sig := obj.Type().(*types.Signature) - if sig.Recv() == nil && name == "init" { - pkg.ninit++ - name = fmt.Sprintf("init#%d", pkg.ninit) - } - fn := &Function{ - name: name, - object: obj, - Signature: sig, - syntax: syntax, - pos: obj.Pos(), - Pkg: pkg, - Prog: pkg.Prog, - } - if syntax == nil { - fn.Synthetic = "loaded from gc object file" - } - - pkg.values[obj] = fn - if sig.Recv() == nil { - pkg.Members[name] = fn // package-level function - } - - default: // (incl. *types.Package) - panic("unexpected Object type: " + obj.String()) - } -} - -// membersFromDecl populates package pkg with members for each -// typechecker object (var, func, const or type) associated with the -// specified decl. -// -func membersFromDecl(pkg *Package, decl ast.Decl) { - switch decl := decl.(type) { - case *ast.GenDecl: // import, const, type or var - switch decl.Tok { - case token.CONST: - for _, spec := range decl.Specs { - for _, id := range spec.(*ast.ValueSpec).Names { - if !isBlankIdent(id) { - memberFromObject(pkg, pkg.info.Defs[id], nil) - } - } - } - - case token.VAR: - for _, spec := range decl.Specs { - for _, id := range spec.(*ast.ValueSpec).Names { - if !isBlankIdent(id) { - memberFromObject(pkg, pkg.info.Defs[id], spec) - } - } - } - - case token.TYPE: - for _, spec := range decl.Specs { - id := spec.(*ast.TypeSpec).Name - if !isBlankIdent(id) { - memberFromObject(pkg, pkg.info.Defs[id], nil) - } - } - } - - case *ast.FuncDecl: - id := decl.Name - if !isBlankIdent(id) { - memberFromObject(pkg, pkg.info.Defs[id], decl) - } - } -} - -// CreatePackage constructs and returns an SSA Package from the -// specified type-checked, error-free file ASTs, and populates its -// Members mapping. -// -// importable determines whether this package should be returned by a -// subsequent call to ImportedPackage(pkg.Path()). -// -// The real work of building SSA form for each function is not done -// until a subsequent call to Package.Build(). -// -func (prog *Program) CreatePackage(pkg *types.Package, files []*ast.File, info *types.Info, importable bool) *Package { - p := &Package{ - Prog: prog, - Members: make(map[string]Member), - values: make(map[types.Object]Value), - Pkg: pkg, - info: info, // transient (CREATE and BUILD phases) - files: files, // transient (CREATE and BUILD phases) - } - - // Add init() function. - p.init = &Function{ - name: "init", - Signature: new(types.Signature), - Synthetic: "package initializer", - Pkg: p, - Prog: prog, - } - p.Members[p.init.name] = p.init - - // CREATE phase. - // Allocate all package members: vars, funcs, consts and types. - if len(files) > 0 { - // Go source package. - for _, file := range files { - for _, decl := range file.Decls { - membersFromDecl(p, decl) - } - } - } else { - // GC-compiled binary package (or "unsafe") - // No code. - // No position information. - scope := p.Pkg.Scope() - for _, name := range scope.Names() { - obj := scope.Lookup(name) - memberFromObject(p, obj, nil) - if obj, ok := obj.(*types.TypeName); ok { - if named, ok := obj.Type().(*types.Named); ok { - for i, n := 0, named.NumMethods(); i < n; i++ { - memberFromObject(p, named.Method(i), nil) - } - } - } - } - } - - if prog.mode&BareInits == 0 { - // Add initializer guard variable. - initguard := &Global{ - Pkg: p, - name: "init$guard", - typ: types.NewPointer(tBool), - } - p.Members[initguard.Name()] = initguard - } - - if prog.mode&GlobalDebug != 0 { - p.SetDebugMode(true) - } - - if prog.mode&PrintPackages != 0 { - printMu.Lock() - p.WriteTo(os.Stdout) - printMu.Unlock() - } - - if importable { - prog.imported[p.Pkg.Path()] = p - } - prog.packages[p.Pkg] = p - - return p -} - -// printMu serializes printing of Packages/Functions to stdout. -var printMu sync.Mutex - -// AllPackages returns a new slice containing all packages in the -// program prog in unspecified order. -// -func (prog *Program) AllPackages() []*Package { - pkgs := make([]*Package, 0, len(prog.packages)) - for _, pkg := range prog.packages { - pkgs = append(pkgs, pkg) - } - return pkgs -} - -// ImportedPackage returns the importable Package whose PkgPath -// is path, or nil if no such Package has been created. -// -// A parameter to CreatePackage determines whether a package should be -// considered importable. For example, no import declaration can resolve -// to the ad-hoc main package created by 'go build foo.go'. -// -// TODO(adonovan): rethink this function and the "importable" concept; -// most packages are importable. This function assumes that all -// types.Package.Path values are unique within the ssa.Program, which is -// false---yet this function remains very convenient. -// Clients should use (*Program).Package instead where possible. -// SSA doesn't really need a string-keyed map of packages. -// -func (prog *Program) ImportedPackage(path string) *Package { - return prog.imported[path] -} diff --git a/vendor/honnef.co/go/tools/ssa/doc.go b/vendor/honnef.co/go/tools/ssa/doc.go deleted file mode 100644 index 0f71fda0013..00000000000 --- a/vendor/honnef.co/go/tools/ssa/doc.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package ssa defines a representation of the elements of Go programs -// (packages, types, functions, variables and constants) using a -// static single-assignment (SSA) form intermediate representation -// (IR) for the bodies of functions. -// -// THIS INTERFACE IS EXPERIMENTAL AND IS LIKELY TO CHANGE. -// -// For an introduction to SSA form, see -// http://en.wikipedia.org/wiki/Static_single_assignment_form. -// This page provides a broader reading list: -// http://www.dcs.gla.ac.uk/~jsinger/ssa.html. -// -// The level of abstraction of the SSA form is intentionally close to -// the source language to facilitate construction of source analysis -// tools. It is not intended for machine code generation. -// -// All looping, branching and switching constructs are replaced with -// unstructured control flow. Higher-level control flow constructs -// such as multi-way branch can be reconstructed as needed; see -// ssautil.Switches() for an example. -// -// The simplest way to create the SSA representation of a package is -// to load typed syntax trees using golang.org/x/tools/go/packages, then -// invoke the ssautil.Packages helper function. See ExampleLoadPackages -// and ExampleWholeProgram for examples. -// The resulting ssa.Program contains all the packages and their -// members, but SSA code is not created for function bodies until a -// subsequent call to (*Package).Build or (*Program).Build. -// -// The builder initially builds a naive SSA form in which all local -// variables are addresses of stack locations with explicit loads and -// stores. Registerisation of eligible locals and φ-node insertion -// using dominance and dataflow are then performed as a second pass -// called "lifting" to improve the accuracy and performance of -// subsequent analyses; this pass can be skipped by setting the -// NaiveForm builder flag. -// -// The primary interfaces of this package are: -// -// - Member: a named member of a Go package. -// - Value: an expression that yields a value. -// - Instruction: a statement that consumes values and performs computation. -// - Node: a Value or Instruction (emphasizing its membership in the SSA value graph) -// -// A computation that yields a result implements both the Value and -// Instruction interfaces. The following table shows for each -// concrete type which of these interfaces it implements. -// -// Value? Instruction? Member? -// *Alloc ✔ ✔ -// *BinOp ✔ ✔ -// *Builtin ✔ -// *Call ✔ ✔ -// *ChangeInterface ✔ ✔ -// *ChangeType ✔ ✔ -// *Const ✔ -// *Convert ✔ ✔ -// *DebugRef ✔ -// *Defer ✔ -// *Extract ✔ ✔ -// *Field ✔ ✔ -// *FieldAddr ✔ ✔ -// *FreeVar ✔ -// *Function ✔ ✔ (func) -// *Global ✔ ✔ (var) -// *Go ✔ -// *If ✔ -// *Index ✔ ✔ -// *IndexAddr ✔ ✔ -// *Jump ✔ -// *Lookup ✔ ✔ -// *MakeChan ✔ ✔ -// *MakeClosure ✔ ✔ -// *MakeInterface ✔ ✔ -// *MakeMap ✔ ✔ -// *MakeSlice ✔ ✔ -// *MapUpdate ✔ -// *NamedConst ✔ (const) -// *Next ✔ ✔ -// *Panic ✔ -// *Parameter ✔ -// *Phi ✔ ✔ -// *Range ✔ ✔ -// *Return ✔ -// *RunDefers ✔ -// *Select ✔ ✔ -// *Send ✔ -// *Slice ✔ ✔ -// *Store ✔ -// *Type ✔ (type) -// *TypeAssert ✔ ✔ -// *UnOp ✔ ✔ -// -// Other key types in this package include: Program, Package, Function -// and BasicBlock. -// -// The program representation constructed by this package is fully -// resolved internally, i.e. it does not rely on the names of Values, -// Packages, Functions, Types or BasicBlocks for the correct -// interpretation of the program. Only the identities of objects and -// the topology of the SSA and type graphs are semantically -// significant. (There is one exception: Ids, used to identify field -// and method names, contain strings.) Avoidance of name-based -// operations simplifies the implementation of subsequent passes and -// can make them very efficient. Many objects are nonetheless named -// to aid in debugging, but it is not essential that the names be -// either accurate or unambiguous. The public API exposes a number of -// name-based maps for client convenience. -// -// The ssa/ssautil package provides various utilities that depend only -// on the public API of this package. -// -// TODO(adonovan): Consider the exceptional control-flow implications -// of defer and recover(). -// -// TODO(adonovan): write a how-to document for all the various cases -// of trying to determine corresponding elements across the four -// domains of source locations, ast.Nodes, types.Objects, -// ssa.Values/Instructions. -// -package ssa // import "honnef.co/go/tools/ssa" diff --git a/vendor/honnef.co/go/tools/ssa/dom.go b/vendor/honnef.co/go/tools/ssa/dom.go deleted file mode 100644 index a036be87c4c..00000000000 --- a/vendor/honnef.co/go/tools/ssa/dom.go +++ /dev/null @@ -1,343 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// This file defines algorithms related to dominance. - -// Dominator tree construction ---------------------------------------- -// -// We use the algorithm described in Lengauer & Tarjan. 1979. A fast -// algorithm for finding dominators in a flowgraph. -// http://doi.acm.org/10.1145/357062.357071 -// -// We also apply the optimizations to SLT described in Georgiadis et -// al, Finding Dominators in Practice, JGAA 2006, -// http://jgaa.info/accepted/2006/GeorgiadisTarjanWerneck2006.10.1.pdf -// to avoid the need for buckets of size > 1. - -import ( - "bytes" - "fmt" - "math/big" - "os" - "sort" -) - -// Idom returns the block that immediately dominates b: -// its parent in the dominator tree, if any. -// Neither the entry node (b.Index==0) nor recover node -// (b==b.Parent().Recover()) have a parent. -// -func (b *BasicBlock) Idom() *BasicBlock { return b.dom.idom } - -// Dominees returns the list of blocks that b immediately dominates: -// its children in the dominator tree. -// -func (b *BasicBlock) Dominees() []*BasicBlock { return b.dom.children } - -// Dominates reports whether b dominates c. -func (b *BasicBlock) Dominates(c *BasicBlock) bool { - return b.dom.pre <= c.dom.pre && c.dom.post <= b.dom.post -} - -type byDomPreorder []*BasicBlock - -func (a byDomPreorder) Len() int { return len(a) } -func (a byDomPreorder) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byDomPreorder) Less(i, j int) bool { return a[i].dom.pre < a[j].dom.pre } - -// DomPreorder returns a new slice containing the blocks of f in -// dominator tree preorder. -// -func (f *Function) DomPreorder() []*BasicBlock { - n := len(f.Blocks) - order := make(byDomPreorder, n) - copy(order, f.Blocks) - sort.Sort(order) - return order -} - -// domInfo contains a BasicBlock's dominance information. -type domInfo struct { - idom *BasicBlock // immediate dominator (parent in domtree) - children []*BasicBlock // nodes immediately dominated by this one - pre, post int32 // pre- and post-order numbering within domtree -} - -// ltState holds the working state for Lengauer-Tarjan algorithm -// (during which domInfo.pre is repurposed for CFG DFS preorder number). -type ltState struct { - // Each slice is indexed by b.Index. - sdom []*BasicBlock // b's semidominator - parent []*BasicBlock // b's parent in DFS traversal of CFG - ancestor []*BasicBlock // b's ancestor with least sdom -} - -// dfs implements the depth-first search part of the LT algorithm. -func (lt *ltState) dfs(v *BasicBlock, i int32, preorder []*BasicBlock) int32 { - preorder[i] = v - v.dom.pre = i // For now: DFS preorder of spanning tree of CFG - i++ - lt.sdom[v.Index] = v - lt.link(nil, v) - for _, w := range v.Succs { - if lt.sdom[w.Index] == nil { - lt.parent[w.Index] = v - i = lt.dfs(w, i, preorder) - } - } - return i -} - -// eval implements the EVAL part of the LT algorithm. -func (lt *ltState) eval(v *BasicBlock) *BasicBlock { - // TODO(adonovan): opt: do path compression per simple LT. - u := v - for ; lt.ancestor[v.Index] != nil; v = lt.ancestor[v.Index] { - if lt.sdom[v.Index].dom.pre < lt.sdom[u.Index].dom.pre { - u = v - } - } - return u -} - -// link implements the LINK part of the LT algorithm. -func (lt *ltState) link(v, w *BasicBlock) { - lt.ancestor[w.Index] = v -} - -// buildDomTree computes the dominator tree of f using the LT algorithm. -// Precondition: all blocks are reachable (e.g. optimizeBlocks has been run). -// -func buildDomTree(f *Function) { - // The step numbers refer to the original LT paper; the - // reordering is due to Georgiadis. - - // Clear any previous domInfo. - for _, b := range f.Blocks { - b.dom = domInfo{} - } - - n := len(f.Blocks) - // Allocate space for 5 contiguous [n]*BasicBlock arrays: - // sdom, parent, ancestor, preorder, buckets. - space := make([]*BasicBlock, 5*n) - lt := ltState{ - sdom: space[0:n], - parent: space[n : 2*n], - ancestor: space[2*n : 3*n], - } - - // Step 1. Number vertices by depth-first preorder. - preorder := space[3*n : 4*n] - root := f.Blocks[0] - prenum := lt.dfs(root, 0, preorder) - recover := f.Recover - if recover != nil { - lt.dfs(recover, prenum, preorder) - } - - buckets := space[4*n : 5*n] - copy(buckets, preorder) - - // In reverse preorder... - for i := int32(n) - 1; i > 0; i-- { - w := preorder[i] - - // Step 3. Implicitly define the immediate dominator of each node. - for v := buckets[i]; v != w; v = buckets[v.dom.pre] { - u := lt.eval(v) - if lt.sdom[u.Index].dom.pre < i { - v.dom.idom = u - } else { - v.dom.idom = w - } - } - - // Step 2. Compute the semidominators of all nodes. - lt.sdom[w.Index] = lt.parent[w.Index] - for _, v := range w.Preds { - u := lt.eval(v) - if lt.sdom[u.Index].dom.pre < lt.sdom[w.Index].dom.pre { - lt.sdom[w.Index] = lt.sdom[u.Index] - } - } - - lt.link(lt.parent[w.Index], w) - - if lt.parent[w.Index] == lt.sdom[w.Index] { - w.dom.idom = lt.parent[w.Index] - } else { - buckets[i] = buckets[lt.sdom[w.Index].dom.pre] - buckets[lt.sdom[w.Index].dom.pre] = w - } - } - - // The final 'Step 3' is now outside the loop. - for v := buckets[0]; v != root; v = buckets[v.dom.pre] { - v.dom.idom = root - } - - // Step 4. Explicitly define the immediate dominator of each - // node, in preorder. - for _, w := range preorder[1:] { - if w == root || w == recover { - w.dom.idom = nil - } else { - if w.dom.idom != lt.sdom[w.Index] { - w.dom.idom = w.dom.idom.dom.idom - } - // Calculate Children relation as inverse of Idom. - w.dom.idom.dom.children = append(w.dom.idom.dom.children, w) - } - } - - pre, post := numberDomTree(root, 0, 0) - if recover != nil { - numberDomTree(recover, pre, post) - } - - // printDomTreeDot(os.Stderr, f) // debugging - // printDomTreeText(os.Stderr, root, 0) // debugging - - if f.Prog.mode&SanityCheckFunctions != 0 { - sanityCheckDomTree(f) - } -} - -// numberDomTree sets the pre- and post-order numbers of a depth-first -// traversal of the dominator tree rooted at v. These are used to -// answer dominance queries in constant time. -// -func numberDomTree(v *BasicBlock, pre, post int32) (int32, int32) { - v.dom.pre = pre - pre++ - for _, child := range v.dom.children { - pre, post = numberDomTree(child, pre, post) - } - v.dom.post = post - post++ - return pre, post -} - -// Testing utilities ---------------------------------------- - -// sanityCheckDomTree checks the correctness of the dominator tree -// computed by the LT algorithm by comparing against the dominance -// relation computed by a naive Kildall-style forward dataflow -// analysis (Algorithm 10.16 from the "Dragon" book). -// -func sanityCheckDomTree(f *Function) { - n := len(f.Blocks) - - // D[i] is the set of blocks that dominate f.Blocks[i], - // represented as a bit-set of block indices. - D := make([]big.Int, n) - - one := big.NewInt(1) - - // all is the set of all blocks; constant. - var all big.Int - all.Set(one).Lsh(&all, uint(n)).Sub(&all, one) - - // Initialization. - for i, b := range f.Blocks { - if i == 0 || b == f.Recover { - // A root is dominated only by itself. - D[i].SetBit(&D[0], 0, 1) - } else { - // All other blocks are (initially) dominated - // by every block. - D[i].Set(&all) - } - } - - // Iteration until fixed point. - for changed := true; changed; { - changed = false - for i, b := range f.Blocks { - if i == 0 || b == f.Recover { - continue - } - // Compute intersection across predecessors. - var x big.Int - x.Set(&all) - for _, pred := range b.Preds { - x.And(&x, &D[pred.Index]) - } - x.SetBit(&x, i, 1) // a block always dominates itself. - if D[i].Cmp(&x) != 0 { - D[i].Set(&x) - changed = true - } - } - } - - // Check the entire relation. O(n^2). - // The Recover block (if any) must be treated specially so we skip it. - ok := true - for i := 0; i < n; i++ { - for j := 0; j < n; j++ { - b, c := f.Blocks[i], f.Blocks[j] - if c == f.Recover { - continue - } - actual := b.Dominates(c) - expected := D[j].Bit(i) == 1 - if actual != expected { - fmt.Fprintf(os.Stderr, "dominates(%s, %s)==%t, want %t\n", b, c, actual, expected) - ok = false - } - } - } - - preorder := f.DomPreorder() - for _, b := range f.Blocks { - if got := preorder[b.dom.pre]; got != b { - fmt.Fprintf(os.Stderr, "preorder[%d]==%s, want %s\n", b.dom.pre, got, b) - ok = false - } - } - - if !ok { - panic("sanityCheckDomTree failed for " + f.String()) - } - -} - -// Printing functions ---------------------------------------- - -// printDomTree prints the dominator tree as text, using indentation. -//lint:ignore U1000 used during debugging -func printDomTreeText(buf *bytes.Buffer, v *BasicBlock, indent int) { - fmt.Fprintf(buf, "%*s%s\n", 4*indent, "", v) - for _, child := range v.dom.children { - printDomTreeText(buf, child, indent+1) - } -} - -// printDomTreeDot prints the dominator tree of f in AT&T GraphViz -// (.dot) format. -//lint:ignore U1000 used during debugging -func printDomTreeDot(buf *bytes.Buffer, f *Function) { - fmt.Fprintln(buf, "//", f) - fmt.Fprintln(buf, "digraph domtree {") - for i, b := range f.Blocks { - v := b.dom - fmt.Fprintf(buf, "\tn%d [label=\"%s (%d, %d)\",shape=\"rectangle\"];\n", v.pre, b, v.pre, v.post) - // TODO(adonovan): improve appearance of edges - // belonging to both dominator tree and CFG. - - // Dominator tree edge. - if i != 0 { - fmt.Fprintf(buf, "\tn%d -> n%d [style=\"solid\",weight=100];\n", v.idom.dom.pre, v.pre) - } - // CFG edges. - for _, pred := range b.Preds { - fmt.Fprintf(buf, "\tn%d -> n%d [style=\"dotted\",weight=0];\n", pred.dom.pre, v.pre) - } - } - fmt.Fprintln(buf, "}") -} diff --git a/vendor/honnef.co/go/tools/ssa/emit.go b/vendor/honnef.co/go/tools/ssa/emit.go deleted file mode 100644 index 6bf9ec32dae..00000000000 --- a/vendor/honnef.co/go/tools/ssa/emit.go +++ /dev/null @@ -1,469 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// Helpers for emitting SSA instructions. - -import ( - "fmt" - "go/ast" - "go/token" - "go/types" -) - -// emitNew emits to f a new (heap Alloc) instruction allocating an -// object of type typ. pos is the optional source location. -// -func emitNew(f *Function, typ types.Type, pos token.Pos) *Alloc { - v := &Alloc{Heap: true} - v.setType(types.NewPointer(typ)) - v.setPos(pos) - f.emit(v) - return v -} - -// emitLoad emits to f an instruction to load the address addr into a -// new temporary, and returns the value so defined. -// -func emitLoad(f *Function, addr Value) *UnOp { - v := &UnOp{Op: token.MUL, X: addr} - v.setType(deref(addr.Type())) - f.emit(v) - return v -} - -// emitDebugRef emits to f a DebugRef pseudo-instruction associating -// expression e with value v. -// -func emitDebugRef(f *Function, e ast.Expr, v Value, isAddr bool) { - if !f.debugInfo() { - return // debugging not enabled - } - if v == nil || e == nil { - panic("nil") - } - var obj types.Object - e = unparen(e) - if id, ok := e.(*ast.Ident); ok { - if isBlankIdent(id) { - return - } - obj = f.Pkg.objectOf(id) - switch obj.(type) { - case *types.Nil, *types.Const, *types.Builtin: - return - } - } - f.emit(&DebugRef{ - X: v, - Expr: e, - IsAddr: isAddr, - object: obj, - }) -} - -// emitArith emits to f code to compute the binary operation op(x, y) -// where op is an eager shift, logical or arithmetic operation. -// (Use emitCompare() for comparisons and Builder.logicalBinop() for -// non-eager operations.) -// -func emitArith(f *Function, op token.Token, x, y Value, t types.Type, pos token.Pos) Value { - switch op { - case token.SHL, token.SHR: - x = emitConv(f, x, t) - // y may be signed or an 'untyped' constant. - // TODO(adonovan): whence signed values? - if b, ok := y.Type().Underlying().(*types.Basic); ok && b.Info()&types.IsUnsigned == 0 { - y = emitConv(f, y, types.Typ[types.Uint64]) - } - - case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT: - x = emitConv(f, x, t) - y = emitConv(f, y, t) - - default: - panic("illegal op in emitArith: " + op.String()) - - } - v := &BinOp{ - Op: op, - X: x, - Y: y, - } - v.setPos(pos) - v.setType(t) - return f.emit(v) -} - -// emitCompare emits to f code compute the boolean result of -// comparison comparison 'x op y'. -// -func emitCompare(f *Function, op token.Token, x, y Value, pos token.Pos) Value { - xt := x.Type().Underlying() - yt := y.Type().Underlying() - - // Special case to optimise a tagless SwitchStmt so that - // these are equivalent - // switch { case e: ...} - // switch true { case e: ... } - // if e==true { ... } - // even in the case when e's type is an interface. - // TODO(adonovan): opt: generalise to x==true, false!=y, etc. - if x == vTrue && op == token.EQL { - if yt, ok := yt.(*types.Basic); ok && yt.Info()&types.IsBoolean != 0 { - return y - } - } - - if types.Identical(xt, yt) { - // no conversion necessary - } else if _, ok := xt.(*types.Interface); ok { - y = emitConv(f, y, x.Type()) - } else if _, ok := yt.(*types.Interface); ok { - x = emitConv(f, x, y.Type()) - } else if _, ok := x.(*Const); ok { - x = emitConv(f, x, y.Type()) - } else if _, ok := y.(*Const); ok { - y = emitConv(f, y, x.Type()) - //lint:ignore SA9003 no-op - } else { - // other cases, e.g. channels. No-op. - } - - v := &BinOp{ - Op: op, - X: x, - Y: y, - } - v.setPos(pos) - v.setType(tBool) - return f.emit(v) -} - -// isValuePreserving returns true if a conversion from ut_src to -// ut_dst is value-preserving, i.e. just a change of type. -// Precondition: neither argument is a named type. -// -func isValuePreserving(ut_src, ut_dst types.Type) bool { - // Identical underlying types? - if structTypesIdentical(ut_dst, ut_src) { - return true - } - - switch ut_dst.(type) { - case *types.Chan: - // Conversion between channel types? - _, ok := ut_src.(*types.Chan) - return ok - - case *types.Pointer: - // Conversion between pointers with identical base types? - _, ok := ut_src.(*types.Pointer) - return ok - } - return false -} - -// emitConv emits to f code to convert Value val to exactly type typ, -// and returns the converted value. Implicit conversions are required -// by language assignability rules in assignments, parameter passing, -// etc. Conversions cannot fail dynamically. -// -func emitConv(f *Function, val Value, typ types.Type) Value { - t_src := val.Type() - - // Identical types? Conversion is a no-op. - if types.Identical(t_src, typ) { - return val - } - - ut_dst := typ.Underlying() - ut_src := t_src.Underlying() - - // Just a change of type, but not value or representation? - if isValuePreserving(ut_src, ut_dst) { - c := &ChangeType{X: val} - c.setType(typ) - return f.emit(c) - } - - // Conversion to, or construction of a value of, an interface type? - if _, ok := ut_dst.(*types.Interface); ok { - // Assignment from one interface type to another? - if _, ok := ut_src.(*types.Interface); ok { - c := &ChangeInterface{X: val} - c.setType(typ) - return f.emit(c) - } - - // Untyped nil constant? Return interface-typed nil constant. - if ut_src == tUntypedNil { - return nilConst(typ) - } - - // Convert (non-nil) "untyped" literals to their default type. - if t, ok := ut_src.(*types.Basic); ok && t.Info()&types.IsUntyped != 0 { - val = emitConv(f, val, DefaultType(ut_src)) - } - - f.Pkg.Prog.needMethodsOf(val.Type()) - mi := &MakeInterface{X: val} - mi.setType(typ) - return f.emit(mi) - } - - // Conversion of a compile-time constant value? - if c, ok := val.(*Const); ok { - if _, ok := ut_dst.(*types.Basic); ok || c.IsNil() { - // Conversion of a compile-time constant to - // another constant type results in a new - // constant of the destination type and - // (initially) the same abstract value. - // We don't truncate the value yet. - return NewConst(c.Value, typ) - } - - // We're converting from constant to non-constant type, - // e.g. string -> []byte/[]rune. - } - - // A representation-changing conversion? - // At least one of {ut_src,ut_dst} must be *Basic. - // (The other may be []byte or []rune.) - _, ok1 := ut_src.(*types.Basic) - _, ok2 := ut_dst.(*types.Basic) - if ok1 || ok2 { - c := &Convert{X: val} - c.setType(typ) - return f.emit(c) - } - - panic(fmt.Sprintf("in %s: cannot convert %s (%s) to %s", f, val, val.Type(), typ)) -} - -// emitStore emits to f an instruction to store value val at location -// addr, applying implicit conversions as required by assignability rules. -// -func emitStore(f *Function, addr, val Value, pos token.Pos) *Store { - s := &Store{ - Addr: addr, - Val: emitConv(f, val, deref(addr.Type())), - pos: pos, - } - f.emit(s) - return s -} - -// emitJump emits to f a jump to target, and updates the control-flow graph. -// Postcondition: f.currentBlock is nil. -// -func emitJump(f *Function, target *BasicBlock) { - b := f.currentBlock - b.emit(new(Jump)) - addEdge(b, target) - f.currentBlock = nil -} - -// emitIf emits to f a conditional jump to tblock or fblock based on -// cond, and updates the control-flow graph. -// Postcondition: f.currentBlock is nil. -// -func emitIf(f *Function, cond Value, tblock, fblock *BasicBlock) { - b := f.currentBlock - b.emit(&If{Cond: cond}) - addEdge(b, tblock) - addEdge(b, fblock) - f.currentBlock = nil -} - -// emitExtract emits to f an instruction to extract the index'th -// component of tuple. It returns the extracted value. -// -func emitExtract(f *Function, tuple Value, index int) Value { - e := &Extract{Tuple: tuple, Index: index} - e.setType(tuple.Type().(*types.Tuple).At(index).Type()) - return f.emit(e) -} - -// emitTypeAssert emits to f a type assertion value := x.(t) and -// returns the value. x.Type() must be an interface. -// -func emitTypeAssert(f *Function, x Value, t types.Type, pos token.Pos) Value { - a := &TypeAssert{X: x, AssertedType: t} - a.setPos(pos) - a.setType(t) - return f.emit(a) -} - -// emitTypeTest emits to f a type test value,ok := x.(t) and returns -// a (value, ok) tuple. x.Type() must be an interface. -// -func emitTypeTest(f *Function, x Value, t types.Type, pos token.Pos) Value { - a := &TypeAssert{ - X: x, - AssertedType: t, - CommaOk: true, - } - a.setPos(pos) - a.setType(types.NewTuple( - newVar("value", t), - varOk, - )) - return f.emit(a) -} - -// emitTailCall emits to f a function call in tail position. The -// caller is responsible for all fields of 'call' except its type. -// Intended for wrapper methods. -// Precondition: f does/will not use deferred procedure calls. -// Postcondition: f.currentBlock is nil. -// -func emitTailCall(f *Function, call *Call) { - tresults := f.Signature.Results() - nr := tresults.Len() - if nr == 1 { - call.typ = tresults.At(0).Type() - } else { - call.typ = tresults - } - tuple := f.emit(call) - var ret Return - switch nr { - case 0: - // no-op - case 1: - ret.Results = []Value{tuple} - default: - for i := 0; i < nr; i++ { - v := emitExtract(f, tuple, i) - // TODO(adonovan): in principle, this is required: - // v = emitConv(f, o.Type, f.Signature.Results[i].Type) - // but in practice emitTailCall is only used when - // the types exactly match. - ret.Results = append(ret.Results, v) - } - } - f.emit(&ret) - f.currentBlock = nil -} - -// emitImplicitSelections emits to f code to apply the sequence of -// implicit field selections specified by indices to base value v, and -// returns the selected value. -// -// If v is the address of a struct, the result will be the address of -// a field; if it is the value of a struct, the result will be the -// value of a field. -// -func emitImplicitSelections(f *Function, v Value, indices []int) Value { - for _, index := range indices { - fld := deref(v.Type()).Underlying().(*types.Struct).Field(index) - - if isPointer(v.Type()) { - instr := &FieldAddr{ - X: v, - Field: index, - } - instr.setType(types.NewPointer(fld.Type())) - v = f.emit(instr) - // Load the field's value iff indirectly embedded. - if isPointer(fld.Type()) { - v = emitLoad(f, v) - } - } else { - instr := &Field{ - X: v, - Field: index, - } - instr.setType(fld.Type()) - v = f.emit(instr) - } - } - return v -} - -// emitFieldSelection emits to f code to select the index'th field of v. -// -// If wantAddr, the input must be a pointer-to-struct and the result -// will be the field's address; otherwise the result will be the -// field's value. -// Ident id is used for position and debug info. -// -func emitFieldSelection(f *Function, v Value, index int, wantAddr bool, id *ast.Ident) Value { - fld := deref(v.Type()).Underlying().(*types.Struct).Field(index) - if isPointer(v.Type()) { - instr := &FieldAddr{ - X: v, - Field: index, - } - instr.setPos(id.Pos()) - instr.setType(types.NewPointer(fld.Type())) - v = f.emit(instr) - // Load the field's value iff we don't want its address. - if !wantAddr { - v = emitLoad(f, v) - } - } else { - instr := &Field{ - X: v, - Field: index, - } - instr.setPos(id.Pos()) - instr.setType(fld.Type()) - v = f.emit(instr) - } - emitDebugRef(f, id, v, wantAddr) - return v -} - -// zeroValue emits to f code to produce a zero value of type t, -// and returns it. -// -func zeroValue(f *Function, t types.Type) Value { - switch t.Underlying().(type) { - case *types.Struct, *types.Array: - return emitLoad(f, f.addLocal(t, token.NoPos)) - default: - return zeroConst(t) - } -} - -// createRecoverBlock emits to f a block of code to return after a -// recovered panic, and sets f.Recover to it. -// -// If f's result parameters are named, the code loads and returns -// their current values, otherwise it returns the zero values of their -// type. -// -// Idempotent. -// -func createRecoverBlock(f *Function) { - if f.Recover != nil { - return // already created - } - saved := f.currentBlock - - f.Recover = f.newBasicBlock("recover") - f.currentBlock = f.Recover - - var results []Value - if f.namedResults != nil { - // Reload NRPs to form value tuple. - for _, r := range f.namedResults { - results = append(results, emitLoad(f, r)) - } - } else { - R := f.Signature.Results() - for i, n := 0, R.Len(); i < n; i++ { - T := R.At(i).Type() - - // Return zero value of each result type. - results = append(results, zeroValue(f, T)) - } - } - f.emit(&Return{Results: results}) - - f.currentBlock = saved -} diff --git a/vendor/honnef.co/go/tools/ssa/func.go b/vendor/honnef.co/go/tools/ssa/func.go deleted file mode 100644 index 222eea64183..00000000000 --- a/vendor/honnef.co/go/tools/ssa/func.go +++ /dev/null @@ -1,765 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// This file implements the Function and BasicBlock types. - -import ( - "bytes" - "fmt" - "go/ast" - "go/token" - "go/types" - "io" - "os" - "strings" -) - -// addEdge adds a control-flow graph edge from from to to. -func addEdge(from, to *BasicBlock) { - from.Succs = append(from.Succs, to) - to.Preds = append(to.Preds, from) -} - -// Parent returns the function that contains block b. -func (b *BasicBlock) Parent() *Function { return b.parent } - -// String returns a human-readable label of this block. -// It is not guaranteed unique within the function. -// -func (b *BasicBlock) String() string { - return fmt.Sprintf("%d", b.Index) -} - -// emit appends an instruction to the current basic block. -// If the instruction defines a Value, it is returned. -// -func (b *BasicBlock) emit(i Instruction) Value { - i.setBlock(b) - b.Instrs = append(b.Instrs, i) - v, _ := i.(Value) - return v -} - -// predIndex returns the i such that b.Preds[i] == c or panics if -// there is none. -func (b *BasicBlock) predIndex(c *BasicBlock) int { - for i, pred := range b.Preds { - if pred == c { - return i - } - } - panic(fmt.Sprintf("no edge %s -> %s", c, b)) -} - -// hasPhi returns true if b.Instrs contains φ-nodes. -func (b *BasicBlock) hasPhi() bool { - _, ok := b.Instrs[0].(*Phi) - return ok -} - -func (b *BasicBlock) Phis() []Instruction { - return b.phis() -} - -// phis returns the prefix of b.Instrs containing all the block's φ-nodes. -func (b *BasicBlock) phis() []Instruction { - for i, instr := range b.Instrs { - if _, ok := instr.(*Phi); !ok { - return b.Instrs[:i] - } - } - return nil // unreachable in well-formed blocks -} - -// replacePred replaces all occurrences of p in b's predecessor list with q. -// Ordinarily there should be at most one. -// -func (b *BasicBlock) replacePred(p, q *BasicBlock) { - for i, pred := range b.Preds { - if pred == p { - b.Preds[i] = q - } - } -} - -// replaceSucc replaces all occurrences of p in b's successor list with q. -// Ordinarily there should be at most one. -// -func (b *BasicBlock) replaceSucc(p, q *BasicBlock) { - for i, succ := range b.Succs { - if succ == p { - b.Succs[i] = q - } - } -} - -func (b *BasicBlock) RemovePred(p *BasicBlock) { - b.removePred(p) -} - -// removePred removes all occurrences of p in b's -// predecessor list and φ-nodes. -// Ordinarily there should be at most one. -// -func (b *BasicBlock) removePred(p *BasicBlock) { - phis := b.phis() - - // We must preserve edge order for φ-nodes. - j := 0 - for i, pred := range b.Preds { - if pred != p { - b.Preds[j] = b.Preds[i] - // Strike out φ-edge too. - for _, instr := range phis { - phi := instr.(*Phi) - phi.Edges[j] = phi.Edges[i] - } - j++ - } - } - // Nil out b.Preds[j:] and φ-edges[j:] to aid GC. - for i := j; i < len(b.Preds); i++ { - b.Preds[i] = nil - for _, instr := range phis { - instr.(*Phi).Edges[i] = nil - } - } - b.Preds = b.Preds[:j] - for _, instr := range phis { - phi := instr.(*Phi) - phi.Edges = phi.Edges[:j] - } -} - -// Destinations associated with unlabelled for/switch/select stmts. -// We push/pop one of these as we enter/leave each construct and for -// each BranchStmt we scan for the innermost target of the right type. -// -type targets struct { - tail *targets // rest of stack - _break *BasicBlock - _continue *BasicBlock - _fallthrough *BasicBlock -} - -// Destinations associated with a labelled block. -// We populate these as labels are encountered in forward gotos or -// labelled statements. -// -type lblock struct { - _goto *BasicBlock - _break *BasicBlock - _continue *BasicBlock -} - -// labelledBlock returns the branch target associated with the -// specified label, creating it if needed. -// -func (f *Function) labelledBlock(label *ast.Ident) *lblock { - lb := f.lblocks[label.Obj] - if lb == nil { - lb = &lblock{_goto: f.newBasicBlock(label.Name)} - if f.lblocks == nil { - f.lblocks = make(map[*ast.Object]*lblock) - } - f.lblocks[label.Obj] = lb - } - return lb -} - -// addParam adds a (non-escaping) parameter to f.Params of the -// specified name, type and source position. -// -func (f *Function) addParam(name string, typ types.Type, pos token.Pos) *Parameter { - v := &Parameter{ - name: name, - typ: typ, - pos: pos, - parent: f, - } - f.Params = append(f.Params, v) - return v -} - -func (f *Function) addParamObj(obj types.Object) *Parameter { - name := obj.Name() - if name == "" { - name = fmt.Sprintf("arg%d", len(f.Params)) - } - param := f.addParam(name, obj.Type(), obj.Pos()) - param.object = obj - return param -} - -// addSpilledParam declares a parameter that is pre-spilled to the -// stack; the function body will load/store the spilled location. -// Subsequent lifting will eliminate spills where possible. -// -func (f *Function) addSpilledParam(obj types.Object) { - param := f.addParamObj(obj) - spill := &Alloc{Comment: obj.Name()} - spill.setType(types.NewPointer(obj.Type())) - spill.setPos(obj.Pos()) - f.objects[obj] = spill - f.Locals = append(f.Locals, spill) - f.emit(spill) - f.emit(&Store{Addr: spill, Val: param}) -} - -// startBody initializes the function prior to generating SSA code for its body. -// Precondition: f.Type() already set. -// -func (f *Function) startBody() { - f.currentBlock = f.newBasicBlock("entry") - f.objects = make(map[types.Object]Value) // needed for some synthetics, e.g. init -} - -// createSyntacticParams populates f.Params and generates code (spills -// and named result locals) for all the parameters declared in the -// syntax. In addition it populates the f.objects mapping. -// -// Preconditions: -// f.startBody() was called. -// Postcondition: -// len(f.Params) == len(f.Signature.Params) + (f.Signature.Recv() ? 1 : 0) -// -func (f *Function) createSyntacticParams(recv *ast.FieldList, functype *ast.FuncType) { - // Receiver (at most one inner iteration). - if recv != nil { - for _, field := range recv.List { - for _, n := range field.Names { - f.addSpilledParam(f.Pkg.info.Defs[n]) - } - // Anonymous receiver? No need to spill. - if field.Names == nil { - f.addParamObj(f.Signature.Recv()) - } - } - } - - // Parameters. - if functype.Params != nil { - n := len(f.Params) // 1 if has recv, 0 otherwise - for _, field := range functype.Params.List { - for _, n := range field.Names { - f.addSpilledParam(f.Pkg.info.Defs[n]) - } - // Anonymous parameter? No need to spill. - if field.Names == nil { - f.addParamObj(f.Signature.Params().At(len(f.Params) - n)) - } - } - } - - // Named results. - if functype.Results != nil { - for _, field := range functype.Results.List { - // Implicit "var" decl of locals for named results. - for _, n := range field.Names { - f.namedResults = append(f.namedResults, f.addLocalForIdent(n)) - } - } - } -} - -// numberRegisters assigns numbers to all SSA registers -// (value-defining Instructions) in f, to aid debugging. -// (Non-Instruction Values are named at construction.) -// -func numberRegisters(f *Function) { - v := 0 - for _, b := range f.Blocks { - for _, instr := range b.Instrs { - switch instr.(type) { - case Value: - instr.(interface { - setNum(int) - }).setNum(v) - v++ - } - } - } -} - -// buildReferrers populates the def/use information in all non-nil -// Value.Referrers slice. -// Precondition: all such slices are initially empty. -func buildReferrers(f *Function) { - var rands []*Value - for _, b := range f.Blocks { - for _, instr := range b.Instrs { - rands = instr.Operands(rands[:0]) // recycle storage - for _, rand := range rands { - if r := *rand; r != nil { - if ref := r.Referrers(); ref != nil { - *ref = append(*ref, instr) - } - } - } - } - } -} - -// finishBody() finalizes the function after SSA code generation of its body. -func (f *Function) finishBody() { - f.objects = nil - f.currentBlock = nil - f.lblocks = nil - - // Don't pin the AST in memory (except in debug mode). - if n := f.syntax; n != nil && !f.debugInfo() { - f.syntax = extentNode{n.Pos(), n.End()} - } - - // Remove from f.Locals any Allocs that escape to the heap. - j := 0 - for _, l := range f.Locals { - if !l.Heap { - f.Locals[j] = l - j++ - } - } - // Nil out f.Locals[j:] to aid GC. - for i := j; i < len(f.Locals); i++ { - f.Locals[i] = nil - } - f.Locals = f.Locals[:j] - - // comma-ok receiving from a time.Tick channel will never return - // ok == false, so any branching on the value of ok can be - // replaced with an unconditional jump. This will primarily match - // `for range time.Tick(x)` loops, but it can also match - // user-written code. - for _, block := range f.Blocks { - if len(block.Instrs) < 3 { - continue - } - if len(block.Succs) != 2 { - continue - } - var instrs []*Instruction - for i, ins := range block.Instrs { - if _, ok := ins.(*DebugRef); ok { - continue - } - instrs = append(instrs, &block.Instrs[i]) - } - - for i, ins := range instrs { - unop, ok := (*ins).(*UnOp) - if !ok || unop.Op != token.ARROW { - continue - } - call, ok := unop.X.(*Call) - if !ok { - continue - } - if call.Common().IsInvoke() { - continue - } - - // OPT(dh): surely there is a more efficient way of doing - // this, than using FullName. We should already have - // resolved time.Tick somewhere? - v, ok := call.Common().Value.(*Function) - if !ok { - continue - } - t, ok := v.Object().(*types.Func) - if !ok { - continue - } - if t.FullName() != "time.Tick" { - continue - } - ex, ok := (*instrs[i+1]).(*Extract) - if !ok || ex.Tuple != unop || ex.Index != 1 { - continue - } - - ifstmt, ok := (*instrs[i+2]).(*If) - if !ok || ifstmt.Cond != ex { - continue - } - - *instrs[i+2] = NewJump(block) - succ := block.Succs[1] - block.Succs = block.Succs[0:1] - succ.RemovePred(block) - } - } - - optimizeBlocks(f) - - buildReferrers(f) - - buildDomTree(f) - - if f.Prog.mode&NaiveForm == 0 { - // For debugging pre-state of lifting pass: - // numberRegisters(f) - // f.WriteTo(os.Stderr) - lift(f) - } - - f.namedResults = nil // (used by lifting) - - numberRegisters(f) - - if f.Prog.mode&PrintFunctions != 0 { - printMu.Lock() - f.WriteTo(os.Stdout) - printMu.Unlock() - } - - if f.Prog.mode&SanityCheckFunctions != 0 { - mustSanityCheck(f, nil) - } -} - -func (f *Function) RemoveNilBlocks() { - f.removeNilBlocks() -} - -// removeNilBlocks eliminates nils from f.Blocks and updates each -// BasicBlock.Index. Use this after any pass that may delete blocks. -// -func (f *Function) removeNilBlocks() { - j := 0 - for _, b := range f.Blocks { - if b != nil { - b.Index = j - f.Blocks[j] = b - j++ - } - } - // Nil out f.Blocks[j:] to aid GC. - for i := j; i < len(f.Blocks); i++ { - f.Blocks[i] = nil - } - f.Blocks = f.Blocks[:j] -} - -// SetDebugMode sets the debug mode for package pkg. If true, all its -// functions will include full debug info. This greatly increases the -// size of the instruction stream, and causes Functions to depend upon -// the ASTs, potentially keeping them live in memory for longer. -// -func (pkg *Package) SetDebugMode(debug bool) { - // TODO(adonovan): do we want ast.File granularity? - pkg.debug = debug -} - -// debugInfo reports whether debug info is wanted for this function. -func (f *Function) debugInfo() bool { - return f.Pkg != nil && f.Pkg.debug -} - -// addNamedLocal creates a local variable, adds it to function f and -// returns it. Its name and type are taken from obj. Subsequent -// calls to f.lookup(obj) will return the same local. -// -func (f *Function) addNamedLocal(obj types.Object) *Alloc { - l := f.addLocal(obj.Type(), obj.Pos()) - l.Comment = obj.Name() - f.objects[obj] = l - return l -} - -func (f *Function) addLocalForIdent(id *ast.Ident) *Alloc { - return f.addNamedLocal(f.Pkg.info.Defs[id]) -} - -// addLocal creates an anonymous local variable of type typ, adds it -// to function f and returns it. pos is the optional source location. -// -func (f *Function) addLocal(typ types.Type, pos token.Pos) *Alloc { - v := &Alloc{} - v.setType(types.NewPointer(typ)) - v.setPos(pos) - f.Locals = append(f.Locals, v) - f.emit(v) - return v -} - -// lookup returns the address of the named variable identified by obj -// that is local to function f or one of its enclosing functions. -// If escaping, the reference comes from a potentially escaping pointer -// expression and the referent must be heap-allocated. -// -func (f *Function) lookup(obj types.Object, escaping bool) Value { - if v, ok := f.objects[obj]; ok { - if alloc, ok := v.(*Alloc); ok && escaping { - alloc.Heap = true - } - return v // function-local var (address) - } - - // Definition must be in an enclosing function; - // plumb it through intervening closures. - if f.parent == nil { - panic("no ssa.Value for " + obj.String()) - } - outer := f.parent.lookup(obj, true) // escaping - v := &FreeVar{ - name: obj.Name(), - typ: outer.Type(), - pos: outer.Pos(), - outer: outer, - parent: f, - } - f.objects[obj] = v - f.FreeVars = append(f.FreeVars, v) - return v -} - -// emit emits the specified instruction to function f. -func (f *Function) emit(instr Instruction) Value { - return f.currentBlock.emit(instr) -} - -// RelString returns the full name of this function, qualified by -// package name, receiver type, etc. -// -// The specific formatting rules are not guaranteed and may change. -// -// Examples: -// "math.IsNaN" // a package-level function -// "(*bytes.Buffer).Bytes" // a declared method or a wrapper -// "(*bytes.Buffer).Bytes$thunk" // thunk (func wrapping method; receiver is param 0) -// "(*bytes.Buffer).Bytes$bound" // bound (func wrapping method; receiver supplied by closure) -// "main.main$1" // an anonymous function in main -// "main.init#1" // a declared init function -// "main.init" // the synthesized package initializer -// -// When these functions are referred to from within the same package -// (i.e. from == f.Pkg.Object), they are rendered without the package path. -// For example: "IsNaN", "(*Buffer).Bytes", etc. -// -// All non-synthetic functions have distinct package-qualified names. -// (But two methods may have the same name "(T).f" if one is a synthetic -// wrapper promoting a non-exported method "f" from another package; in -// that case, the strings are equal but the identifiers "f" are distinct.) -// -func (f *Function) RelString(from *types.Package) string { - // Anonymous? - if f.parent != nil { - // An anonymous function's Name() looks like "parentName$1", - // but its String() should include the type/package/etc. - parent := f.parent.RelString(from) - for i, anon := range f.parent.AnonFuncs { - if anon == f { - return fmt.Sprintf("%s$%d", parent, 1+i) - } - } - - return f.name // should never happen - } - - // Method (declared or wrapper)? - if recv := f.Signature.Recv(); recv != nil { - return f.relMethod(from, recv.Type()) - } - - // Thunk? - if f.method != nil { - return f.relMethod(from, f.method.Recv()) - } - - // Bound? - if len(f.FreeVars) == 1 && strings.HasSuffix(f.name, "$bound") { - return f.relMethod(from, f.FreeVars[0].Type()) - } - - // Package-level function? - // Prefix with package name for cross-package references only. - if p := f.pkg(); p != nil && p != from { - return fmt.Sprintf("%s.%s", p.Path(), f.name) - } - - // Unknown. - return f.name -} - -func (f *Function) relMethod(from *types.Package, recv types.Type) string { - return fmt.Sprintf("(%s).%s", relType(recv, from), f.name) -} - -// writeSignature writes to buf the signature sig in declaration syntax. -func writeSignature(buf *bytes.Buffer, from *types.Package, name string, sig *types.Signature, params []*Parameter) { - buf.WriteString("func ") - if recv := sig.Recv(); recv != nil { - buf.WriteString("(") - if n := params[0].Name(); n != "" { - buf.WriteString(n) - buf.WriteString(" ") - } - types.WriteType(buf, params[0].Type(), types.RelativeTo(from)) - buf.WriteString(") ") - } - buf.WriteString(name) - types.WriteSignature(buf, sig, types.RelativeTo(from)) -} - -func (f *Function) pkg() *types.Package { - if f.Pkg != nil { - return f.Pkg.Pkg - } - return nil -} - -var _ io.WriterTo = (*Function)(nil) // *Function implements io.Writer - -func (f *Function) WriteTo(w io.Writer) (int64, error) { - var buf bytes.Buffer - WriteFunction(&buf, f) - n, err := w.Write(buf.Bytes()) - return int64(n), err -} - -// WriteFunction writes to buf a human-readable "disassembly" of f. -func WriteFunction(buf *bytes.Buffer, f *Function) { - fmt.Fprintf(buf, "# Name: %s\n", f.String()) - if f.Pkg != nil { - fmt.Fprintf(buf, "# Package: %s\n", f.Pkg.Pkg.Path()) - } - if syn := f.Synthetic; syn != "" { - fmt.Fprintln(buf, "# Synthetic:", syn) - } - if pos := f.Pos(); pos.IsValid() { - fmt.Fprintf(buf, "# Location: %s\n", f.Prog.Fset.Position(pos)) - } - - if f.parent != nil { - fmt.Fprintf(buf, "# Parent: %s\n", f.parent.Name()) - } - - if f.Recover != nil { - fmt.Fprintf(buf, "# Recover: %s\n", f.Recover) - } - - from := f.pkg() - - if f.FreeVars != nil { - buf.WriteString("# Free variables:\n") - for i, fv := range f.FreeVars { - fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, fv.Name(), relType(fv.Type(), from)) - } - } - - if len(f.Locals) > 0 { - buf.WriteString("# Locals:\n") - for i, l := range f.Locals { - fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, l.Name(), relType(deref(l.Type()), from)) - } - } - writeSignature(buf, from, f.Name(), f.Signature, f.Params) - buf.WriteString(":\n") - - if f.Blocks == nil { - buf.WriteString("\t(external)\n") - } - - // NB. column calculations are confused by non-ASCII - // characters and assume 8-space tabs. - const punchcard = 80 // for old time's sake. - const tabwidth = 8 - for _, b := range f.Blocks { - if b == nil { - // Corrupt CFG. - fmt.Fprintf(buf, ".nil:\n") - continue - } - n, _ := fmt.Fprintf(buf, "%d:", b.Index) - bmsg := fmt.Sprintf("%s P:%d S:%d", b.Comment, len(b.Preds), len(b.Succs)) - fmt.Fprintf(buf, "%*s%s\n", punchcard-1-n-len(bmsg), "", bmsg) - - if false { // CFG debugging - fmt.Fprintf(buf, "\t# CFG: %s --> %s --> %s\n", b.Preds, b, b.Succs) - } - for _, instr := range b.Instrs { - buf.WriteString("\t") - switch v := instr.(type) { - case Value: - l := punchcard - tabwidth - // Left-align the instruction. - if name := v.Name(); name != "" { - n, _ := fmt.Fprintf(buf, "%s = ", name) - l -= n - } - n, _ := buf.WriteString(instr.String()) - l -= n - // Right-align the type if there's space. - if t := v.Type(); t != nil { - buf.WriteByte(' ') - ts := relType(t, from) - l -= len(ts) + len(" ") // (spaces before and after type) - if l > 0 { - fmt.Fprintf(buf, "%*s", l, "") - } - buf.WriteString(ts) - } - case nil: - // Be robust against bad transforms. - buf.WriteString("") - default: - buf.WriteString(instr.String()) - } - buf.WriteString("\n") - } - } - fmt.Fprintf(buf, "\n") -} - -// newBasicBlock adds to f a new basic block and returns it. It does -// not automatically become the current block for subsequent calls to emit. -// comment is an optional string for more readable debugging output. -// -func (f *Function) newBasicBlock(comment string) *BasicBlock { - b := &BasicBlock{ - Index: len(f.Blocks), - Comment: comment, - parent: f, - } - b.Succs = b.succs2[:0] - f.Blocks = append(f.Blocks, b) - return b -} - -// NewFunction returns a new synthetic Function instance belonging to -// prog, with its name and signature fields set as specified. -// -// The caller is responsible for initializing the remaining fields of -// the function object, e.g. Pkg, Params, Blocks. -// -// It is practically impossible for clients to construct well-formed -// SSA functions/packages/programs directly, so we assume this is the -// job of the Builder alone. NewFunction exists to provide clients a -// little flexibility. For example, analysis tools may wish to -// construct fake Functions for the root of the callgraph, a fake -// "reflect" package, etc. -// -// TODO(adonovan): think harder about the API here. -// -func (prog *Program) NewFunction(name string, sig *types.Signature, provenance string) *Function { - return &Function{Prog: prog, name: name, Signature: sig, Synthetic: provenance} -} - -type extentNode [2]token.Pos - -func (n extentNode) Pos() token.Pos { return n[0] } -func (n extentNode) End() token.Pos { return n[1] } - -// Syntax returns an ast.Node whose Pos/End methods provide the -// lexical extent of the function if it was defined by Go source code -// (f.Synthetic==""), or nil otherwise. -// -// If f was built with debug information (see Package.SetDebugRef), -// the result is the *ast.FuncDecl or *ast.FuncLit that declared the -// function. Otherwise, it is an opaque Node providing only position -// information; this avoids pinning the AST in memory. -// -func (f *Function) Syntax() ast.Node { return f.syntax } diff --git a/vendor/honnef.co/go/tools/ssa/identical.go b/vendor/honnef.co/go/tools/ssa/identical.go deleted file mode 100644 index 53cbee107b6..00000000000 --- a/vendor/honnef.co/go/tools/ssa/identical.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build go1.8 - -package ssa - -import "go/types" - -var structTypesIdentical = types.IdenticalIgnoreTags diff --git a/vendor/honnef.co/go/tools/ssa/identical_17.go b/vendor/honnef.co/go/tools/ssa/identical_17.go deleted file mode 100644 index da89d3339a5..00000000000 --- a/vendor/honnef.co/go/tools/ssa/identical_17.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build !go1.8 - -package ssa - -import "go/types" - -var structTypesIdentical = types.Identical diff --git a/vendor/honnef.co/go/tools/ssa/lift.go b/vendor/honnef.co/go/tools/ssa/lift.go deleted file mode 100644 index 531358fa3bb..00000000000 --- a/vendor/honnef.co/go/tools/ssa/lift.go +++ /dev/null @@ -1,657 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// This file defines the lifting pass which tries to "lift" Alloc -// cells (new/local variables) into SSA registers, replacing loads -// with the dominating stored value, eliminating loads and stores, and -// inserting φ-nodes as needed. - -// Cited papers and resources: -// -// Ron Cytron et al. 1991. Efficiently computing SSA form... -// http://doi.acm.org/10.1145/115372.115320 -// -// Cooper, Harvey, Kennedy. 2001. A Simple, Fast Dominance Algorithm. -// Software Practice and Experience 2001, 4:1-10. -// http://www.hipersoft.rice.edu/grads/publications/dom14.pdf -// -// Daniel Berlin, llvmdev mailing list, 2012. -// http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-January/046638.html -// (Be sure to expand the whole thread.) - -// TODO(adonovan): opt: there are many optimizations worth evaluating, and -// the conventional wisdom for SSA construction is that a simple -// algorithm well engineered often beats those of better asymptotic -// complexity on all but the most egregious inputs. -// -// Danny Berlin suggests that the Cooper et al. algorithm for -// computing the dominance frontier is superior to Cytron et al. -// Furthermore he recommends that rather than computing the DF for the -// whole function then renaming all alloc cells, it may be cheaper to -// compute the DF for each alloc cell separately and throw it away. -// -// Consider exploiting liveness information to avoid creating dead -// φ-nodes which we then immediately remove. -// -// Also see many other "TODO: opt" suggestions in the code. - -import ( - "fmt" - "go/token" - "go/types" - "math/big" - "os" -) - -// If true, show diagnostic information at each step of lifting. -// Very verbose. -const debugLifting = false - -// domFrontier maps each block to the set of blocks in its dominance -// frontier. The outer slice is conceptually a map keyed by -// Block.Index. The inner slice is conceptually a set, possibly -// containing duplicates. -// -// TODO(adonovan): opt: measure impact of dups; consider a packed bit -// representation, e.g. big.Int, and bitwise parallel operations for -// the union step in the Children loop. -// -// domFrontier's methods mutate the slice's elements but not its -// length, so their receivers needn't be pointers. -// -type domFrontier [][]*BasicBlock - -func (df domFrontier) add(u, v *BasicBlock) { - p := &df[u.Index] - *p = append(*p, v) -} - -// build builds the dominance frontier df for the dominator (sub)tree -// rooted at u, using the Cytron et al. algorithm. -// -// TODO(adonovan): opt: consider Berlin approach, computing pruned SSA -// by pruning the entire IDF computation, rather than merely pruning -// the DF -> IDF step. -func (df domFrontier) build(u *BasicBlock) { - // Encounter each node u in postorder of dom tree. - for _, child := range u.dom.children { - df.build(child) - } - for _, vb := range u.Succs { - if v := vb.dom; v.idom != u { - df.add(u, vb) - } - } - for _, w := range u.dom.children { - for _, vb := range df[w.Index] { - // TODO(adonovan): opt: use word-parallel bitwise union. - if v := vb.dom; v.idom != u { - df.add(u, vb) - } - } - } -} - -func buildDomFrontier(fn *Function) domFrontier { - df := make(domFrontier, len(fn.Blocks)) - df.build(fn.Blocks[0]) - if fn.Recover != nil { - df.build(fn.Recover) - } - return df -} - -func removeInstr(refs []Instruction, instr Instruction) []Instruction { - i := 0 - for _, ref := range refs { - if ref == instr { - continue - } - refs[i] = ref - i++ - } - for j := i; j != len(refs); j++ { - refs[j] = nil // aid GC - } - return refs[:i] -} - -// lift replaces local and new Allocs accessed only with -// load/store by SSA registers, inserting φ-nodes where necessary. -// The result is a program in classical pruned SSA form. -// -// Preconditions: -// - fn has no dead blocks (blockopt has run). -// - Def/use info (Operands and Referrers) is up-to-date. -// - The dominator tree is up-to-date. -// -func lift(fn *Function) { - // TODO(adonovan): opt: lots of little optimizations may be - // worthwhile here, especially if they cause us to avoid - // buildDomFrontier. For example: - // - // - Alloc never loaded? Eliminate. - // - Alloc never stored? Replace all loads with a zero constant. - // - Alloc stored once? Replace loads with dominating store; - // don't forget that an Alloc is itself an effective store - // of zero. - // - Alloc used only within a single block? - // Use degenerate algorithm avoiding φ-nodes. - // - Consider synergy with scalar replacement of aggregates (SRA). - // e.g. *(&x.f) where x is an Alloc. - // Perhaps we'd get better results if we generated this as x.f - // i.e. Field(x, .f) instead of Load(FieldIndex(x, .f)). - // Unclear. - // - // But we will start with the simplest correct code. - df := buildDomFrontier(fn) - - if debugLifting { - title := false - for i, blocks := range df { - if blocks != nil { - if !title { - fmt.Fprintf(os.Stderr, "Dominance frontier of %s:\n", fn) - title = true - } - fmt.Fprintf(os.Stderr, "\t%s: %s\n", fn.Blocks[i], blocks) - } - } - } - - newPhis := make(newPhiMap) - - // During this pass we will replace some BasicBlock.Instrs - // (allocs, loads and stores) with nil, keeping a count in - // BasicBlock.gaps. At the end we will reset Instrs to the - // concatenation of all non-dead newPhis and non-nil Instrs - // for the block, reusing the original array if space permits. - - // While we're here, we also eliminate 'rundefers' - // instructions in functions that contain no 'defer' - // instructions. - usesDefer := false - - // A counter used to generate ~unique ids for Phi nodes, as an - // aid to debugging. We use large numbers to make them highly - // visible. All nodes are renumbered later. - fresh := 1000 - - // Determine which allocs we can lift and number them densely. - // The renaming phase uses this numbering for compact maps. - numAllocs := 0 - for _, b := range fn.Blocks { - b.gaps = 0 - b.rundefers = 0 - for _, instr := range b.Instrs { - switch instr := instr.(type) { - case *Alloc: - index := -1 - if liftAlloc(df, instr, newPhis, &fresh) { - index = numAllocs - numAllocs++ - } - instr.index = index - case *Defer: - usesDefer = true - case *RunDefers: - b.rundefers++ - } - } - } - - // renaming maps an alloc (keyed by index) to its replacement - // value. Initially the renaming contains nil, signifying the - // zero constant of the appropriate type; we construct the - // Const lazily at most once on each path through the domtree. - // TODO(adonovan): opt: cache per-function not per subtree. - renaming := make([]Value, numAllocs) - - // Renaming. - rename(fn.Blocks[0], renaming, newPhis) - - // Eliminate dead φ-nodes. - removeDeadPhis(fn.Blocks, newPhis) - - // Prepend remaining live φ-nodes to each block. - for _, b := range fn.Blocks { - nps := newPhis[b] - j := len(nps) - - rundefersToKill := b.rundefers - if usesDefer { - rundefersToKill = 0 - } - - if j+b.gaps+rundefersToKill == 0 { - continue // fast path: no new phis or gaps - } - - // Compact nps + non-nil Instrs into a new slice. - // TODO(adonovan): opt: compact in situ (rightwards) - // if Instrs has sufficient space or slack. - dst := make([]Instruction, len(b.Instrs)+j-b.gaps-rundefersToKill) - for i, np := range nps { - dst[i] = np.phi - } - for _, instr := range b.Instrs { - if instr == nil { - continue - } - if !usesDefer { - if _, ok := instr.(*RunDefers); ok { - continue - } - } - dst[j] = instr - j++ - } - b.Instrs = dst - } - - // Remove any fn.Locals that were lifted. - j := 0 - for _, l := range fn.Locals { - if l.index < 0 { - fn.Locals[j] = l - j++ - } - } - // Nil out fn.Locals[j:] to aid GC. - for i := j; i < len(fn.Locals); i++ { - fn.Locals[i] = nil - } - fn.Locals = fn.Locals[:j] -} - -// removeDeadPhis removes φ-nodes not transitively needed by a -// non-Phi, non-DebugRef instruction. -func removeDeadPhis(blocks []*BasicBlock, newPhis newPhiMap) { - // First pass: find the set of "live" φ-nodes: those reachable - // from some non-Phi instruction. - // - // We compute reachability in reverse, starting from each φ, - // rather than forwards, starting from each live non-Phi - // instruction, because this way visits much less of the - // Value graph. - livePhis := make(map[*Phi]bool) - for _, npList := range newPhis { - for _, np := range npList { - phi := np.phi - if !livePhis[phi] && phiHasDirectReferrer(phi) { - markLivePhi(livePhis, phi) - } - } - } - - // Existing φ-nodes due to && and || operators - // are all considered live (see Go issue 19622). - for _, b := range blocks { - for _, phi := range b.phis() { - markLivePhi(livePhis, phi.(*Phi)) - } - } - - // Second pass: eliminate unused phis from newPhis. - for block, npList := range newPhis { - j := 0 - for _, np := range npList { - if livePhis[np.phi] { - npList[j] = np - j++ - } else { - // discard it, first removing it from referrers - for _, val := range np.phi.Edges { - if refs := val.Referrers(); refs != nil { - *refs = removeInstr(*refs, np.phi) - } - } - np.phi.block = nil - } - } - newPhis[block] = npList[:j] - } -} - -// markLivePhi marks phi, and all φ-nodes transitively reachable via -// its Operands, live. -func markLivePhi(livePhis map[*Phi]bool, phi *Phi) { - livePhis[phi] = true - for _, rand := range phi.Operands(nil) { - if q, ok := (*rand).(*Phi); ok { - if !livePhis[q] { - markLivePhi(livePhis, q) - } - } - } -} - -// phiHasDirectReferrer reports whether phi is directly referred to by -// a non-Phi instruction. Such instructions are the -// roots of the liveness traversal. -func phiHasDirectReferrer(phi *Phi) bool { - for _, instr := range *phi.Referrers() { - if _, ok := instr.(*Phi); !ok { - return true - } - } - return false -} - -type BlockSet struct{ big.Int } // (inherit methods from Int) - -// add adds b to the set and returns true if the set changed. -func (s *BlockSet) Add(b *BasicBlock) bool { - i := b.Index - if s.Bit(i) != 0 { - return false - } - s.SetBit(&s.Int, i, 1) - return true -} - -func (s *BlockSet) Has(b *BasicBlock) bool { - return s.Bit(b.Index) == 1 -} - -// take removes an arbitrary element from a set s and -// returns its index, or returns -1 if empty. -func (s *BlockSet) Take() int { - l := s.BitLen() - for i := 0; i < l; i++ { - if s.Bit(i) == 1 { - s.SetBit(&s.Int, i, 0) - return i - } - } - return -1 -} - -// newPhi is a pair of a newly introduced φ-node and the lifted Alloc -// it replaces. -type newPhi struct { - phi *Phi - alloc *Alloc -} - -// newPhiMap records for each basic block, the set of newPhis that -// must be prepended to the block. -type newPhiMap map[*BasicBlock][]newPhi - -// liftAlloc determines whether alloc can be lifted into registers, -// and if so, it populates newPhis with all the φ-nodes it may require -// and returns true. -// -// fresh is a source of fresh ids for phi nodes. -// -func liftAlloc(df domFrontier, alloc *Alloc, newPhis newPhiMap, fresh *int) bool { - // Don't lift aggregates into registers, because we don't have - // a way to express their zero-constants. - switch deref(alloc.Type()).Underlying().(type) { - case *types.Array, *types.Struct: - return false - } - - // Don't lift named return values in functions that defer - // calls that may recover from panic. - if fn := alloc.Parent(); fn.Recover != nil { - for _, nr := range fn.namedResults { - if nr == alloc { - return false - } - } - } - - // Compute defblocks, the set of blocks containing a - // definition of the alloc cell. - var defblocks BlockSet - for _, instr := range *alloc.Referrers() { - // Bail out if we discover the alloc is not liftable; - // the only operations permitted to use the alloc are - // loads/stores into the cell, and DebugRef. - switch instr := instr.(type) { - case *Store: - if instr.Val == alloc { - return false // address used as value - } - if instr.Addr != alloc { - panic("Alloc.Referrers is inconsistent") - } - defblocks.Add(instr.Block()) - case *UnOp: - if instr.Op != token.MUL { - return false // not a load - } - if instr.X != alloc { - panic("Alloc.Referrers is inconsistent") - } - case *DebugRef: - // ok - default: - return false // some other instruction - } - } - // The Alloc itself counts as a (zero) definition of the cell. - defblocks.Add(alloc.Block()) - - if debugLifting { - fmt.Fprintln(os.Stderr, "\tlifting ", alloc, alloc.Name()) - } - - fn := alloc.Parent() - - // Φ-insertion. - // - // What follows is the body of the main loop of the insert-φ - // function described by Cytron et al, but instead of using - // counter tricks, we just reset the 'hasAlready' and 'work' - // sets each iteration. These are bitmaps so it's pretty cheap. - // - // TODO(adonovan): opt: recycle slice storage for W, - // hasAlready, defBlocks across liftAlloc calls. - var hasAlready BlockSet - - // Initialize W and work to defblocks. - var work BlockSet = defblocks // blocks seen - var W BlockSet // blocks to do - W.Set(&defblocks.Int) - - // Traverse iterated dominance frontier, inserting φ-nodes. - for i := W.Take(); i != -1; i = W.Take() { - u := fn.Blocks[i] - for _, v := range df[u.Index] { - if hasAlready.Add(v) { - // Create φ-node. - // It will be prepended to v.Instrs later, if needed. - phi := &Phi{ - Edges: make([]Value, len(v.Preds)), - Comment: alloc.Comment, - } - // This is merely a debugging aid: - phi.setNum(*fresh) - *fresh++ - - phi.pos = alloc.Pos() - phi.setType(deref(alloc.Type())) - phi.block = v - if debugLifting { - fmt.Fprintf(os.Stderr, "\tplace %s = %s at block %s\n", phi.Name(), phi, v) - } - newPhis[v] = append(newPhis[v], newPhi{phi, alloc}) - - if work.Add(v) { - W.Add(v) - } - } - } - } - - return true -} - -// replaceAll replaces all intraprocedural uses of x with y, -// updating x.Referrers and y.Referrers. -// Precondition: x.Referrers() != nil, i.e. x must be local to some function. -// -func replaceAll(x, y Value) { - var rands []*Value - pxrefs := x.Referrers() - pyrefs := y.Referrers() - for _, instr := range *pxrefs { - rands = instr.Operands(rands[:0]) // recycle storage - for _, rand := range rands { - if *rand != nil { - if *rand == x { - *rand = y - } - } - } - if pyrefs != nil { - *pyrefs = append(*pyrefs, instr) // dups ok - } - } - *pxrefs = nil // x is now unreferenced -} - -// renamed returns the value to which alloc is being renamed, -// constructing it lazily if it's the implicit zero initialization. -// -func renamed(renaming []Value, alloc *Alloc) Value { - v := renaming[alloc.index] - if v == nil { - v = zeroConst(deref(alloc.Type())) - renaming[alloc.index] = v - } - return v -} - -// rename implements the (Cytron et al) SSA renaming algorithm, a -// preorder traversal of the dominator tree replacing all loads of -// Alloc cells with the value stored to that cell by the dominating -// store instruction. For lifting, we need only consider loads, -// stores and φ-nodes. -// -// renaming is a map from *Alloc (keyed by index number) to its -// dominating stored value; newPhis[x] is the set of new φ-nodes to be -// prepended to block x. -// -func rename(u *BasicBlock, renaming []Value, newPhis newPhiMap) { - // Each φ-node becomes the new name for its associated Alloc. - for _, np := range newPhis[u] { - phi := np.phi - alloc := np.alloc - renaming[alloc.index] = phi - } - - // Rename loads and stores of allocs. - for i, instr := range u.Instrs { - switch instr := instr.(type) { - case *Alloc: - if instr.index >= 0 { // store of zero to Alloc cell - // Replace dominated loads by the zero value. - renaming[instr.index] = nil - if debugLifting { - fmt.Fprintf(os.Stderr, "\tkill alloc %s\n", instr) - } - // Delete the Alloc. - u.Instrs[i] = nil - u.gaps++ - } - - case *Store: - if alloc, ok := instr.Addr.(*Alloc); ok && alloc.index >= 0 { // store to Alloc cell - // Replace dominated loads by the stored value. - renaming[alloc.index] = instr.Val - if debugLifting { - fmt.Fprintf(os.Stderr, "\tkill store %s; new value: %s\n", - instr, instr.Val.Name()) - } - // Remove the store from the referrer list of the stored value. - if refs := instr.Val.Referrers(); refs != nil { - *refs = removeInstr(*refs, instr) - } - // Delete the Store. - u.Instrs[i] = nil - u.gaps++ - } - - case *UnOp: - if instr.Op == token.MUL { - if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // load of Alloc cell - newval := renamed(renaming, alloc) - if debugLifting { - fmt.Fprintf(os.Stderr, "\tupdate load %s = %s with %s\n", - instr.Name(), instr, newval.Name()) - } - // Replace all references to - // the loaded value by the - // dominating stored value. - replaceAll(instr, newval) - // Delete the Load. - u.Instrs[i] = nil - u.gaps++ - } - } - - case *DebugRef: - if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // ref of Alloc cell - if instr.IsAddr { - instr.X = renamed(renaming, alloc) - instr.IsAddr = false - - // Add DebugRef to instr.X's referrers. - if refs := instr.X.Referrers(); refs != nil { - *refs = append(*refs, instr) - } - } else { - // A source expression denotes the address - // of an Alloc that was optimized away. - instr.X = nil - - // Delete the DebugRef. - u.Instrs[i] = nil - u.gaps++ - } - } - } - } - - // For each φ-node in a CFG successor, rename the edge. - for _, v := range u.Succs { - phis := newPhis[v] - if len(phis) == 0 { - continue - } - i := v.predIndex(u) - for _, np := range phis { - phi := np.phi - alloc := np.alloc - newval := renamed(renaming, alloc) - if debugLifting { - fmt.Fprintf(os.Stderr, "\tsetphi %s edge %s -> %s (#%d) (alloc=%s) := %s\n", - phi.Name(), u, v, i, alloc.Name(), newval.Name()) - } - phi.Edges[i] = newval - if prefs := newval.Referrers(); prefs != nil { - *prefs = append(*prefs, phi) - } - } - } - - // Continue depth-first recursion over domtree, pushing a - // fresh copy of the renaming map for each subtree. - for i, v := range u.dom.children { - r := renaming - if i < len(u.dom.children)-1 { - // On all but the final iteration, we must make - // a copy to avoid destructive update. - r = make([]Value, len(renaming)) - copy(r, renaming) - } - rename(v, r, newPhis) - } - -} diff --git a/vendor/honnef.co/go/tools/ssa/lvalue.go b/vendor/honnef.co/go/tools/ssa/lvalue.go deleted file mode 100644 index eb5d71e188f..00000000000 --- a/vendor/honnef.co/go/tools/ssa/lvalue.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// lvalues are the union of addressable expressions and map-index -// expressions. - -import ( - "go/ast" - "go/token" - "go/types" -) - -// An lvalue represents an assignable location that may appear on the -// left-hand side of an assignment. This is a generalization of a -// pointer to permit updates to elements of maps. -// -type lvalue interface { - store(fn *Function, v Value) // stores v into the location - load(fn *Function) Value // loads the contents of the location - address(fn *Function) Value // address of the location - typ() types.Type // returns the type of the location -} - -// An address is an lvalue represented by a true pointer. -type address struct { - addr Value - pos token.Pos // source position - expr ast.Expr // source syntax of the value (not address) [debug mode] -} - -func (a *address) load(fn *Function) Value { - load := emitLoad(fn, a.addr) - load.pos = a.pos - return load -} - -func (a *address) store(fn *Function, v Value) { - store := emitStore(fn, a.addr, v, a.pos) - if a.expr != nil { - // store.Val is v, converted for assignability. - emitDebugRef(fn, a.expr, store.Val, false) - } -} - -func (a *address) address(fn *Function) Value { - if a.expr != nil { - emitDebugRef(fn, a.expr, a.addr, true) - } - return a.addr -} - -func (a *address) typ() types.Type { - return deref(a.addr.Type()) -} - -// An element is an lvalue represented by m[k], the location of an -// element of a map or string. These locations are not addressable -// since pointers cannot be formed from them, but they do support -// load(), and in the case of maps, store(). -// -type element struct { - m, k Value // map or string - t types.Type // map element type or string byte type - pos token.Pos // source position of colon ({k:v}) or lbrack (m[k]=v) -} - -func (e *element) load(fn *Function) Value { - l := &Lookup{ - X: e.m, - Index: e.k, - } - l.setPos(e.pos) - l.setType(e.t) - return fn.emit(l) -} - -func (e *element) store(fn *Function, v Value) { - up := &MapUpdate{ - Map: e.m, - Key: e.k, - Value: emitConv(fn, v, e.t), - } - up.pos = e.pos - fn.emit(up) -} - -func (e *element) address(fn *Function) Value { - panic("map/string elements are not addressable") -} - -func (e *element) typ() types.Type { - return e.t -} - -// A blank is a dummy variable whose name is "_". -// It is not reified: loads are illegal and stores are ignored. -// -type blank struct{} - -func (bl blank) load(fn *Function) Value { - panic("blank.load is illegal") -} - -func (bl blank) store(fn *Function, v Value) { - s := &BlankStore{ - Val: v, - } - fn.emit(s) -} - -func (bl blank) address(fn *Function) Value { - panic("blank var is not addressable") -} - -func (bl blank) typ() types.Type { - // This should be the type of the blank Ident; the typechecker - // doesn't provide this yet, but fortunately, we don't need it - // yet either. - panic("blank.typ is unimplemented") -} diff --git a/vendor/honnef.co/go/tools/ssa/methods.go b/vendor/honnef.co/go/tools/ssa/methods.go deleted file mode 100644 index 9cf383916bb..00000000000 --- a/vendor/honnef.co/go/tools/ssa/methods.go +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// This file defines utilities for population of method sets. - -import ( - "fmt" - "go/types" -) - -// MethodValue returns the Function implementing method sel, building -// wrapper methods on demand. It returns nil if sel denotes an -// abstract (interface) method. -// -// Precondition: sel.Kind() == MethodVal. -// -// Thread-safe. -// -// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu) -// -func (prog *Program) MethodValue(sel *types.Selection) *Function { - if sel.Kind() != types.MethodVal { - panic(fmt.Sprintf("MethodValue(%s) kind != MethodVal", sel)) - } - T := sel.Recv() - if isInterface(T) { - return nil // abstract method - } - if prog.mode&LogSource != 0 { - defer logStack("MethodValue %s %v", T, sel)() - } - - prog.methodsMu.Lock() - defer prog.methodsMu.Unlock() - - return prog.addMethod(prog.createMethodSet(T), sel) -} - -// LookupMethod returns the implementation of the method of type T -// identified by (pkg, name). It returns nil if the method exists but -// is abstract, and panics if T has no such method. -// -func (prog *Program) LookupMethod(T types.Type, pkg *types.Package, name string) *Function { - sel := prog.MethodSets.MethodSet(T).Lookup(pkg, name) - if sel == nil { - panic(fmt.Sprintf("%s has no method %s", T, types.Id(pkg, name))) - } - return prog.MethodValue(sel) -} - -// methodSet contains the (concrete) methods of a non-interface type. -type methodSet struct { - mapping map[string]*Function // populated lazily - complete bool // mapping contains all methods -} - -// Precondition: !isInterface(T). -// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu) -func (prog *Program) createMethodSet(T types.Type) *methodSet { - mset, ok := prog.methodSets.At(T).(*methodSet) - if !ok { - mset = &methodSet{mapping: make(map[string]*Function)} - prog.methodSets.Set(T, mset) - } - return mset -} - -// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu) -func (prog *Program) addMethod(mset *methodSet, sel *types.Selection) *Function { - if sel.Kind() == types.MethodExpr { - panic(sel) - } - id := sel.Obj().Id() - fn := mset.mapping[id] - if fn == nil { - obj := sel.Obj().(*types.Func) - - needsPromotion := len(sel.Index()) > 1 - needsIndirection := !isPointer(recvType(obj)) && isPointer(sel.Recv()) - if needsPromotion || needsIndirection { - fn = makeWrapper(prog, sel) - } else { - fn = prog.declaredFunc(obj) - } - if fn.Signature.Recv() == nil { - panic(fn) // missing receiver - } - mset.mapping[id] = fn - } - return fn -} - -// RuntimeTypes returns a new unordered slice containing all -// concrete types in the program for which a complete (non-empty) -// method set is required at run-time. -// -// Thread-safe. -// -// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu) -// -func (prog *Program) RuntimeTypes() []types.Type { - prog.methodsMu.Lock() - defer prog.methodsMu.Unlock() - - var res []types.Type - prog.methodSets.Iterate(func(T types.Type, v interface{}) { - if v.(*methodSet).complete { - res = append(res, T) - } - }) - return res -} - -// declaredFunc returns the concrete function/method denoted by obj. -// Panic ensues if there is none. -// -func (prog *Program) declaredFunc(obj *types.Func) *Function { - if v := prog.packageLevelValue(obj); v != nil { - return v.(*Function) - } - panic("no concrete method: " + obj.String()) -} - -// needMethodsOf ensures that runtime type information (including the -// complete method set) is available for the specified type T and all -// its subcomponents. -// -// needMethodsOf must be called for at least every type that is an -// operand of some MakeInterface instruction, and for the type of -// every exported package member. -// -// Precondition: T is not a method signature (*Signature with Recv()!=nil). -// -// Thread-safe. (Called via emitConv from multiple builder goroutines.) -// -// TODO(adonovan): make this faster. It accounts for 20% of SSA build time. -// -// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu) -// -func (prog *Program) needMethodsOf(T types.Type) { - prog.methodsMu.Lock() - prog.needMethods(T, false) - prog.methodsMu.Unlock() -} - -// Precondition: T is not a method signature (*Signature with Recv()!=nil). -// Recursive case: skip => don't create methods for T. -// -// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu) -// -func (prog *Program) needMethods(T types.Type, skip bool) { - // Each package maintains its own set of types it has visited. - if prevSkip, ok := prog.runtimeTypes.At(T).(bool); ok { - // needMethods(T) was previously called - if !prevSkip || skip { - return // already seen, with same or false 'skip' value - } - } - prog.runtimeTypes.Set(T, skip) - - tmset := prog.MethodSets.MethodSet(T) - - if !skip && !isInterface(T) && tmset.Len() > 0 { - // Create methods of T. - mset := prog.createMethodSet(T) - if !mset.complete { - mset.complete = true - n := tmset.Len() - for i := 0; i < n; i++ { - prog.addMethod(mset, tmset.At(i)) - } - } - } - - // Recursion over signatures of each method. - for i := 0; i < tmset.Len(); i++ { - sig := tmset.At(i).Type().(*types.Signature) - prog.needMethods(sig.Params(), false) - prog.needMethods(sig.Results(), false) - } - - switch t := T.(type) { - case *types.Basic: - // nop - - case *types.Interface: - // nop---handled by recursion over method set. - - case *types.Pointer: - prog.needMethods(t.Elem(), false) - - case *types.Slice: - prog.needMethods(t.Elem(), false) - - case *types.Chan: - prog.needMethods(t.Elem(), false) - - case *types.Map: - prog.needMethods(t.Key(), false) - prog.needMethods(t.Elem(), false) - - case *types.Signature: - if t.Recv() != nil { - panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv())) - } - prog.needMethods(t.Params(), false) - prog.needMethods(t.Results(), false) - - case *types.Named: - // A pointer-to-named type can be derived from a named - // type via reflection. It may have methods too. - prog.needMethods(types.NewPointer(T), false) - - // Consider 'type T struct{S}' where S has methods. - // Reflection provides no way to get from T to struct{S}, - // only to S, so the method set of struct{S} is unwanted, - // so set 'skip' flag during recursion. - prog.needMethods(t.Underlying(), true) - - case *types.Array: - prog.needMethods(t.Elem(), false) - - case *types.Struct: - for i, n := 0, t.NumFields(); i < n; i++ { - prog.needMethods(t.Field(i).Type(), false) - } - - case *types.Tuple: - for i, n := 0, t.Len(); i < n; i++ { - prog.needMethods(t.At(i).Type(), false) - } - - default: - panic(T) - } -} diff --git a/vendor/honnef.co/go/tools/ssa/mode.go b/vendor/honnef.co/go/tools/ssa/mode.go deleted file mode 100644 index d2a269893a7..00000000000 --- a/vendor/honnef.co/go/tools/ssa/mode.go +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// This file defines the BuilderMode type and its command-line flag. - -import ( - "bytes" - "fmt" -) - -// BuilderMode is a bitmask of options for diagnostics and checking. -// -// *BuilderMode satisfies the flag.Value interface. Example: -// -// var mode = ssa.BuilderMode(0) -// func init() { flag.Var(&mode, "build", ssa.BuilderModeDoc) } -// -type BuilderMode uint - -const ( - PrintPackages BuilderMode = 1 << iota // Print package inventory to stdout - PrintFunctions // Print function SSA code to stdout - LogSource // Log source locations as SSA builder progresses - SanityCheckFunctions // Perform sanity checking of function bodies - NaiveForm // Build naïve SSA form: don't replace local loads/stores with registers - BuildSerially // Build packages serially, not in parallel. - GlobalDebug // Enable debug info for all packages - BareInits // Build init functions without guards or calls to dependent inits -) - -const BuilderModeDoc = `Options controlling the SSA builder. -The value is a sequence of zero or more of these letters: -C perform sanity [C]hecking of the SSA form. -D include [D]ebug info for every function. -P print [P]ackage inventory. -F print [F]unction SSA code. -S log [S]ource locations as SSA builder progresses. -L build distinct packages seria[L]ly instead of in parallel. -N build [N]aive SSA form: don't replace local loads/stores with registers. -I build bare [I]nit functions: no init guards or calls to dependent inits. -` - -func (m BuilderMode) String() string { - var buf bytes.Buffer - if m&GlobalDebug != 0 { - buf.WriteByte('D') - } - if m&PrintPackages != 0 { - buf.WriteByte('P') - } - if m&PrintFunctions != 0 { - buf.WriteByte('F') - } - if m&LogSource != 0 { - buf.WriteByte('S') - } - if m&SanityCheckFunctions != 0 { - buf.WriteByte('C') - } - if m&NaiveForm != 0 { - buf.WriteByte('N') - } - if m&BuildSerially != 0 { - buf.WriteByte('L') - } - return buf.String() -} - -// Set parses the flag characters in s and updates *m. -func (m *BuilderMode) Set(s string) error { - var mode BuilderMode - for _, c := range s { - switch c { - case 'D': - mode |= GlobalDebug - case 'P': - mode |= PrintPackages - case 'F': - mode |= PrintFunctions - case 'S': - mode |= LogSource | BuildSerially - case 'C': - mode |= SanityCheckFunctions - case 'N': - mode |= NaiveForm - case 'L': - mode |= BuildSerially - default: - return fmt.Errorf("unknown BuilderMode option: %q", c) - } - } - *m = mode - return nil -} - -// Get returns m. -func (m BuilderMode) Get() interface{} { return m } diff --git a/vendor/honnef.co/go/tools/ssa/print.go b/vendor/honnef.co/go/tools/ssa/print.go deleted file mode 100644 index 6fd277277c0..00000000000 --- a/vendor/honnef.co/go/tools/ssa/print.go +++ /dev/null @@ -1,435 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// This file implements the String() methods for all Value and -// Instruction types. - -import ( - "bytes" - "fmt" - "go/types" - "io" - "reflect" - "sort" - - "golang.org/x/tools/go/types/typeutil" -) - -// relName returns the name of v relative to i. -// In most cases, this is identical to v.Name(), but references to -// Functions (including methods) and Globals use RelString and -// all types are displayed with relType, so that only cross-package -// references are package-qualified. -// -func relName(v Value, i Instruction) string { - var from *types.Package - if i != nil { - from = i.Parent().pkg() - } - switch v := v.(type) { - case Member: // *Function or *Global - return v.RelString(from) - case *Const: - return v.RelString(from) - } - return v.Name() -} - -func relType(t types.Type, from *types.Package) string { - return types.TypeString(t, types.RelativeTo(from)) -} - -func relString(m Member, from *types.Package) string { - // NB: not all globals have an Object (e.g. init$guard), - // so use Package().Object not Object.Package(). - if pkg := m.Package().Pkg; pkg != nil && pkg != from { - return fmt.Sprintf("%s.%s", pkg.Path(), m.Name()) - } - return m.Name() -} - -// Value.String() -// -// This method is provided only for debugging. -// It never appears in disassembly, which uses Value.Name(). - -func (v *Parameter) String() string { - from := v.Parent().pkg() - return fmt.Sprintf("parameter %s : %s", v.Name(), relType(v.Type(), from)) -} - -func (v *FreeVar) String() string { - from := v.Parent().pkg() - return fmt.Sprintf("freevar %s : %s", v.Name(), relType(v.Type(), from)) -} - -func (v *Builtin) String() string { - return fmt.Sprintf("builtin %s", v.Name()) -} - -// Instruction.String() - -func (v *Alloc) String() string { - op := "local" - if v.Heap { - op = "new" - } - from := v.Parent().pkg() - return fmt.Sprintf("%s %s (%s)", op, relType(deref(v.Type()), from), v.Comment) -} - -func (v *Phi) String() string { - var b bytes.Buffer - b.WriteString("phi [") - for i, edge := range v.Edges { - if i > 0 { - b.WriteString(", ") - } - // Be robust against malformed CFG. - if v.block == nil { - b.WriteString("??") - continue - } - block := -1 - if i < len(v.block.Preds) { - block = v.block.Preds[i].Index - } - fmt.Fprintf(&b, "%d: ", block) - edgeVal := "" // be robust - if edge != nil { - edgeVal = relName(edge, v) - } - b.WriteString(edgeVal) - } - b.WriteString("]") - if v.Comment != "" { - b.WriteString(" #") - b.WriteString(v.Comment) - } - return b.String() -} - -func printCall(v *CallCommon, prefix string, instr Instruction) string { - var b bytes.Buffer - b.WriteString(prefix) - if !v.IsInvoke() { - b.WriteString(relName(v.Value, instr)) - } else { - fmt.Fprintf(&b, "invoke %s.%s", relName(v.Value, instr), v.Method.Name()) - } - b.WriteString("(") - for i, arg := range v.Args { - if i > 0 { - b.WriteString(", ") - } - b.WriteString(relName(arg, instr)) - } - if v.Signature().Variadic() { - b.WriteString("...") - } - b.WriteString(")") - return b.String() -} - -func (c *CallCommon) String() string { - return printCall(c, "", nil) -} - -func (v *Call) String() string { - return printCall(&v.Call, "", v) -} - -func (v *BinOp) String() string { - return fmt.Sprintf("%s %s %s", relName(v.X, v), v.Op.String(), relName(v.Y, v)) -} - -func (v *UnOp) String() string { - return fmt.Sprintf("%s%s%s", v.Op, relName(v.X, v), commaOk(v.CommaOk)) -} - -func printConv(prefix string, v, x Value) string { - from := v.Parent().pkg() - return fmt.Sprintf("%s %s <- %s (%s)", - prefix, - relType(v.Type(), from), - relType(x.Type(), from), - relName(x, v.(Instruction))) -} - -func (v *ChangeType) String() string { return printConv("changetype", v, v.X) } -func (v *Convert) String() string { return printConv("convert", v, v.X) } -func (v *ChangeInterface) String() string { return printConv("change interface", v, v.X) } -func (v *MakeInterface) String() string { return printConv("make", v, v.X) } - -func (v *MakeClosure) String() string { - var b bytes.Buffer - fmt.Fprintf(&b, "make closure %s", relName(v.Fn, v)) - if v.Bindings != nil { - b.WriteString(" [") - for i, c := range v.Bindings { - if i > 0 { - b.WriteString(", ") - } - b.WriteString(relName(c, v)) - } - b.WriteString("]") - } - return b.String() -} - -func (v *MakeSlice) String() string { - from := v.Parent().pkg() - return fmt.Sprintf("make %s %s %s", - relType(v.Type(), from), - relName(v.Len, v), - relName(v.Cap, v)) -} - -func (v *Slice) String() string { - var b bytes.Buffer - b.WriteString("slice ") - b.WriteString(relName(v.X, v)) - b.WriteString("[") - if v.Low != nil { - b.WriteString(relName(v.Low, v)) - } - b.WriteString(":") - if v.High != nil { - b.WriteString(relName(v.High, v)) - } - if v.Max != nil { - b.WriteString(":") - b.WriteString(relName(v.Max, v)) - } - b.WriteString("]") - return b.String() -} - -func (v *MakeMap) String() string { - res := "" - if v.Reserve != nil { - res = relName(v.Reserve, v) - } - from := v.Parent().pkg() - return fmt.Sprintf("make %s %s", relType(v.Type(), from), res) -} - -func (v *MakeChan) String() string { - from := v.Parent().pkg() - return fmt.Sprintf("make %s %s", relType(v.Type(), from), relName(v.Size, v)) -} - -func (v *FieldAddr) String() string { - st := deref(v.X.Type()).Underlying().(*types.Struct) - // Be robust against a bad index. - name := "?" - if 0 <= v.Field && v.Field < st.NumFields() { - name = st.Field(v.Field).Name() - } - return fmt.Sprintf("&%s.%s [#%d]", relName(v.X, v), name, v.Field) -} - -func (v *Field) String() string { - st := v.X.Type().Underlying().(*types.Struct) - // Be robust against a bad index. - name := "?" - if 0 <= v.Field && v.Field < st.NumFields() { - name = st.Field(v.Field).Name() - } - return fmt.Sprintf("%s.%s [#%d]", relName(v.X, v), name, v.Field) -} - -func (v *IndexAddr) String() string { - return fmt.Sprintf("&%s[%s]", relName(v.X, v), relName(v.Index, v)) -} - -func (v *Index) String() string { - return fmt.Sprintf("%s[%s]", relName(v.X, v), relName(v.Index, v)) -} - -func (v *Lookup) String() string { - return fmt.Sprintf("%s[%s]%s", relName(v.X, v), relName(v.Index, v), commaOk(v.CommaOk)) -} - -func (v *Range) String() string { - return "range " + relName(v.X, v) -} - -func (v *Next) String() string { - return "next " + relName(v.Iter, v) -} - -func (v *TypeAssert) String() string { - from := v.Parent().pkg() - return fmt.Sprintf("typeassert%s %s.(%s)", commaOk(v.CommaOk), relName(v.X, v), relType(v.AssertedType, from)) -} - -func (v *Extract) String() string { - return fmt.Sprintf("extract %s #%d", relName(v.Tuple, v), v.Index) -} - -func (s *Jump) String() string { - // Be robust against malformed CFG. - block := -1 - if s.block != nil && len(s.block.Succs) == 1 { - block = s.block.Succs[0].Index - } - return fmt.Sprintf("jump %d", block) -} - -func (s *If) String() string { - // Be robust against malformed CFG. - tblock, fblock := -1, -1 - if s.block != nil && len(s.block.Succs) == 2 { - tblock = s.block.Succs[0].Index - fblock = s.block.Succs[1].Index - } - return fmt.Sprintf("if %s goto %d else %d", relName(s.Cond, s), tblock, fblock) -} - -func (s *Go) String() string { - return printCall(&s.Call, "go ", s) -} - -func (s *Panic) String() string { - return "panic " + relName(s.X, s) -} - -func (s *Return) String() string { - var b bytes.Buffer - b.WriteString("return") - for i, r := range s.Results { - if i == 0 { - b.WriteString(" ") - } else { - b.WriteString(", ") - } - b.WriteString(relName(r, s)) - } - return b.String() -} - -func (*RunDefers) String() string { - return "rundefers" -} - -func (s *Send) String() string { - return fmt.Sprintf("send %s <- %s", relName(s.Chan, s), relName(s.X, s)) -} - -func (s *Defer) String() string { - return printCall(&s.Call, "defer ", s) -} - -func (s *Select) String() string { - var b bytes.Buffer - for i, st := range s.States { - if i > 0 { - b.WriteString(", ") - } - if st.Dir == types.RecvOnly { - b.WriteString("<-") - b.WriteString(relName(st.Chan, s)) - } else { - b.WriteString(relName(st.Chan, s)) - b.WriteString("<-") - b.WriteString(relName(st.Send, s)) - } - } - non := "" - if !s.Blocking { - non = "non" - } - return fmt.Sprintf("select %sblocking [%s]", non, b.String()) -} - -func (s *Store) String() string { - return fmt.Sprintf("*%s = %s", relName(s.Addr, s), relName(s.Val, s)) -} - -func (s *BlankStore) String() string { - return fmt.Sprintf("_ = %s", relName(s.Val, s)) -} - -func (s *MapUpdate) String() string { - return fmt.Sprintf("%s[%s] = %s", relName(s.Map, s), relName(s.Key, s), relName(s.Value, s)) -} - -func (s *DebugRef) String() string { - p := s.Parent().Prog.Fset.Position(s.Pos()) - var descr interface{} - if s.object != nil { - descr = s.object // e.g. "var x int" - } else { - descr = reflect.TypeOf(s.Expr) // e.g. "*ast.CallExpr" - } - var addr string - if s.IsAddr { - addr = "address of " - } - return fmt.Sprintf("; %s%s @ %d:%d is %s", addr, descr, p.Line, p.Column, s.X.Name()) -} - -func (p *Package) String() string { - return "package " + p.Pkg.Path() -} - -var _ io.WriterTo = (*Package)(nil) // *Package implements io.Writer - -func (p *Package) WriteTo(w io.Writer) (int64, error) { - var buf bytes.Buffer - WritePackage(&buf, p) - n, err := w.Write(buf.Bytes()) - return int64(n), err -} - -// WritePackage writes to buf a human-readable summary of p. -func WritePackage(buf *bytes.Buffer, p *Package) { - fmt.Fprintf(buf, "%s:\n", p) - - var names []string - maxname := 0 - for name := range p.Members { - if l := len(name); l > maxname { - maxname = l - } - names = append(names, name) - } - - from := p.Pkg - sort.Strings(names) - for _, name := range names { - switch mem := p.Members[name].(type) { - case *NamedConst: - fmt.Fprintf(buf, " const %-*s %s = %s\n", - maxname, name, mem.Name(), mem.Value.RelString(from)) - - case *Function: - fmt.Fprintf(buf, " func %-*s %s\n", - maxname, name, relType(mem.Type(), from)) - - case *Type: - fmt.Fprintf(buf, " type %-*s %s\n", - maxname, name, relType(mem.Type().Underlying(), from)) - for _, meth := range typeutil.IntuitiveMethodSet(mem.Type(), &p.Prog.MethodSets) { - fmt.Fprintf(buf, " %s\n", types.SelectionString(meth, types.RelativeTo(from))) - } - - case *Global: - fmt.Fprintf(buf, " var %-*s %s\n", - maxname, name, relType(mem.Type().(*types.Pointer).Elem(), from)) - } - } - - fmt.Fprintf(buf, "\n") -} - -func commaOk(x bool) string { - if x { - return ",ok" - } - return "" -} diff --git a/vendor/honnef.co/go/tools/ssa/sanity.go b/vendor/honnef.co/go/tools/ssa/sanity.go deleted file mode 100644 index 1d29b66b02c..00000000000 --- a/vendor/honnef.co/go/tools/ssa/sanity.go +++ /dev/null @@ -1,535 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// An optional pass for sanity-checking invariants of the SSA representation. -// Currently it checks CFG invariants but little at the instruction level. - -import ( - "fmt" - "go/types" - "io" - "os" - "strings" -) - -type sanity struct { - reporter io.Writer - fn *Function - block *BasicBlock - instrs map[Instruction]struct{} - insane bool -} - -// sanityCheck performs integrity checking of the SSA representation -// of the function fn and returns true if it was valid. Diagnostics -// are written to reporter if non-nil, os.Stderr otherwise. Some -// diagnostics are only warnings and do not imply a negative result. -// -// Sanity-checking is intended to facilitate the debugging of code -// transformation passes. -// -func sanityCheck(fn *Function, reporter io.Writer) bool { - if reporter == nil { - reporter = os.Stderr - } - return (&sanity{reporter: reporter}).checkFunction(fn) -} - -// mustSanityCheck is like sanityCheck but panics instead of returning -// a negative result. -// -func mustSanityCheck(fn *Function, reporter io.Writer) { - if !sanityCheck(fn, reporter) { - fn.WriteTo(os.Stderr) - panic("SanityCheck failed") - } -} - -func (s *sanity) diagnostic(prefix, format string, args ...interface{}) { - fmt.Fprintf(s.reporter, "%s: function %s", prefix, s.fn) - if s.block != nil { - fmt.Fprintf(s.reporter, ", block %s", s.block) - } - io.WriteString(s.reporter, ": ") - fmt.Fprintf(s.reporter, format, args...) - io.WriteString(s.reporter, "\n") -} - -func (s *sanity) errorf(format string, args ...interface{}) { - s.insane = true - s.diagnostic("Error", format, args...) -} - -func (s *sanity) warnf(format string, args ...interface{}) { - s.diagnostic("Warning", format, args...) -} - -// findDuplicate returns an arbitrary basic block that appeared more -// than once in blocks, or nil if all were unique. -func findDuplicate(blocks []*BasicBlock) *BasicBlock { - if len(blocks) < 2 { - return nil - } - if blocks[0] == blocks[1] { - return blocks[0] - } - // Slow path: - m := make(map[*BasicBlock]bool) - for _, b := range blocks { - if m[b] { - return b - } - m[b] = true - } - return nil -} - -func (s *sanity) checkInstr(idx int, instr Instruction) { - switch instr := instr.(type) { - case *If, *Jump, *Return, *Panic: - s.errorf("control flow instruction not at end of block") - case *Phi: - if idx == 0 { - // It suffices to apply this check to just the first phi node. - if dup := findDuplicate(s.block.Preds); dup != nil { - s.errorf("phi node in block with duplicate predecessor %s", dup) - } - } else { - prev := s.block.Instrs[idx-1] - if _, ok := prev.(*Phi); !ok { - s.errorf("Phi instruction follows a non-Phi: %T", prev) - } - } - if ne, np := len(instr.Edges), len(s.block.Preds); ne != np { - s.errorf("phi node has %d edges but %d predecessors", ne, np) - - } else { - for i, e := range instr.Edges { - if e == nil { - s.errorf("phi node '%s' has no value for edge #%d from %s", instr.Comment, i, s.block.Preds[i]) - } - } - } - - case *Alloc: - if !instr.Heap { - found := false - for _, l := range s.fn.Locals { - if l == instr { - found = true - break - } - } - if !found { - s.errorf("local alloc %s = %s does not appear in Function.Locals", instr.Name(), instr) - } - } - - case *BinOp: - case *Call: - case *ChangeInterface: - case *ChangeType: - case *Convert: - if _, ok := instr.X.Type().Underlying().(*types.Basic); !ok { - if _, ok := instr.Type().Underlying().(*types.Basic); !ok { - s.errorf("convert %s -> %s: at least one type must be basic", instr.X.Type(), instr.Type()) - } - } - - case *Defer: - case *Extract: - case *Field: - case *FieldAddr: - case *Go: - case *Index: - case *IndexAddr: - case *Lookup: - case *MakeChan: - case *MakeClosure: - numFree := len(instr.Fn.(*Function).FreeVars) - numBind := len(instr.Bindings) - if numFree != numBind { - s.errorf("MakeClosure has %d Bindings for function %s with %d free vars", - numBind, instr.Fn, numFree) - - } - if recv := instr.Type().(*types.Signature).Recv(); recv != nil { - s.errorf("MakeClosure's type includes receiver %s", recv.Type()) - } - - case *MakeInterface: - case *MakeMap: - case *MakeSlice: - case *MapUpdate: - case *Next: - case *Range: - case *RunDefers: - case *Select: - case *Send: - case *Slice: - case *Store: - case *TypeAssert: - case *UnOp: - case *DebugRef: - case *BlankStore: - case *Sigma: - // TODO(adonovan): implement checks. - default: - panic(fmt.Sprintf("Unknown instruction type: %T", instr)) - } - - if call, ok := instr.(CallInstruction); ok { - if call.Common().Signature() == nil { - s.errorf("nil signature: %s", call) - } - } - - // Check that value-defining instructions have valid types - // and a valid referrer list. - if v, ok := instr.(Value); ok { - t := v.Type() - if t == nil { - s.errorf("no type: %s = %s", v.Name(), v) - } else if t == tRangeIter { - // not a proper type; ignore. - } else if b, ok := t.Underlying().(*types.Basic); ok && b.Info()&types.IsUntyped != 0 { - s.errorf("instruction has 'untyped' result: %s = %s : %s", v.Name(), v, t) - } - s.checkReferrerList(v) - } - - // Untyped constants are legal as instruction Operands(), - // for example: - // _ = "foo"[0] - // or: - // if wordsize==64 {...} - - // All other non-Instruction Values can be found via their - // enclosing Function or Package. -} - -func (s *sanity) checkFinalInstr(instr Instruction) { - switch instr := instr.(type) { - case *If: - if nsuccs := len(s.block.Succs); nsuccs != 2 { - s.errorf("If-terminated block has %d successors; expected 2", nsuccs) - return - } - if s.block.Succs[0] == s.block.Succs[1] { - s.errorf("If-instruction has same True, False target blocks: %s", s.block.Succs[0]) - return - } - - case *Jump: - if nsuccs := len(s.block.Succs); nsuccs != 1 { - s.errorf("Jump-terminated block has %d successors; expected 1", nsuccs) - return - } - - case *Return: - if nsuccs := len(s.block.Succs); nsuccs != 0 { - s.errorf("Return-terminated block has %d successors; expected none", nsuccs) - return - } - if na, nf := len(instr.Results), s.fn.Signature.Results().Len(); nf != na { - s.errorf("%d-ary return in %d-ary function", na, nf) - } - - case *Panic: - if nsuccs := len(s.block.Succs); nsuccs != 0 { - s.errorf("Panic-terminated block has %d successors; expected none", nsuccs) - return - } - - default: - s.errorf("non-control flow instruction at end of block") - } -} - -func (s *sanity) checkBlock(b *BasicBlock, index int) { - s.block = b - - if b.Index != index { - s.errorf("block has incorrect Index %d", b.Index) - } - if b.parent != s.fn { - s.errorf("block has incorrect parent %s", b.parent) - } - - // Check all blocks are reachable. - // (The entry block is always implicitly reachable, - // as is the Recover block, if any.) - if (index > 0 && b != b.parent.Recover) && len(b.Preds) == 0 { - s.warnf("unreachable block") - if b.Instrs == nil { - // Since this block is about to be pruned, - // tolerating transient problems in it - // simplifies other optimizations. - return - } - } - - // Check predecessor and successor relations are dual, - // and that all blocks in CFG belong to same function. - for _, a := range b.Preds { - found := false - for _, bb := range a.Succs { - if bb == b { - found = true - break - } - } - if !found { - s.errorf("expected successor edge in predecessor %s; found only: %s", a, a.Succs) - } - if a.parent != s.fn { - s.errorf("predecessor %s belongs to different function %s", a, a.parent) - } - } - for _, c := range b.Succs { - found := false - for _, bb := range c.Preds { - if bb == b { - found = true - break - } - } - if !found { - s.errorf("expected predecessor edge in successor %s; found only: %s", c, c.Preds) - } - if c.parent != s.fn { - s.errorf("successor %s belongs to different function %s", c, c.parent) - } - } - - // Check each instruction is sane. - n := len(b.Instrs) - if n == 0 { - s.errorf("basic block contains no instructions") - } - var rands [10]*Value // reuse storage - for j, instr := range b.Instrs { - if instr == nil { - s.errorf("nil instruction at index %d", j) - continue - } - if b2 := instr.Block(); b2 == nil { - s.errorf("nil Block() for instruction at index %d", j) - continue - } else if b2 != b { - s.errorf("wrong Block() (%s) for instruction at index %d ", b2, j) - continue - } - if j < n-1 { - s.checkInstr(j, instr) - } else { - s.checkFinalInstr(instr) - } - - // Check Instruction.Operands. - operands: - for i, op := range instr.Operands(rands[:0]) { - if op == nil { - s.errorf("nil operand pointer %d of %s", i, instr) - continue - } - val := *op - if val == nil { - continue // a nil operand is ok - } - - // Check that "untyped" types only appear on constant operands. - if _, ok := (*op).(*Const); !ok { - if basic, ok := (*op).Type().(*types.Basic); ok { - if basic.Info()&types.IsUntyped != 0 { - s.errorf("operand #%d of %s is untyped: %s", i, instr, basic) - } - } - } - - // Check that Operands that are also Instructions belong to same function. - // TODO(adonovan): also check their block dominates block b. - if val, ok := val.(Instruction); ok { - if val.Block() == nil { - s.errorf("operand %d of %s is an instruction (%s) that belongs to no block", i, instr, val) - } else if val.Parent() != s.fn { - s.errorf("operand %d of %s is an instruction (%s) from function %s", i, instr, val, val.Parent()) - } - } - - // Check that each function-local operand of - // instr refers back to instr. (NB: quadratic) - switch val := val.(type) { - case *Const, *Global, *Builtin: - continue // not local - case *Function: - if val.parent == nil { - continue // only anon functions are local - } - } - - // TODO(adonovan): check val.Parent() != nil <=> val.Referrers() is defined. - - if refs := val.Referrers(); refs != nil { - for _, ref := range *refs { - if ref == instr { - continue operands - } - } - s.errorf("operand %d of %s (%s) does not refer to us", i, instr, val) - } else { - s.errorf("operand %d of %s (%s) has no referrers", i, instr, val) - } - } - } -} - -func (s *sanity) checkReferrerList(v Value) { - refs := v.Referrers() - if refs == nil { - s.errorf("%s has missing referrer list", v.Name()) - return - } - for i, ref := range *refs { - if _, ok := s.instrs[ref]; !ok { - s.errorf("%s.Referrers()[%d] = %s is not an instruction belonging to this function", v.Name(), i, ref) - } - } -} - -func (s *sanity) checkFunction(fn *Function) bool { - // TODO(adonovan): check Function invariants: - // - check params match signature - // - check transient fields are nil - // - warn if any fn.Locals do not appear among block instructions. - s.fn = fn - if fn.Prog == nil { - s.errorf("nil Prog") - } - - _ = fn.String() // must not crash - _ = fn.RelString(fn.pkg()) // must not crash - - // All functions have a package, except delegates (which are - // shared across packages, or duplicated as weak symbols in a - // separate-compilation model), and error.Error. - if fn.Pkg == nil { - if strings.HasPrefix(fn.Synthetic, "wrapper ") || - strings.HasPrefix(fn.Synthetic, "bound ") || - strings.HasPrefix(fn.Synthetic, "thunk ") || - strings.HasSuffix(fn.name, "Error") { - // ok - } else { - s.errorf("nil Pkg") - } - } - if src, syn := fn.Synthetic == "", fn.Syntax() != nil; src != syn { - s.errorf("got fromSource=%t, hasSyntax=%t; want same values", src, syn) - } - for i, l := range fn.Locals { - if l.Parent() != fn { - s.errorf("Local %s at index %d has wrong parent", l.Name(), i) - } - if l.Heap { - s.errorf("Local %s at index %d has Heap flag set", l.Name(), i) - } - } - // Build the set of valid referrers. - s.instrs = make(map[Instruction]struct{}) - for _, b := range fn.Blocks { - for _, instr := range b.Instrs { - s.instrs[instr] = struct{}{} - } - } - for i, p := range fn.Params { - if p.Parent() != fn { - s.errorf("Param %s at index %d has wrong parent", p.Name(), i) - } - // Check common suffix of Signature and Params match type. - if sig := fn.Signature; sig != nil { - j := i - len(fn.Params) + sig.Params().Len() // index within sig.Params - if j < 0 { - continue - } - if !types.Identical(p.Type(), sig.Params().At(j).Type()) { - s.errorf("Param %s at index %d has wrong type (%s, versus %s in Signature)", p.Name(), i, p.Type(), sig.Params().At(j).Type()) - - } - } - - s.checkReferrerList(p) - } - for i, fv := range fn.FreeVars { - if fv.Parent() != fn { - s.errorf("FreeVar %s at index %d has wrong parent", fv.Name(), i) - } - s.checkReferrerList(fv) - } - - if fn.Blocks != nil && len(fn.Blocks) == 0 { - // Function _had_ blocks (so it's not external) but - // they were "optimized" away, even the entry block. - s.errorf("Blocks slice is non-nil but empty") - } - for i, b := range fn.Blocks { - if b == nil { - s.warnf("nil *BasicBlock at f.Blocks[%d]", i) - continue - } - s.checkBlock(b, i) - } - if fn.Recover != nil && fn.Blocks[fn.Recover.Index] != fn.Recover { - s.errorf("Recover block is not in Blocks slice") - } - - s.block = nil - for i, anon := range fn.AnonFuncs { - if anon.Parent() != fn { - s.errorf("AnonFuncs[%d]=%s but %s.Parent()=%s", i, anon, anon, anon.Parent()) - } - } - s.fn = nil - return !s.insane -} - -// sanityCheckPackage checks invariants of packages upon creation. -// It does not require that the package is built. -// Unlike sanityCheck (for functions), it just panics at the first error. -func sanityCheckPackage(pkg *Package) { - if pkg.Pkg == nil { - panic(fmt.Sprintf("Package %s has no Object", pkg)) - } - _ = pkg.String() // must not crash - - for name, mem := range pkg.Members { - if name != mem.Name() { - panic(fmt.Sprintf("%s: %T.Name() = %s, want %s", - pkg.Pkg.Path(), mem, mem.Name(), name)) - } - obj := mem.Object() - if obj == nil { - // This check is sound because fields - // {Global,Function}.object have type - // types.Object. (If they were declared as - // *types.{Var,Func}, we'd have a non-empty - // interface containing a nil pointer.) - - continue // not all members have typechecker objects - } - if obj.Name() != name { - if obj.Name() == "init" && strings.HasPrefix(mem.Name(), "init#") { - // Ok. The name of a declared init function varies between - // its types.Func ("init") and its ssa.Function ("init#%d"). - } else { - panic(fmt.Sprintf("%s: %T.Object().Name() = %s, want %s", - pkg.Pkg.Path(), mem, obj.Name(), name)) - } - } - if obj.Pos() != mem.Pos() { - panic(fmt.Sprintf("%s Pos=%d obj.Pos=%d", mem, mem.Pos(), obj.Pos())) - } - } -} diff --git a/vendor/honnef.co/go/tools/ssa/source.go b/vendor/honnef.co/go/tools/ssa/source.go deleted file mode 100644 index 8d9cca17039..00000000000 --- a/vendor/honnef.co/go/tools/ssa/source.go +++ /dev/null @@ -1,293 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// This file defines utilities for working with source positions -// or source-level named entities ("objects"). - -// TODO(adonovan): test that {Value,Instruction}.Pos() positions match -// the originating syntax, as specified. - -import ( - "go/ast" - "go/token" - "go/types" -) - -// EnclosingFunction returns the function that contains the syntax -// node denoted by path. -// -// Syntax associated with package-level variable specifications is -// enclosed by the package's init() function. -// -// Returns nil if not found; reasons might include: -// - the node is not enclosed by any function. -// - the node is within an anonymous function (FuncLit) and -// its SSA function has not been created yet -// (pkg.Build() has not yet been called). -// -func EnclosingFunction(pkg *Package, path []ast.Node) *Function { - // Start with package-level function... - fn := findEnclosingPackageLevelFunction(pkg, path) - if fn == nil { - return nil // not in any function - } - - // ...then walk down the nested anonymous functions. - n := len(path) -outer: - for i := range path { - if lit, ok := path[n-1-i].(*ast.FuncLit); ok { - for _, anon := range fn.AnonFuncs { - if anon.Pos() == lit.Type.Func { - fn = anon - continue outer - } - } - // SSA function not found: - // - package not yet built, or maybe - // - builder skipped FuncLit in dead block - // (in principle; but currently the Builder - // generates even dead FuncLits). - return nil - } - } - return fn -} - -// HasEnclosingFunction returns true if the AST node denoted by path -// is contained within the declaration of some function or -// package-level variable. -// -// Unlike EnclosingFunction, the behaviour of this function does not -// depend on whether SSA code for pkg has been built, so it can be -// used to quickly reject check inputs that will cause -// EnclosingFunction to fail, prior to SSA building. -// -func HasEnclosingFunction(pkg *Package, path []ast.Node) bool { - return findEnclosingPackageLevelFunction(pkg, path) != nil -} - -// findEnclosingPackageLevelFunction returns the Function -// corresponding to the package-level function enclosing path. -// -func findEnclosingPackageLevelFunction(pkg *Package, path []ast.Node) *Function { - if n := len(path); n >= 2 { // [... {Gen,Func}Decl File] - switch decl := path[n-2].(type) { - case *ast.GenDecl: - if decl.Tok == token.VAR && n >= 3 { - // Package-level 'var' initializer. - return pkg.init - } - - case *ast.FuncDecl: - if decl.Recv == nil && decl.Name.Name == "init" { - // Explicit init() function. - for _, b := range pkg.init.Blocks { - for _, instr := range b.Instrs { - if instr, ok := instr.(*Call); ok { - if callee, ok := instr.Call.Value.(*Function); ok && callee.Pkg == pkg && callee.Pos() == decl.Name.NamePos { - return callee - } - } - } - } - // Hack: return non-nil when SSA is not yet - // built so that HasEnclosingFunction works. - return pkg.init - } - // Declared function/method. - return findNamedFunc(pkg, decl.Name.NamePos) - } - } - return nil // not in any function -} - -// findNamedFunc returns the named function whose FuncDecl.Ident is at -// position pos. -// -func findNamedFunc(pkg *Package, pos token.Pos) *Function { - // Look at all package members and method sets of named types. - // Not very efficient. - for _, mem := range pkg.Members { - switch mem := mem.(type) { - case *Function: - if mem.Pos() == pos { - return mem - } - case *Type: - mset := pkg.Prog.MethodSets.MethodSet(types.NewPointer(mem.Type())) - for i, n := 0, mset.Len(); i < n; i++ { - // Don't call Program.Method: avoid creating wrappers. - obj := mset.At(i).Obj().(*types.Func) - if obj.Pos() == pos { - return pkg.values[obj].(*Function) - } - } - } - } - return nil -} - -// ValueForExpr returns the SSA Value that corresponds to non-constant -// expression e. -// -// It returns nil if no value was found, e.g. -// - the expression is not lexically contained within f; -// - f was not built with debug information; or -// - e is a constant expression. (For efficiency, no debug -// information is stored for constants. Use -// go/types.Info.Types[e].Value instead.) -// - e is a reference to nil or a built-in function. -// - the value was optimised away. -// -// If e is an addressable expression used in an lvalue context, -// value is the address denoted by e, and isAddr is true. -// -// The types of e (or &e, if isAddr) and the result are equal -// (modulo "untyped" bools resulting from comparisons). -// -// (Tip: to find the ssa.Value given a source position, use -// astutil.PathEnclosingInterval to locate the ast.Node, then -// EnclosingFunction to locate the Function, then ValueForExpr to find -// the ssa.Value.) -// -func (f *Function) ValueForExpr(e ast.Expr) (value Value, isAddr bool) { - if f.debugInfo() { // (opt) - e = unparen(e) - for _, b := range f.Blocks { - for _, instr := range b.Instrs { - if ref, ok := instr.(*DebugRef); ok { - if ref.Expr == e { - return ref.X, ref.IsAddr - } - } - } - } - } - return -} - -// --- Lookup functions for source-level named entities (types.Objects) --- - -// Package returns the SSA Package corresponding to the specified -// type-checker package object. -// It returns nil if no such SSA package has been created. -// -func (prog *Program) Package(obj *types.Package) *Package { - return prog.packages[obj] -} - -// packageLevelValue returns the package-level value corresponding to -// the specified named object, which may be a package-level const -// (*Const), var (*Global) or func (*Function) of some package in -// prog. It returns nil if the object is not found. -// -func (prog *Program) packageLevelValue(obj types.Object) Value { - if pkg, ok := prog.packages[obj.Pkg()]; ok { - return pkg.values[obj] - } - return nil -} - -// FuncValue returns the concrete Function denoted by the source-level -// named function obj, or nil if obj denotes an interface method. -// -// TODO(adonovan): check the invariant that obj.Type() matches the -// result's Signature, both in the params/results and in the receiver. -// -func (prog *Program) FuncValue(obj *types.Func) *Function { - fn, _ := prog.packageLevelValue(obj).(*Function) - return fn -} - -// ConstValue returns the SSA Value denoted by the source-level named -// constant obj. -// -func (prog *Program) ConstValue(obj *types.Const) *Const { - // TODO(adonovan): opt: share (don't reallocate) - // Consts for const objects and constant ast.Exprs. - - // Universal constant? {true,false,nil} - if obj.Parent() == types.Universe { - return NewConst(obj.Val(), obj.Type()) - } - // Package-level named constant? - if v := prog.packageLevelValue(obj); v != nil { - return v.(*Const) - } - return NewConst(obj.Val(), obj.Type()) -} - -// VarValue returns the SSA Value that corresponds to a specific -// identifier denoting the source-level named variable obj. -// -// VarValue returns nil if a local variable was not found, perhaps -// because its package was not built, the debug information was not -// requested during SSA construction, or the value was optimized away. -// -// ref is the path to an ast.Ident (e.g. from PathEnclosingInterval), -// and that ident must resolve to obj. -// -// pkg is the package enclosing the reference. (A reference to a var -// always occurs within a function, so we need to know where to find it.) -// -// If the identifier is a field selector and its base expression is -// non-addressable, then VarValue returns the value of that field. -// For example: -// func f() struct {x int} -// f().x // VarValue(x) returns a *Field instruction of type int -// -// All other identifiers denote addressable locations (variables). -// For them, VarValue may return either the variable's address or its -// value, even when the expression is evaluated only for its value; the -// situation is reported by isAddr, the second component of the result. -// -// If !isAddr, the returned value is the one associated with the -// specific identifier. For example, -// var x int // VarValue(x) returns Const 0 here -// x = 1 // VarValue(x) returns Const 1 here -// -// It is not specified whether the value or the address is returned in -// any particular case, as it may depend upon optimizations performed -// during SSA code generation, such as registerization, constant -// folding, avoidance of materialization of subexpressions, etc. -// -func (prog *Program) VarValue(obj *types.Var, pkg *Package, ref []ast.Node) (value Value, isAddr bool) { - // All references to a var are local to some function, possibly init. - fn := EnclosingFunction(pkg, ref) - if fn == nil { - return // e.g. def of struct field; SSA not built? - } - - id := ref[0].(*ast.Ident) - - // Defining ident of a parameter? - if id.Pos() == obj.Pos() { - for _, param := range fn.Params { - if param.Object() == obj { - return param, false - } - } - } - - // Other ident? - for _, b := range fn.Blocks { - for _, instr := range b.Instrs { - if dr, ok := instr.(*DebugRef); ok { - if dr.Pos() == id.Pos() { - return dr.X, dr.IsAddr - } - } - } - } - - // Defining ident of package-level var? - if v := prog.packageLevelValue(obj); v != nil { - return v.(*Global), true - } - - return // e.g. debug info not requested, or var optimized away -} diff --git a/vendor/honnef.co/go/tools/ssa/ssa.go b/vendor/honnef.co/go/tools/ssa/ssa.go deleted file mode 100644 index aeddd65e581..00000000000 --- a/vendor/honnef.co/go/tools/ssa/ssa.go +++ /dev/null @@ -1,1745 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// This package defines a high-level intermediate representation for -// Go programs using static single-assignment (SSA) form. - -import ( - "fmt" - "go/ast" - "go/constant" - "go/token" - "go/types" - "sync" - - "golang.org/x/tools/go/types/typeutil" -) - -// A Program is a partial or complete Go program converted to SSA form. -type Program struct { - Fset *token.FileSet // position information for the files of this Program - imported map[string]*Package // all importable Packages, keyed by import path - packages map[*types.Package]*Package // all loaded Packages, keyed by object - mode BuilderMode // set of mode bits for SSA construction - MethodSets typeutil.MethodSetCache // cache of type-checker's method-sets - - methodsMu sync.Mutex // guards the following maps: - methodSets typeutil.Map // maps type to its concrete methodSet - runtimeTypes typeutil.Map // types for which rtypes are needed - canon typeutil.Map // type canonicalization map - bounds map[*types.Func]*Function // bounds for curried x.Method closures - thunks map[selectionKey]*Function // thunks for T.Method expressions -} - -// A Package is a single analyzed Go package containing Members for -// all package-level functions, variables, constants and types it -// declares. These may be accessed directly via Members, or via the -// type-specific accessor methods Func, Type, Var and Const. -// -// Members also contains entries for "init" (the synthetic package -// initializer) and "init#%d", the nth declared init function, -// and unspecified other things too. -// -type Package struct { - Prog *Program // the owning program - Pkg *types.Package // the corresponding go/types.Package - Members map[string]Member // all package members keyed by name (incl. init and init#%d) - values map[types.Object]Value // package members (incl. types and methods), keyed by object - init *Function // Func("init"); the package's init function - debug bool // include full debug info in this package - - // The following fields are set transiently, then cleared - // after building. - buildOnce sync.Once // ensures package building occurs once - ninit int32 // number of init functions - info *types.Info // package type information - files []*ast.File // package ASTs -} - -// A Member is a member of a Go package, implemented by *NamedConst, -// *Global, *Function, or *Type; they are created by package-level -// const, var, func and type declarations respectively. -// -type Member interface { - Name() string // declared name of the package member - String() string // package-qualified name of the package member - RelString(*types.Package) string // like String, but relative refs are unqualified - Object() types.Object // typechecker's object for this member, if any - Pos() token.Pos // position of member's declaration, if known - Type() types.Type // type of the package member - Token() token.Token // token.{VAR,FUNC,CONST,TYPE} - Package() *Package // the containing package -} - -// A Type is a Member of a Package representing a package-level named type. -type Type struct { - object *types.TypeName - pkg *Package -} - -// A NamedConst is a Member of a Package representing a package-level -// named constant. -// -// Pos() returns the position of the declaring ast.ValueSpec.Names[*] -// identifier. -// -// NB: a NamedConst is not a Value; it contains a constant Value, which -// it augments with the name and position of its 'const' declaration. -// -type NamedConst struct { - object *types.Const - Value *Const - pkg *Package -} - -// A Value is an SSA value that can be referenced by an instruction. -type Value interface { - // Name returns the name of this value, and determines how - // this Value appears when used as an operand of an - // Instruction. - // - // This is the same as the source name for Parameters, - // Builtins, Functions, FreeVars, Globals. - // For constants, it is a representation of the constant's value - // and type. For all other Values this is the name of the - // virtual register defined by the instruction. - // - // The name of an SSA Value is not semantically significant, - // and may not even be unique within a function. - Name() string - - // If this value is an Instruction, String returns its - // disassembled form; otherwise it returns unspecified - // human-readable information about the Value, such as its - // kind, name and type. - String() string - - // Type returns the type of this value. Many instructions - // (e.g. IndexAddr) change their behaviour depending on the - // types of their operands. - Type() types.Type - - // Parent returns the function to which this Value belongs. - // It returns nil for named Functions, Builtin, Const and Global. - Parent() *Function - - // Referrers returns the list of instructions that have this - // value as one of their operands; it may contain duplicates - // if an instruction has a repeated operand. - // - // Referrers actually returns a pointer through which the - // caller may perform mutations to the object's state. - // - // Referrers is currently only defined if Parent()!=nil, - // i.e. for the function-local values FreeVar, Parameter, - // Functions (iff anonymous) and all value-defining instructions. - // It returns nil for named Functions, Builtin, Const and Global. - // - // Instruction.Operands contains the inverse of this relation. - Referrers() *[]Instruction - - // Pos returns the location of the AST token most closely - // associated with the operation that gave rise to this value, - // or token.NoPos if it was not explicit in the source. - // - // For each ast.Node type, a particular token is designated as - // the closest location for the expression, e.g. the Lparen - // for an *ast.CallExpr. This permits a compact but - // approximate mapping from Values to source positions for use - // in diagnostic messages, for example. - // - // (Do not use this position to determine which Value - // corresponds to an ast.Expr; use Function.ValueForExpr - // instead. NB: it requires that the function was built with - // debug information.) - Pos() token.Pos -} - -// An Instruction is an SSA instruction that computes a new Value or -// has some effect. -// -// An Instruction that defines a value (e.g. BinOp) also implements -// the Value interface; an Instruction that only has an effect (e.g. Store) -// does not. -// -type Instruction interface { - // String returns the disassembled form of this value. - // - // Examples of Instructions that are Values: - // "x + y" (BinOp) - // "len([])" (Call) - // Note that the name of the Value is not printed. - // - // Examples of Instructions that are not Values: - // "return x" (Return) - // "*y = x" (Store) - // - // (The separation Value.Name() from Value.String() is useful - // for some analyses which distinguish the operation from the - // value it defines, e.g., 'y = local int' is both an allocation - // of memory 'local int' and a definition of a pointer y.) - String() string - - // Parent returns the function to which this instruction - // belongs. - Parent() *Function - - // Block returns the basic block to which this instruction - // belongs. - Block() *BasicBlock - - // setBlock sets the basic block to which this instruction belongs. - setBlock(*BasicBlock) - - // Operands returns the operands of this instruction: the - // set of Values it references. - // - // Specifically, it appends their addresses to rands, a - // user-provided slice, and returns the resulting slice, - // permitting avoidance of memory allocation. - // - // The operands are appended in undefined order, but the order - // is consistent for a given Instruction; the addresses are - // always non-nil but may point to a nil Value. Clients may - // store through the pointers, e.g. to effect a value - // renaming. - // - // Value.Referrers is a subset of the inverse of this - // relation. (Referrers are not tracked for all types of - // Values.) - Operands(rands []*Value) []*Value - - // Pos returns the location of the AST token most closely - // associated with the operation that gave rise to this - // instruction, or token.NoPos if it was not explicit in the - // source. - // - // For each ast.Node type, a particular token is designated as - // the closest location for the expression, e.g. the Go token - // for an *ast.GoStmt. This permits a compact but approximate - // mapping from Instructions to source positions for use in - // diagnostic messages, for example. - // - // (Do not use this position to determine which Instruction - // corresponds to an ast.Expr; see the notes for Value.Pos. - // This position may be used to determine which non-Value - // Instruction corresponds to some ast.Stmts, but not all: If - // and Jump instructions have no Pos(), for example.) - Pos() token.Pos -} - -// A Node is a node in the SSA value graph. Every concrete type that -// implements Node is also either a Value, an Instruction, or both. -// -// Node contains the methods common to Value and Instruction, plus the -// Operands and Referrers methods generalized to return nil for -// non-Instructions and non-Values, respectively. -// -// Node is provided to simplify SSA graph algorithms. Clients should -// use the more specific and informative Value or Instruction -// interfaces where appropriate. -// -type Node interface { - // Common methods: - String() string - Pos() token.Pos - Parent() *Function - - // Partial methods: - Operands(rands []*Value) []*Value // nil for non-Instructions - Referrers() *[]Instruction // nil for non-Values -} - -// Function represents the parameters, results, and code of a function -// or method. -// -// If Blocks is nil, this indicates an external function for which no -// Go source code is available. In this case, FreeVars and Locals -// are nil too. Clients performing whole-program analysis must -// handle external functions specially. -// -// Blocks contains the function's control-flow graph (CFG). -// Blocks[0] is the function entry point; block order is not otherwise -// semantically significant, though it may affect the readability of -// the disassembly. -// To iterate over the blocks in dominance order, use DomPreorder(). -// -// Recover is an optional second entry point to which control resumes -// after a recovered panic. The Recover block may contain only a return -// statement, preceded by a load of the function's named return -// parameters, if any. -// -// A nested function (Parent()!=nil) that refers to one or more -// lexically enclosing local variables ("free variables") has FreeVars. -// Such functions cannot be called directly but require a -// value created by MakeClosure which, via its Bindings, supplies -// values for these parameters. -// -// If the function is a method (Signature.Recv() != nil) then the first -// element of Params is the receiver parameter. -// -// A Go package may declare many functions called "init". -// For each one, Object().Name() returns "init" but Name() returns -// "init#1", etc, in declaration order. -// -// Pos() returns the declaring ast.FuncLit.Type.Func or the position -// of the ast.FuncDecl.Name, if the function was explicit in the -// source. Synthetic wrappers, for which Synthetic != "", may share -// the same position as the function they wrap. -// Syntax.Pos() always returns the position of the declaring "func" token. -// -// Type() returns the function's Signature. -// -type Function struct { - name string - object types.Object // a declared *types.Func or one of its wrappers - method *types.Selection // info about provenance of synthetic methods - Signature *types.Signature - pos token.Pos - - Synthetic string // provenance of synthetic function; "" for true source functions - syntax ast.Node // *ast.Func{Decl,Lit}; replaced with simple ast.Node after build, unless debug mode - parent *Function // enclosing function if anon; nil if global - Pkg *Package // enclosing package; nil for shared funcs (wrappers and error.Error) - Prog *Program // enclosing program - Params []*Parameter // function parameters; for methods, includes receiver - FreeVars []*FreeVar // free variables whose values must be supplied by closure - Locals []*Alloc // local variables of this function - Blocks []*BasicBlock // basic blocks of the function; nil => external - Recover *BasicBlock // optional; control transfers here after recovered panic - AnonFuncs []*Function // anonymous functions directly beneath this one - referrers []Instruction // referring instructions (iff Parent() != nil) - - // The following fields are set transiently during building, - // then cleared. - currentBlock *BasicBlock // where to emit code - objects map[types.Object]Value // addresses of local variables - namedResults []*Alloc // tuple of named results - targets *targets // linked stack of branch targets - lblocks map[*ast.Object]*lblock // labelled blocks -} - -// BasicBlock represents an SSA basic block. -// -// The final element of Instrs is always an explicit transfer of -// control (If, Jump, Return, or Panic). -// -// A block may contain no Instructions only if it is unreachable, -// i.e., Preds is nil. Empty blocks are typically pruned. -// -// BasicBlocks and their Preds/Succs relation form a (possibly cyclic) -// graph independent of the SSA Value graph: the control-flow graph or -// CFG. It is illegal for multiple edges to exist between the same -// pair of blocks. -// -// Each BasicBlock is also a node in the dominator tree of the CFG. -// The tree may be navigated using Idom()/Dominees() and queried using -// Dominates(). -// -// The order of Preds and Succs is significant (to Phi and If -// instructions, respectively). -// -type BasicBlock struct { - Index int // index of this block within Parent().Blocks - Comment string // optional label; no semantic significance - parent *Function // parent function - Instrs []Instruction // instructions in order - Preds, Succs []*BasicBlock // predecessors and successors - succs2 [2]*BasicBlock // initial space for Succs - dom domInfo // dominator tree info - gaps int // number of nil Instrs (transient) - rundefers int // number of rundefers (transient) -} - -// Pure values ---------------------------------------- - -// A FreeVar represents a free variable of the function to which it -// belongs. -// -// FreeVars are used to implement anonymous functions, whose free -// variables are lexically captured in a closure formed by -// MakeClosure. The value of such a free var is an Alloc or another -// FreeVar and is considered a potentially escaping heap address, with -// pointer type. -// -// FreeVars are also used to implement bound method closures. Such a -// free var represents the receiver value and may be of any type that -// has concrete methods. -// -// Pos() returns the position of the value that was captured, which -// belongs to an enclosing function. -// -type FreeVar struct { - name string - typ types.Type - pos token.Pos - parent *Function - referrers []Instruction - - // Transiently needed during building. - outer Value // the Value captured from the enclosing context. -} - -// A Parameter represents an input parameter of a function. -// -type Parameter struct { - name string - object types.Object // a *types.Var; nil for non-source locals - typ types.Type - pos token.Pos - parent *Function - referrers []Instruction -} - -// A Const represents the value of a constant expression. -// -// The underlying type of a constant may be any boolean, numeric, or -// string type. In addition, a Const may represent the nil value of -// any reference type---interface, map, channel, pointer, slice, or -// function---but not "untyped nil". -// -// All source-level constant expressions are represented by a Const -// of the same type and value. -// -// Value holds the exact value of the constant, independent of its -// Type(), using the same representation as package go/constant uses for -// constants, or nil for a typed nil value. -// -// Pos() returns token.NoPos. -// -// Example printed form: -// 42:int -// "hello":untyped string -// 3+4i:MyComplex -// -type Const struct { - typ types.Type - Value constant.Value -} - -// A Global is a named Value holding the address of a package-level -// variable. -// -// Pos() returns the position of the ast.ValueSpec.Names[*] -// identifier. -// -type Global struct { - name string - object types.Object // a *types.Var; may be nil for synthetics e.g. init$guard - typ types.Type - pos token.Pos - - Pkg *Package -} - -// A Builtin represents a specific use of a built-in function, e.g. len. -// -// Builtins are immutable values. Builtins do not have addresses. -// Builtins can only appear in CallCommon.Func. -// -// Name() indicates the function: one of the built-in functions from the -// Go spec (excluding "make" and "new") or one of these ssa-defined -// intrinsics: -// -// // wrapnilchk returns ptr if non-nil, panics otherwise. -// // (For use in indirection wrappers.) -// func ssa:wrapnilchk(ptr *T, recvType, methodName string) *T -// -// Object() returns a *types.Builtin for built-ins defined by the spec, -// nil for others. -// -// Type() returns a *types.Signature representing the effective -// signature of the built-in for this call. -// -type Builtin struct { - name string - sig *types.Signature -} - -// Value-defining instructions ---------------------------------------- - -// The Alloc instruction reserves space for a variable of the given type, -// zero-initializes it, and yields its address. -// -// Alloc values are always addresses, and have pointer types, so the -// type of the allocated variable is actually -// Type().Underlying().(*types.Pointer).Elem(). -// -// If Heap is false, Alloc allocates space in the function's -// activation record (frame); we refer to an Alloc(Heap=false) as a -// "local" alloc. Each local Alloc returns the same address each time -// it is executed within the same activation; the space is -// re-initialized to zero. -// -// If Heap is true, Alloc allocates space in the heap; we -// refer to an Alloc(Heap=true) as a "new" alloc. Each new Alloc -// returns a different address each time it is executed. -// -// When Alloc is applied to a channel, map or slice type, it returns -// the address of an uninitialized (nil) reference of that kind; store -// the result of MakeSlice, MakeMap or MakeChan in that location to -// instantiate these types. -// -// Pos() returns the ast.CompositeLit.Lbrace for a composite literal, -// or the ast.CallExpr.Rparen for a call to new() or for a call that -// allocates a varargs slice. -// -// Example printed form: -// t0 = local int -// t1 = new int -// -type Alloc struct { - register - Comment string - Heap bool - index int // dense numbering; for lifting -} - -var _ Instruction = (*Sigma)(nil) -var _ Value = (*Sigma)(nil) - -type Sigma struct { - register - X Value - Branch bool -} - -func (p *Sigma) Value() Value { - v := p.X - for { - sigma, ok := v.(*Sigma) - if !ok { - break - } - v = sigma - } - return v -} - -func (p *Sigma) String() string { - return fmt.Sprintf("σ [%s.%t]", relName(p.X, p), p.Branch) -} - -// The Phi instruction represents an SSA φ-node, which combines values -// that differ across incoming control-flow edges and yields a new -// value. Within a block, all φ-nodes must appear before all non-φ -// nodes. -// -// Pos() returns the position of the && or || for short-circuit -// control-flow joins, or that of the *Alloc for φ-nodes inserted -// during SSA renaming. -// -// Example printed form: -// t2 = phi [0: t0, 1: t1] -// -type Phi struct { - register - Comment string // a hint as to its purpose - Edges []Value // Edges[i] is value for Block().Preds[i] -} - -// The Call instruction represents a function or method call. -// -// The Call instruction yields the function result if there is exactly -// one. Otherwise it returns a tuple, the components of which are -// accessed via Extract. -// -// See CallCommon for generic function call documentation. -// -// Pos() returns the ast.CallExpr.Lparen, if explicit in the source. -// -// Example printed form: -// t2 = println(t0, t1) -// t4 = t3() -// t7 = invoke t5.Println(...t6) -// -type Call struct { - register - Call CallCommon -} - -// The BinOp instruction yields the result of binary operation X Op Y. -// -// Pos() returns the ast.BinaryExpr.OpPos, if explicit in the source. -// -// Example printed form: -// t1 = t0 + 1:int -// -type BinOp struct { - register - // One of: - // ADD SUB MUL QUO REM + - * / % - // AND OR XOR SHL SHR AND_NOT & | ^ << >> &^ - // EQL NEQ LSS LEQ GTR GEQ == != < <= < >= - Op token.Token - X, Y Value -} - -// The UnOp instruction yields the result of Op X. -// ARROW is channel receive. -// MUL is pointer indirection (load). -// XOR is bitwise complement. -// SUB is negation. -// NOT is logical negation. -// -// If CommaOk and Op=ARROW, the result is a 2-tuple of the value above -// and a boolean indicating the success of the receive. The -// components of the tuple are accessed using Extract. -// -// Pos() returns the ast.UnaryExpr.OpPos, if explicit in the source. -// For receive operations (ARROW) implicit in ranging over a channel, -// Pos() returns the ast.RangeStmt.For. -// For implicit memory loads (STAR), Pos() returns the position of the -// most closely associated source-level construct; the details are not -// specified. -// -// Example printed form: -// t0 = *x -// t2 = <-t1,ok -// -type UnOp struct { - register - Op token.Token // One of: NOT SUB ARROW MUL XOR ! - <- * ^ - X Value - CommaOk bool -} - -// The ChangeType instruction applies to X a value-preserving type -// change to Type(). -// -// Type changes are permitted: -// - between a named type and its underlying type. -// - between two named types of the same underlying type. -// - between (possibly named) pointers to identical base types. -// - from a bidirectional channel to a read- or write-channel, -// optionally adding/removing a name. -// -// This operation cannot fail dynamically. -// -// Pos() returns the ast.CallExpr.Lparen, if the instruction arose -// from an explicit conversion in the source. -// -// Example printed form: -// t1 = changetype *int <- IntPtr (t0) -// -type ChangeType struct { - register - X Value -} - -// The Convert instruction yields the conversion of value X to type -// Type(). One or both of those types is basic (but possibly named). -// -// A conversion may change the value and representation of its operand. -// Conversions are permitted: -// - between real numeric types. -// - between complex numeric types. -// - between string and []byte or []rune. -// - between pointers and unsafe.Pointer. -// - between unsafe.Pointer and uintptr. -// - from (Unicode) integer to (UTF-8) string. -// A conversion may imply a type name change also. -// -// This operation cannot fail dynamically. -// -// Conversions of untyped string/number/bool constants to a specific -// representation are eliminated during SSA construction. -// -// Pos() returns the ast.CallExpr.Lparen, if the instruction arose -// from an explicit conversion in the source. -// -// Example printed form: -// t1 = convert []byte <- string (t0) -// -type Convert struct { - register - X Value -} - -// ChangeInterface constructs a value of one interface type from a -// value of another interface type known to be assignable to it. -// This operation cannot fail. -// -// Pos() returns the ast.CallExpr.Lparen if the instruction arose from -// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the -// instruction arose from an explicit e.(T) operation; or token.NoPos -// otherwise. -// -// Example printed form: -// t1 = change interface interface{} <- I (t0) -// -type ChangeInterface struct { - register - X Value -} - -// MakeInterface constructs an instance of an interface type from a -// value of a concrete type. -// -// Use Program.MethodSets.MethodSet(X.Type()) to find the method-set -// of X, and Program.MethodValue(m) to find the implementation of a method. -// -// To construct the zero value of an interface type T, use: -// NewConst(constant.MakeNil(), T, pos) -// -// Pos() returns the ast.CallExpr.Lparen, if the instruction arose -// from an explicit conversion in the source. -// -// Example printed form: -// t1 = make interface{} <- int (42:int) -// t2 = make Stringer <- t0 -// -type MakeInterface struct { - register - X Value -} - -// The MakeClosure instruction yields a closure value whose code is -// Fn and whose free variables' values are supplied by Bindings. -// -// Type() returns a (possibly named) *types.Signature. -// -// Pos() returns the ast.FuncLit.Type.Func for a function literal -// closure or the ast.SelectorExpr.Sel for a bound method closure. -// -// Example printed form: -// t0 = make closure anon@1.2 [x y z] -// t1 = make closure bound$(main.I).add [i] -// -type MakeClosure struct { - register - Fn Value // always a *Function - Bindings []Value // values for each free variable in Fn.FreeVars -} - -// The MakeMap instruction creates a new hash-table-based map object -// and yields a value of kind map. -// -// Type() returns a (possibly named) *types.Map. -// -// Pos() returns the ast.CallExpr.Lparen, if created by make(map), or -// the ast.CompositeLit.Lbrack if created by a literal. -// -// Example printed form: -// t1 = make map[string]int t0 -// t1 = make StringIntMap t0 -// -type MakeMap struct { - register - Reserve Value // initial space reservation; nil => default -} - -// The MakeChan instruction creates a new channel object and yields a -// value of kind chan. -// -// Type() returns a (possibly named) *types.Chan. -// -// Pos() returns the ast.CallExpr.Lparen for the make(chan) that -// created it. -// -// Example printed form: -// t0 = make chan int 0 -// t0 = make IntChan 0 -// -type MakeChan struct { - register - Size Value // int; size of buffer; zero => synchronous. -} - -// The MakeSlice instruction yields a slice of length Len backed by a -// newly allocated array of length Cap. -// -// Both Len and Cap must be non-nil Values of integer type. -// -// (Alloc(types.Array) followed by Slice will not suffice because -// Alloc can only create arrays of constant length.) -// -// Type() returns a (possibly named) *types.Slice. -// -// Pos() returns the ast.CallExpr.Lparen for the make([]T) that -// created it. -// -// Example printed form: -// t1 = make []string 1:int t0 -// t1 = make StringSlice 1:int t0 -// -type MakeSlice struct { - register - Len Value - Cap Value -} - -// The Slice instruction yields a slice of an existing string, slice -// or *array X between optional integer bounds Low and High. -// -// Dynamically, this instruction panics if X evaluates to a nil *array -// pointer. -// -// Type() returns string if the type of X was string, otherwise a -// *types.Slice with the same element type as X. -// -// Pos() returns the ast.SliceExpr.Lbrack if created by a x[:] slice -// operation, the ast.CompositeLit.Lbrace if created by a literal, or -// NoPos if not explicit in the source (e.g. a variadic argument slice). -// -// Example printed form: -// t1 = slice t0[1:] -// -type Slice struct { - register - X Value // slice, string, or *array - Low, High, Max Value // each may be nil -} - -// The FieldAddr instruction yields the address of Field of *struct X. -// -// The field is identified by its index within the field list of the -// struct type of X. -// -// Dynamically, this instruction panics if X evaluates to a nil -// pointer. -// -// Type() returns a (possibly named) *types.Pointer. -// -// Pos() returns the position of the ast.SelectorExpr.Sel for the -// field, if explicit in the source. -// -// Example printed form: -// t1 = &t0.name [#1] -// -type FieldAddr struct { - register - X Value // *struct - Field int // field is X.Type().Underlying().(*types.Pointer).Elem().Underlying().(*types.Struct).Field(Field) -} - -// The Field instruction yields the Field of struct X. -// -// The field is identified by its index within the field list of the -// struct type of X; by using numeric indices we avoid ambiguity of -// package-local identifiers and permit compact representations. -// -// Pos() returns the position of the ast.SelectorExpr.Sel for the -// field, if explicit in the source. -// -// Example printed form: -// t1 = t0.name [#1] -// -type Field struct { - register - X Value // struct - Field int // index into X.Type().(*types.Struct).Fields -} - -// The IndexAddr instruction yields the address of the element at -// index Index of collection X. Index is an integer expression. -// -// The elements of maps and strings are not addressable; use Lookup or -// MapUpdate instead. -// -// Dynamically, this instruction panics if X evaluates to a nil *array -// pointer. -// -// Type() returns a (possibly named) *types.Pointer. -// -// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if -// explicit in the source. -// -// Example printed form: -// t2 = &t0[t1] -// -type IndexAddr struct { - register - X Value // slice or *array, - Index Value // numeric index -} - -// The Index instruction yields element Index of array X. -// -// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if -// explicit in the source. -// -// Example printed form: -// t2 = t0[t1] -// -type Index struct { - register - X Value // array - Index Value // integer index -} - -// The Lookup instruction yields element Index of collection X, a map -// or string. Index is an integer expression if X is a string or the -// appropriate key type if X is a map. -// -// If CommaOk, the result is a 2-tuple of the value above and a -// boolean indicating the result of a map membership test for the key. -// The components of the tuple are accessed using Extract. -// -// Pos() returns the ast.IndexExpr.Lbrack, if explicit in the source. -// -// Example printed form: -// t2 = t0[t1] -// t5 = t3[t4],ok -// -type Lookup struct { - register - X Value // string or map - Index Value // numeric or key-typed index - CommaOk bool // return a value,ok pair -} - -// SelectState is a helper for Select. -// It represents one goal state and its corresponding communication. -// -type SelectState struct { - Dir types.ChanDir // direction of case (SendOnly or RecvOnly) - Chan Value // channel to use (for send or receive) - Send Value // value to send (for send) - Pos token.Pos // position of token.ARROW - DebugNode ast.Node // ast.SendStmt or ast.UnaryExpr(<-) [debug mode] -} - -// The Select instruction tests whether (or blocks until) one -// of the specified sent or received states is entered. -// -// Let n be the number of States for which Dir==RECV and T_i (0<=i string iterator; false => map iterator. -} - -// The TypeAssert instruction tests whether interface value X has type -// AssertedType. -// -// If !CommaOk, on success it returns v, the result of the conversion -// (defined below); on failure it panics. -// -// If CommaOk: on success it returns a pair (v, true) where v is the -// result of the conversion; on failure it returns (z, false) where z -// is AssertedType's zero value. The components of the pair must be -// accessed using the Extract instruction. -// -// If AssertedType is a concrete type, TypeAssert checks whether the -// dynamic type in interface X is equal to it, and if so, the result -// of the conversion is a copy of the value in the interface. -// -// If AssertedType is an interface, TypeAssert checks whether the -// dynamic type of the interface is assignable to it, and if so, the -// result of the conversion is a copy of the interface value X. -// If AssertedType is a superinterface of X.Type(), the operation will -// fail iff the operand is nil. (Contrast with ChangeInterface, which -// performs no nil-check.) -// -// Type() reflects the actual type of the result, possibly a -// 2-types.Tuple; AssertedType is the asserted type. -// -// Pos() returns the ast.CallExpr.Lparen if the instruction arose from -// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the -// instruction arose from an explicit e.(T) operation; or the -// ast.CaseClause.Case if the instruction arose from a case of a -// type-switch statement. -// -// Example printed form: -// t1 = typeassert t0.(int) -// t3 = typeassert,ok t2.(T) -// -type TypeAssert struct { - register - X Value - AssertedType types.Type - CommaOk bool -} - -// The Extract instruction yields component Index of Tuple. -// -// This is used to access the results of instructions with multiple -// return values, such as Call, TypeAssert, Next, UnOp(ARROW) and -// IndexExpr(Map). -// -// Example printed form: -// t1 = extract t0 #1 -// -type Extract struct { - register - Tuple Value - Index int -} - -// Instructions executed for effect. They do not yield a value. -------------------- - -// The Jump instruction transfers control to the sole successor of its -// owning block. -// -// A Jump must be the last instruction of its containing BasicBlock. -// -// Pos() returns NoPos. -// -// Example printed form: -// jump done -// -type Jump struct { - anInstruction -} - -// The If instruction transfers control to one of the two successors -// of its owning block, depending on the boolean Cond: the first if -// true, the second if false. -// -// An If instruction must be the last instruction of its containing -// BasicBlock. -// -// Pos() returns NoPos. -// -// Example printed form: -// if t0 goto done else body -// -type If struct { - anInstruction - Cond Value -} - -// The Return instruction returns values and control back to the calling -// function. -// -// len(Results) is always equal to the number of results in the -// function's signature. -// -// If len(Results) > 1, Return returns a tuple value with the specified -// components which the caller must access using Extract instructions. -// -// There is no instruction to return a ready-made tuple like those -// returned by a "value,ok"-mode TypeAssert, Lookup or UnOp(ARROW) or -// a tail-call to a function with multiple result parameters. -// -// Return must be the last instruction of its containing BasicBlock. -// Such a block has no successors. -// -// Pos() returns the ast.ReturnStmt.Return, if explicit in the source. -// -// Example printed form: -// return -// return nil:I, 2:int -// -type Return struct { - anInstruction - Results []Value - pos token.Pos -} - -// The RunDefers instruction pops and invokes the entire stack of -// procedure calls pushed by Defer instructions in this function. -// -// It is legal to encounter multiple 'rundefers' instructions in a -// single control-flow path through a function; this is useful in -// the combined init() function, for example. -// -// Pos() returns NoPos. -// -// Example printed form: -// rundefers -// -type RunDefers struct { - anInstruction -} - -// The Panic instruction initiates a panic with value X. -// -// A Panic instruction must be the last instruction of its containing -// BasicBlock, which must have no successors. -// -// NB: 'go panic(x)' and 'defer panic(x)' do not use this instruction; -// they are treated as calls to a built-in function. -// -// Pos() returns the ast.CallExpr.Lparen if this panic was explicit -// in the source. -// -// Example printed form: -// panic t0 -// -type Panic struct { - anInstruction - X Value // an interface{} - pos token.Pos -} - -// The Go instruction creates a new goroutine and calls the specified -// function within it. -// -// See CallCommon for generic function call documentation. -// -// Pos() returns the ast.GoStmt.Go. -// -// Example printed form: -// go println(t0, t1) -// go t3() -// go invoke t5.Println(...t6) -// -type Go struct { - anInstruction - Call CallCommon - pos token.Pos -} - -// The Defer instruction pushes the specified call onto a stack of -// functions to be called by a RunDefers instruction or by a panic. -// -// See CallCommon for generic function call documentation. -// -// Pos() returns the ast.DeferStmt.Defer. -// -// Example printed form: -// defer println(t0, t1) -// defer t3() -// defer invoke t5.Println(...t6) -// -type Defer struct { - anInstruction - Call CallCommon - pos token.Pos -} - -// The Send instruction sends X on channel Chan. -// -// Pos() returns the ast.SendStmt.Arrow, if explicit in the source. -// -// Example printed form: -// send t0 <- t1 -// -type Send struct { - anInstruction - Chan, X Value - pos token.Pos -} - -// The Store instruction stores Val at address Addr. -// Stores can be of arbitrary types. -// -// Pos() returns the position of the source-level construct most closely -// associated with the memory store operation. -// Since implicit memory stores are numerous and varied and depend upon -// implementation choices, the details are not specified. -// -// Example printed form: -// *x = y -// -type Store struct { - anInstruction - Addr Value - Val Value - pos token.Pos -} - -// The BlankStore instruction is emitted for assignments to the blank -// identifier. -// -// BlankStore is a pseudo-instruction: it has no dynamic effect. -// -// Pos() returns NoPos. -// -// Example printed form: -// _ = t0 -// -type BlankStore struct { - anInstruction - Val Value -} - -// The MapUpdate instruction updates the association of Map[Key] to -// Value. -// -// Pos() returns the ast.KeyValueExpr.Colon or ast.IndexExpr.Lbrack, -// if explicit in the source. -// -// Example printed form: -// t0[t1] = t2 -// -type MapUpdate struct { - anInstruction - Map Value - Key Value - Value Value - pos token.Pos -} - -// A DebugRef instruction maps a source-level expression Expr to the -// SSA value X that represents the value (!IsAddr) or address (IsAddr) -// of that expression. -// -// DebugRef is a pseudo-instruction: it has no dynamic effect. -// -// Pos() returns Expr.Pos(), the start position of the source-level -// expression. This is not the same as the "designated" token as -// documented at Value.Pos(). e.g. CallExpr.Pos() does not return the -// position of the ("designated") Lparen token. -// -// If Expr is an *ast.Ident denoting a var or func, Object() returns -// the object; though this information can be obtained from the type -// checker, including it here greatly facilitates debugging. -// For non-Ident expressions, Object() returns nil. -// -// DebugRefs are generated only for functions built with debugging -// enabled; see Package.SetDebugMode() and the GlobalDebug builder -// mode flag. -// -// DebugRefs are not emitted for ast.Idents referring to constants or -// predeclared identifiers, since they are trivial and numerous. -// Nor are they emitted for ast.ParenExprs. -// -// (By representing these as instructions, rather than out-of-band, -// consistency is maintained during transformation passes by the -// ordinary SSA renaming machinery.) -// -// Example printed form: -// ; *ast.CallExpr @ 102:9 is t5 -// ; var x float64 @ 109:72 is x -// ; address of *ast.CompositeLit @ 216:10 is t0 -// -type DebugRef struct { - anInstruction - Expr ast.Expr // the referring expression (never *ast.ParenExpr) - object types.Object // the identity of the source var/func - IsAddr bool // Expr is addressable and X is the address it denotes - X Value // the value or address of Expr -} - -// Embeddable mix-ins and helpers for common parts of other structs. ----------- - -// register is a mix-in embedded by all SSA values that are also -// instructions, i.e. virtual registers, and provides a uniform -// implementation of most of the Value interface: Value.Name() is a -// numbered register (e.g. "t0"); the other methods are field accessors. -// -// Temporary names are automatically assigned to each register on -// completion of building a function in SSA form. -// -// Clients must not assume that the 'id' value (and the Name() derived -// from it) is unique within a function. As always in this API, -// semantics are determined only by identity; names exist only to -// facilitate debugging. -// -type register struct { - anInstruction - num int // "name" of virtual register, e.g. "t0". Not guaranteed unique. - typ types.Type // type of virtual register - pos token.Pos // position of source expression, or NoPos - referrers []Instruction -} - -// anInstruction is a mix-in embedded by all Instructions. -// It provides the implementations of the Block and setBlock methods. -type anInstruction struct { - block *BasicBlock // the basic block of this instruction -} - -// CallCommon is contained by Go, Defer and Call to hold the -// common parts of a function or method call. -// -// Each CallCommon exists in one of two modes, function call and -// interface method invocation, or "call" and "invoke" for short. -// -// 1. "call" mode: when Method is nil (!IsInvoke), a CallCommon -// represents an ordinary function call of the value in Value, -// which may be a *Builtin, a *Function or any other value of kind -// 'func'. -// -// Value may be one of: -// (a) a *Function, indicating a statically dispatched call -// to a package-level function, an anonymous function, or -// a method of a named type. -// (b) a *MakeClosure, indicating an immediately applied -// function literal with free variables. -// (c) a *Builtin, indicating a statically dispatched call -// to a built-in function. -// (d) any other value, indicating a dynamically dispatched -// function call. -// StaticCallee returns the identity of the callee in cases -// (a) and (b), nil otherwise. -// -// Args contains the arguments to the call. If Value is a method, -// Args[0] contains the receiver parameter. -// -// Example printed form: -// t2 = println(t0, t1) -// go t3() -// defer t5(...t6) -// -// 2. "invoke" mode: when Method is non-nil (IsInvoke), a CallCommon -// represents a dynamically dispatched call to an interface method. -// In this mode, Value is the interface value and Method is the -// interface's abstract method. Note: an abstract method may be -// shared by multiple interfaces due to embedding; Value.Type() -// provides the specific interface used for this call. -// -// Value is implicitly supplied to the concrete method implementation -// as the receiver parameter; in other words, Args[0] holds not the -// receiver but the first true argument. -// -// Example printed form: -// t1 = invoke t0.String() -// go invoke t3.Run(t2) -// defer invoke t4.Handle(...t5) -// -// For all calls to variadic functions (Signature().Variadic()), -// the last element of Args is a slice. -// -type CallCommon struct { - Value Value // receiver (invoke mode) or func value (call mode) - Method *types.Func // abstract method (invoke mode) - Args []Value // actual parameters (in static method call, includes receiver) - pos token.Pos // position of CallExpr.Lparen, iff explicit in source -} - -// IsInvoke returns true if this call has "invoke" (not "call") mode. -func (c *CallCommon) IsInvoke() bool { - return c.Method != nil -} - -func (c *CallCommon) Pos() token.Pos { return c.pos } - -// Signature returns the signature of the called function. -// -// For an "invoke"-mode call, the signature of the interface method is -// returned. -// -// In either "call" or "invoke" mode, if the callee is a method, its -// receiver is represented by sig.Recv, not sig.Params().At(0). -// -func (c *CallCommon) Signature() *types.Signature { - if c.Method != nil { - return c.Method.Type().(*types.Signature) - } - return c.Value.Type().Underlying().(*types.Signature) -} - -// StaticCallee returns the callee if this is a trivially static -// "call"-mode call to a function. -func (c *CallCommon) StaticCallee() *Function { - switch fn := c.Value.(type) { - case *Function: - return fn - case *MakeClosure: - return fn.Fn.(*Function) - } - return nil -} - -// Description returns a description of the mode of this call suitable -// for a user interface, e.g., "static method call". -func (c *CallCommon) Description() string { - switch fn := c.Value.(type) { - case *Builtin: - return "built-in function call" - case *MakeClosure: - return "static function closure call" - case *Function: - if fn.Signature.Recv() != nil { - return "static method call" - } - return "static function call" - } - if c.IsInvoke() { - return "dynamic method call" // ("invoke" mode) - } - return "dynamic function call" -} - -// The CallInstruction interface, implemented by *Go, *Defer and *Call, -// exposes the common parts of function-calling instructions, -// yet provides a way back to the Value defined by *Call alone. -// -type CallInstruction interface { - Instruction - Common() *CallCommon // returns the common parts of the call - Value() *Call // returns the result value of the call (*Call) or nil (*Go, *Defer) -} - -func (s *Call) Common() *CallCommon { return &s.Call } -func (s *Defer) Common() *CallCommon { return &s.Call } -func (s *Go) Common() *CallCommon { return &s.Call } - -func (s *Call) Value() *Call { return s } -func (s *Defer) Value() *Call { return nil } -func (s *Go) Value() *Call { return nil } - -func (v *Builtin) Type() types.Type { return v.sig } -func (v *Builtin) Name() string { return v.name } -func (*Builtin) Referrers() *[]Instruction { return nil } -func (v *Builtin) Pos() token.Pos { return token.NoPos } -func (v *Builtin) Object() types.Object { return types.Universe.Lookup(v.name) } -func (v *Builtin) Parent() *Function { return nil } - -func (v *FreeVar) Type() types.Type { return v.typ } -func (v *FreeVar) Name() string { return v.name } -func (v *FreeVar) Referrers() *[]Instruction { return &v.referrers } -func (v *FreeVar) Pos() token.Pos { return v.pos } -func (v *FreeVar) Parent() *Function { return v.parent } - -func (v *Global) Type() types.Type { return v.typ } -func (v *Global) Name() string { return v.name } -func (v *Global) Parent() *Function { return nil } -func (v *Global) Pos() token.Pos { return v.pos } -func (v *Global) Referrers() *[]Instruction { return nil } -func (v *Global) Token() token.Token { return token.VAR } -func (v *Global) Object() types.Object { return v.object } -func (v *Global) String() string { return v.RelString(nil) } -func (v *Global) Package() *Package { return v.Pkg } -func (v *Global) RelString(from *types.Package) string { return relString(v, from) } - -func (v *Function) Name() string { return v.name } -func (v *Function) Type() types.Type { return v.Signature } -func (v *Function) Pos() token.Pos { return v.pos } -func (v *Function) Token() token.Token { return token.FUNC } -func (v *Function) Object() types.Object { return v.object } -func (v *Function) String() string { return v.RelString(nil) } -func (v *Function) Package() *Package { return v.Pkg } -func (v *Function) Parent() *Function { return v.parent } -func (v *Function) Referrers() *[]Instruction { - if v.parent != nil { - return &v.referrers - } - return nil -} - -func (v *Parameter) Type() types.Type { return v.typ } -func (v *Parameter) Name() string { return v.name } -func (v *Parameter) Object() types.Object { return v.object } -func (v *Parameter) Referrers() *[]Instruction { return &v.referrers } -func (v *Parameter) Pos() token.Pos { return v.pos } -func (v *Parameter) Parent() *Function { return v.parent } - -func (v *Alloc) Type() types.Type { return v.typ } -func (v *Alloc) Referrers() *[]Instruction { return &v.referrers } -func (v *Alloc) Pos() token.Pos { return v.pos } - -func (v *register) Type() types.Type { return v.typ } -func (v *register) setType(typ types.Type) { v.typ = typ } -func (v *register) Name() string { return fmt.Sprintf("t%d", v.num) } -func (v *register) setNum(num int) { v.num = num } -func (v *register) Referrers() *[]Instruction { return &v.referrers } -func (v *register) Pos() token.Pos { return v.pos } -func (v *register) setPos(pos token.Pos) { v.pos = pos } - -func (v *anInstruction) Parent() *Function { return v.block.parent } -func (v *anInstruction) Block() *BasicBlock { return v.block } -func (v *anInstruction) setBlock(block *BasicBlock) { v.block = block } -func (v *anInstruction) Referrers() *[]Instruction { return nil } - -func (t *Type) Name() string { return t.object.Name() } -func (t *Type) Pos() token.Pos { return t.object.Pos() } -func (t *Type) Type() types.Type { return t.object.Type() } -func (t *Type) Token() token.Token { return token.TYPE } -func (t *Type) Object() types.Object { return t.object } -func (t *Type) String() string { return t.RelString(nil) } -func (t *Type) Package() *Package { return t.pkg } -func (t *Type) RelString(from *types.Package) string { return relString(t, from) } - -func (c *NamedConst) Name() string { return c.object.Name() } -func (c *NamedConst) Pos() token.Pos { return c.object.Pos() } -func (c *NamedConst) String() string { return c.RelString(nil) } -func (c *NamedConst) Type() types.Type { return c.object.Type() } -func (c *NamedConst) Token() token.Token { return token.CONST } -func (c *NamedConst) Object() types.Object { return c.object } -func (c *NamedConst) Package() *Package { return c.pkg } -func (c *NamedConst) RelString(from *types.Package) string { return relString(c, from) } - -// Func returns the package-level function of the specified name, -// or nil if not found. -// -func (p *Package) Func(name string) (f *Function) { - f, _ = p.Members[name].(*Function) - return -} - -// Var returns the package-level variable of the specified name, -// or nil if not found. -// -func (p *Package) Var(name string) (g *Global) { - g, _ = p.Members[name].(*Global) - return -} - -// Const returns the package-level constant of the specified name, -// or nil if not found. -// -func (p *Package) Const(name string) (c *NamedConst) { - c, _ = p.Members[name].(*NamedConst) - return -} - -// Type returns the package-level type of the specified name, -// or nil if not found. -// -func (p *Package) Type(name string) (t *Type) { - t, _ = p.Members[name].(*Type) - return -} - -func (v *Call) Pos() token.Pos { return v.Call.pos } -func (s *Defer) Pos() token.Pos { return s.pos } -func (s *Go) Pos() token.Pos { return s.pos } -func (s *MapUpdate) Pos() token.Pos { return s.pos } -func (s *Panic) Pos() token.Pos { return s.pos } -func (s *Return) Pos() token.Pos { return s.pos } -func (s *Send) Pos() token.Pos { return s.pos } -func (s *Store) Pos() token.Pos { return s.pos } -func (s *BlankStore) Pos() token.Pos { return token.NoPos } -func (s *If) Pos() token.Pos { return token.NoPos } -func (s *Jump) Pos() token.Pos { return token.NoPos } -func (s *RunDefers) Pos() token.Pos { return token.NoPos } -func (s *DebugRef) Pos() token.Pos { return s.Expr.Pos() } - -// Operands. - -func (v *Alloc) Operands(rands []*Value) []*Value { - return rands -} - -func (v *BinOp) Operands(rands []*Value) []*Value { - return append(rands, &v.X, &v.Y) -} - -func (c *CallCommon) Operands(rands []*Value) []*Value { - rands = append(rands, &c.Value) - for i := range c.Args { - rands = append(rands, &c.Args[i]) - } - return rands -} - -func (s *Go) Operands(rands []*Value) []*Value { - return s.Call.Operands(rands) -} - -func (s *Call) Operands(rands []*Value) []*Value { - return s.Call.Operands(rands) -} - -func (s *Defer) Operands(rands []*Value) []*Value { - return s.Call.Operands(rands) -} - -func (v *ChangeInterface) Operands(rands []*Value) []*Value { - return append(rands, &v.X) -} - -func (v *ChangeType) Operands(rands []*Value) []*Value { - return append(rands, &v.X) -} - -func (v *Convert) Operands(rands []*Value) []*Value { - return append(rands, &v.X) -} - -func (s *DebugRef) Operands(rands []*Value) []*Value { - return append(rands, &s.X) -} - -func (v *Extract) Operands(rands []*Value) []*Value { - return append(rands, &v.Tuple) -} - -func (v *Field) Operands(rands []*Value) []*Value { - return append(rands, &v.X) -} - -func (v *FieldAddr) Operands(rands []*Value) []*Value { - return append(rands, &v.X) -} - -func (s *If) Operands(rands []*Value) []*Value { - return append(rands, &s.Cond) -} - -func (v *Index) Operands(rands []*Value) []*Value { - return append(rands, &v.X, &v.Index) -} - -func (v *IndexAddr) Operands(rands []*Value) []*Value { - return append(rands, &v.X, &v.Index) -} - -func (*Jump) Operands(rands []*Value) []*Value { - return rands -} - -func (v *Lookup) Operands(rands []*Value) []*Value { - return append(rands, &v.X, &v.Index) -} - -func (v *MakeChan) Operands(rands []*Value) []*Value { - return append(rands, &v.Size) -} - -func (v *MakeClosure) Operands(rands []*Value) []*Value { - rands = append(rands, &v.Fn) - for i := range v.Bindings { - rands = append(rands, &v.Bindings[i]) - } - return rands -} - -func (v *MakeInterface) Operands(rands []*Value) []*Value { - return append(rands, &v.X) -} - -func (v *MakeMap) Operands(rands []*Value) []*Value { - return append(rands, &v.Reserve) -} - -func (v *MakeSlice) Operands(rands []*Value) []*Value { - return append(rands, &v.Len, &v.Cap) -} - -func (v *MapUpdate) Operands(rands []*Value) []*Value { - return append(rands, &v.Map, &v.Key, &v.Value) -} - -func (v *Next) Operands(rands []*Value) []*Value { - return append(rands, &v.Iter) -} - -func (s *Panic) Operands(rands []*Value) []*Value { - return append(rands, &s.X) -} - -func (v *Sigma) Operands(rands []*Value) []*Value { - return append(rands, &v.X) -} - -func (v *Phi) Operands(rands []*Value) []*Value { - for i := range v.Edges { - rands = append(rands, &v.Edges[i]) - } - return rands -} - -func (v *Range) Operands(rands []*Value) []*Value { - return append(rands, &v.X) -} - -func (s *Return) Operands(rands []*Value) []*Value { - for i := range s.Results { - rands = append(rands, &s.Results[i]) - } - return rands -} - -func (*RunDefers) Operands(rands []*Value) []*Value { - return rands -} - -func (v *Select) Operands(rands []*Value) []*Value { - for i := range v.States { - rands = append(rands, &v.States[i].Chan, &v.States[i].Send) - } - return rands -} - -func (s *Send) Operands(rands []*Value) []*Value { - return append(rands, &s.Chan, &s.X) -} - -func (v *Slice) Operands(rands []*Value) []*Value { - return append(rands, &v.X, &v.Low, &v.High, &v.Max) -} - -func (s *Store) Operands(rands []*Value) []*Value { - return append(rands, &s.Addr, &s.Val) -} - -func (s *BlankStore) Operands(rands []*Value) []*Value { - return append(rands, &s.Val) -} - -func (v *TypeAssert) Operands(rands []*Value) []*Value { - return append(rands, &v.X) -} - -func (v *UnOp) Operands(rands []*Value) []*Value { - return append(rands, &v.X) -} - -// Non-Instruction Values: -func (v *Builtin) Operands(rands []*Value) []*Value { return rands } -func (v *FreeVar) Operands(rands []*Value) []*Value { return rands } -func (v *Const) Operands(rands []*Value) []*Value { return rands } -func (v *Function) Operands(rands []*Value) []*Value { return rands } -func (v *Global) Operands(rands []*Value) []*Value { return rands } -func (v *Parameter) Operands(rands []*Value) []*Value { return rands } diff --git a/vendor/honnef.co/go/tools/ssa/staticcheck.conf b/vendor/honnef.co/go/tools/ssa/staticcheck.conf deleted file mode 100644 index d7b38bc3563..00000000000 --- a/vendor/honnef.co/go/tools/ssa/staticcheck.conf +++ /dev/null @@ -1,3 +0,0 @@ -# ssa/... is mostly imported from upstream and we don't want to -# deviate from it too much, hence disabling SA1019 -checks = ["inherit", "-SA1019"] diff --git a/vendor/honnef.co/go/tools/ssa/testmain.go b/vendor/honnef.co/go/tools/ssa/testmain.go deleted file mode 100644 index 8ec15ba5051..00000000000 --- a/vendor/honnef.co/go/tools/ssa/testmain.go +++ /dev/null @@ -1,271 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// CreateTestMainPackage synthesizes a main package that runs all the -// tests of the supplied packages. -// It is closely coupled to $GOROOT/src/cmd/go/test.go and $GOROOT/src/testing. -// -// TODO(adonovan): throws this all away now that x/tools/go/packages -// provides access to the actual synthetic test main files. - -import ( - "bytes" - "fmt" - "go/ast" - "go/parser" - "go/types" - "log" - "os" - "strings" - "text/template" -) - -// FindTests returns the Test, Benchmark, and Example functions -// (as defined by "go test") defined in the specified package, -// and its TestMain function, if any. -// -// Deprecated: use x/tools/go/packages to access synthetic testmain packages. -func FindTests(pkg *Package) (tests, benchmarks, examples []*Function, main *Function) { - prog := pkg.Prog - - // The first two of these may be nil: if the program doesn't import "testing", - // it can't contain any tests, but it may yet contain Examples. - var testSig *types.Signature // func(*testing.T) - var benchmarkSig *types.Signature // func(*testing.B) - var exampleSig = types.NewSignature(nil, nil, nil, false) // func() - - // Obtain the types from the parameters of testing.MainStart. - if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil { - mainStart := testingPkg.Func("MainStart") - params := mainStart.Signature.Params() - testSig = funcField(params.At(1).Type()) - benchmarkSig = funcField(params.At(2).Type()) - - // Does the package define this function? - // func TestMain(*testing.M) - if f := pkg.Func("TestMain"); f != nil { - sig := f.Type().(*types.Signature) - starM := mainStart.Signature.Results().At(0).Type() // *testing.M - if sig.Results().Len() == 0 && - sig.Params().Len() == 1 && - types.Identical(sig.Params().At(0).Type(), starM) { - main = f - } - } - } - - // TODO(adonovan): use a stable order, e.g. lexical. - for _, mem := range pkg.Members { - if f, ok := mem.(*Function); ok && - ast.IsExported(f.Name()) && - strings.HasSuffix(prog.Fset.Position(f.Pos()).Filename, "_test.go") { - - switch { - case testSig != nil && isTestSig(f, "Test", testSig): - tests = append(tests, f) - case benchmarkSig != nil && isTestSig(f, "Benchmark", benchmarkSig): - benchmarks = append(benchmarks, f) - case isTestSig(f, "Example", exampleSig): - examples = append(examples, f) - default: - continue - } - } - } - return -} - -// Like isTest, but checks the signature too. -func isTestSig(f *Function, prefix string, sig *types.Signature) bool { - return isTest(f.Name(), prefix) && types.Identical(f.Signature, sig) -} - -// Given the type of one of the three slice parameters of testing.Main, -// returns the function type. -func funcField(slice types.Type) *types.Signature { - return slice.(*types.Slice).Elem().Underlying().(*types.Struct).Field(1).Type().(*types.Signature) -} - -// isTest tells whether name looks like a test (or benchmark, according to prefix). -// It is a Test (say) if there is a character after Test that is not a lower-case letter. -// We don't want TesticularCancer. -// Plundered from $GOROOT/src/cmd/go/test.go -func isTest(name, prefix string) bool { - if !strings.HasPrefix(name, prefix) { - return false - } - if len(name) == len(prefix) { // "Test" is ok - return true - } - return ast.IsExported(name[len(prefix):]) -} - -// CreateTestMainPackage creates and returns a synthetic "testmain" -// package for the specified package if it defines tests, benchmarks or -// executable examples, or nil otherwise. The new package is named -// "main" and provides a function named "main" that runs the tests, -// similar to the one that would be created by the 'go test' tool. -// -// Subsequent calls to prog.AllPackages include the new package. -// The package pkg must belong to the program prog. -// -// Deprecated: use x/tools/go/packages to access synthetic testmain packages. -func (prog *Program) CreateTestMainPackage(pkg *Package) *Package { - if pkg.Prog != prog { - log.Fatal("Package does not belong to Program") - } - - // Template data - var data struct { - Pkg *Package - Tests, Benchmarks, Examples []*Function - Main *Function - Go18 bool - } - data.Pkg = pkg - - // Enumerate tests. - data.Tests, data.Benchmarks, data.Examples, data.Main = FindTests(pkg) - if data.Main == nil && - data.Tests == nil && data.Benchmarks == nil && data.Examples == nil { - return nil - } - - // Synthesize source for testmain package. - path := pkg.Pkg.Path() + "$testmain" - tmpl := testmainTmpl - if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil { - // In Go 1.8, testing.MainStart's first argument is an interface, not a func. - data.Go18 = types.IsInterface(testingPkg.Func("MainStart").Signature.Params().At(0).Type()) - } else { - // The program does not import "testing", but FindTests - // returned non-nil, which must mean there were Examples - // but no Test, Benchmark, or TestMain functions. - - // We'll simply call them from testmain.main; this will - // ensure they don't panic, but will not check any - // "Output:" comments. - // (We should not execute an Example that has no - // "Output:" comment, but it's impossible to tell here.) - tmpl = examplesOnlyTmpl - } - var buf bytes.Buffer - if err := tmpl.Execute(&buf, data); err != nil { - log.Fatalf("internal error expanding template for %s: %v", path, err) - } - if false { // debugging - fmt.Fprintln(os.Stderr, buf.String()) - } - - // Parse and type-check the testmain package. - f, err := parser.ParseFile(prog.Fset, path+".go", &buf, parser.Mode(0)) - if err != nil { - log.Fatalf("internal error parsing %s: %v", path, err) - } - conf := types.Config{ - DisableUnusedImportCheck: true, - Importer: importer{pkg}, - } - files := []*ast.File{f} - info := &types.Info{ - Types: make(map[ast.Expr]types.TypeAndValue), - Defs: make(map[*ast.Ident]types.Object), - Uses: make(map[*ast.Ident]types.Object), - Implicits: make(map[ast.Node]types.Object), - Scopes: make(map[ast.Node]*types.Scope), - Selections: make(map[*ast.SelectorExpr]*types.Selection), - } - testmainPkg, err := conf.Check(path, prog.Fset, files, info) - if err != nil { - log.Fatalf("internal error type-checking %s: %v", path, err) - } - - // Create and build SSA code. - testmain := prog.CreatePackage(testmainPkg, files, info, false) - testmain.SetDebugMode(false) - testmain.Build() - testmain.Func("main").Synthetic = "test main function" - testmain.Func("init").Synthetic = "package initializer" - return testmain -} - -// An implementation of types.Importer for an already loaded SSA program. -type importer struct { - pkg *Package // package under test; may be non-importable -} - -func (imp importer) Import(path string) (*types.Package, error) { - if p := imp.pkg.Prog.ImportedPackage(path); p != nil { - return p.Pkg, nil - } - if path == imp.pkg.Pkg.Path() { - return imp.pkg.Pkg, nil - } - return nil, fmt.Errorf("not found") // can't happen -} - -var testmainTmpl = template.Must(template.New("testmain").Parse(` -package main - -import "io" -import "os" -import "testing" -import p {{printf "%q" .Pkg.Pkg.Path}} - -{{if .Go18}} -type deps struct{} - -func (deps) ImportPath() string { return "" } -func (deps) MatchString(pat, str string) (bool, error) { return true, nil } -func (deps) StartCPUProfile(io.Writer) error { return nil } -func (deps) StartTestLog(io.Writer) {} -func (deps) StopCPUProfile() {} -func (deps) StopTestLog() error { return nil } -func (deps) WriteHeapProfile(io.Writer) error { return nil } -func (deps) WriteProfileTo(string, io.Writer, int) error { return nil } - -var match deps -{{else}} -func match(_, _ string) (bool, error) { return true, nil } -{{end}} - -func main() { - tests := []testing.InternalTest{ -{{range .Tests}} - { {{printf "%q" .Name}}, p.{{.Name}} }, -{{end}} - } - benchmarks := []testing.InternalBenchmark{ -{{range .Benchmarks}} - { {{printf "%q" .Name}}, p.{{.Name}} }, -{{end}} - } - examples := []testing.InternalExample{ -{{range .Examples}} - {Name: {{printf "%q" .Name}}, F: p.{{.Name}}}, -{{end}} - } - m := testing.MainStart(match, tests, benchmarks, examples) -{{with .Main}} - p.{{.Name}}(m) -{{else}} - os.Exit(m.Run()) -{{end}} -} - -`)) - -var examplesOnlyTmpl = template.Must(template.New("examples").Parse(` -package main - -import p {{printf "%q" .Pkg.Pkg.Path}} - -func main() { -{{range .Examples}} - p.{{.Name}}() -{{end}} -} -`)) diff --git a/vendor/honnef.co/go/tools/ssa/util.go b/vendor/honnef.co/go/tools/ssa/util.go deleted file mode 100644 index ddb11846096..00000000000 --- a/vendor/honnef.co/go/tools/ssa/util.go +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// This file defines a number of miscellaneous utility functions. - -import ( - "fmt" - "go/ast" - "go/token" - "go/types" - "io" - "os" - - "golang.org/x/tools/go/ast/astutil" -) - -//// AST utilities - -func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) } - -// isBlankIdent returns true iff e is an Ident with name "_". -// They have no associated types.Object, and thus no type. -// -func isBlankIdent(e ast.Expr) bool { - id, ok := e.(*ast.Ident) - return ok && id.Name == "_" -} - -//// Type utilities. Some of these belong in go/types. - -// isPointer returns true for types whose underlying type is a pointer. -func isPointer(typ types.Type) bool { - _, ok := typ.Underlying().(*types.Pointer) - return ok -} - -func isInterface(T types.Type) bool { return types.IsInterface(T) } - -// deref returns a pointer's element type; otherwise it returns typ. -func deref(typ types.Type) types.Type { - if p, ok := typ.Underlying().(*types.Pointer); ok { - return p.Elem() - } - return typ -} - -// recvType returns the receiver type of method obj. -func recvType(obj *types.Func) types.Type { - return obj.Type().(*types.Signature).Recv().Type() -} - -// DefaultType returns the default "typed" type for an "untyped" type; -// it returns the incoming type for all other types. The default type -// for untyped nil is untyped nil. -// -// Exported to ssa/interp. -// -// TODO(adonovan): use go/types.DefaultType after 1.8. -// -func DefaultType(typ types.Type) types.Type { - if t, ok := typ.(*types.Basic); ok { - k := t.Kind() - switch k { - case types.UntypedBool: - k = types.Bool - case types.UntypedInt: - k = types.Int - case types.UntypedRune: - k = types.Rune - case types.UntypedFloat: - k = types.Float64 - case types.UntypedComplex: - k = types.Complex128 - case types.UntypedString: - k = types.String - } - typ = types.Typ[k] - } - return typ -} - -// logStack prints the formatted "start" message to stderr and -// returns a closure that prints the corresponding "end" message. -// Call using 'defer logStack(...)()' to show builder stack on panic. -// Don't forget trailing parens! -// -func logStack(format string, args ...interface{}) func() { - msg := fmt.Sprintf(format, args...) - io.WriteString(os.Stderr, msg) - io.WriteString(os.Stderr, "\n") - return func() { - io.WriteString(os.Stderr, msg) - io.WriteString(os.Stderr, " end\n") - } -} - -// newVar creates a 'var' for use in a types.Tuple. -func newVar(name string, typ types.Type) *types.Var { - return types.NewParam(token.NoPos, nil, name, typ) -} - -// anonVar creates an anonymous 'var' for use in a types.Tuple. -func anonVar(typ types.Type) *types.Var { - return newVar("", typ) -} - -var lenResults = types.NewTuple(anonVar(tInt)) - -// makeLen returns the len builtin specialized to type func(T)int. -func makeLen(T types.Type) *Builtin { - lenParams := types.NewTuple(anonVar(T)) - return &Builtin{ - name: "len", - sig: types.NewSignature(nil, lenParams, lenResults, false), - } -} diff --git a/vendor/honnef.co/go/tools/ssa/wrappers.go b/vendor/honnef.co/go/tools/ssa/wrappers.go deleted file mode 100644 index a4ae71d8cfc..00000000000 --- a/vendor/honnef.co/go/tools/ssa/wrappers.go +++ /dev/null @@ -1,290 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ssa - -// This file defines synthesis of Functions that delegate to declared -// methods; they come in three kinds: -// -// (1) wrappers: methods that wrap declared methods, performing -// implicit pointer indirections and embedded field selections. -// -// (2) thunks: funcs that wrap declared methods. Like wrappers, -// thunks perform indirections and field selections. The thunk's -// first parameter is used as the receiver for the method call. -// -// (3) bounds: funcs that wrap declared methods. The bound's sole -// free variable, supplied by a closure, is used as the receiver -// for the method call. No indirections or field selections are -// performed since they can be done before the call. - -import ( - "fmt" - - "go/types" -) - -// -- wrappers ----------------------------------------------------------- - -// makeWrapper returns a synthetic method that delegates to the -// declared method denoted by meth.Obj(), first performing any -// necessary pointer indirections or field selections implied by meth. -// -// The resulting method's receiver type is meth.Recv(). -// -// This function is versatile but quite subtle! Consider the -// following axes of variation when making changes: -// - optional receiver indirection -// - optional implicit field selections -// - meth.Obj() may denote a concrete or an interface method -// - the result may be a thunk or a wrapper. -// -// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu) -// -func makeWrapper(prog *Program, sel *types.Selection) *Function { - obj := sel.Obj().(*types.Func) // the declared function - sig := sel.Type().(*types.Signature) // type of this wrapper - - var recv *types.Var // wrapper's receiver or thunk's params[0] - name := obj.Name() - var description string - var start int // first regular param - if sel.Kind() == types.MethodExpr { - name += "$thunk" - description = "thunk" - recv = sig.Params().At(0) - start = 1 - } else { - description = "wrapper" - recv = sig.Recv() - } - - description = fmt.Sprintf("%s for %s", description, sel.Obj()) - if prog.mode&LogSource != 0 { - defer logStack("make %s to (%s)", description, recv.Type())() - } - fn := &Function{ - name: name, - method: sel, - object: obj, - Signature: sig, - Synthetic: description, - Prog: prog, - pos: obj.Pos(), - } - fn.startBody() - fn.addSpilledParam(recv) - createParams(fn, start) - - indices := sel.Index() - - var v Value = fn.Locals[0] // spilled receiver - if isPointer(sel.Recv()) { - v = emitLoad(fn, v) - - // For simple indirection wrappers, perform an informative nil-check: - // "value method (T).f called using nil *T pointer" - if len(indices) == 1 && !isPointer(recvType(obj)) { - var c Call - c.Call.Value = &Builtin{ - name: "ssa:wrapnilchk", - sig: types.NewSignature(nil, - types.NewTuple(anonVar(sel.Recv()), anonVar(tString), anonVar(tString)), - types.NewTuple(anonVar(sel.Recv())), false), - } - c.Call.Args = []Value{ - v, - stringConst(deref(sel.Recv()).String()), - stringConst(sel.Obj().Name()), - } - c.setType(v.Type()) - v = fn.emit(&c) - } - } - - // Invariant: v is a pointer, either - // value of *A receiver param, or - // address of A spilled receiver. - - // We use pointer arithmetic (FieldAddr possibly followed by - // Load) in preference to value extraction (Field possibly - // preceded by Load). - - v = emitImplicitSelections(fn, v, indices[:len(indices)-1]) - - // Invariant: v is a pointer, either - // value of implicit *C field, or - // address of implicit C field. - - var c Call - if r := recvType(obj); !isInterface(r) { // concrete method - if !isPointer(r) { - v = emitLoad(fn, v) - } - c.Call.Value = prog.declaredFunc(obj) - c.Call.Args = append(c.Call.Args, v) - } else { - c.Call.Method = obj - c.Call.Value = emitLoad(fn, v) - } - for _, arg := range fn.Params[1:] { - c.Call.Args = append(c.Call.Args, arg) - } - emitTailCall(fn, &c) - fn.finishBody() - return fn -} - -// createParams creates parameters for wrapper method fn based on its -// Signature.Params, which do not include the receiver. -// start is the index of the first regular parameter to use. -// -func createParams(fn *Function, start int) { - tparams := fn.Signature.Params() - for i, n := start, tparams.Len(); i < n; i++ { - fn.addParamObj(tparams.At(i)) - } -} - -// -- bounds ----------------------------------------------------------- - -// makeBound returns a bound method wrapper (or "bound"), a synthetic -// function that delegates to a concrete or interface method denoted -// by obj. The resulting function has no receiver, but has one free -// variable which will be used as the method's receiver in the -// tail-call. -// -// Use MakeClosure with such a wrapper to construct a bound method -// closure. e.g.: -// -// type T int or: type T interface { meth() } -// func (t T) meth() -// var t T -// f := t.meth -// f() // calls t.meth() -// -// f is a closure of a synthetic wrapper defined as if by: -// -// f := func() { return t.meth() } -// -// Unlike makeWrapper, makeBound need perform no indirection or field -// selections because that can be done before the closure is -// constructed. -// -// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu) -// -func makeBound(prog *Program, obj *types.Func) *Function { - prog.methodsMu.Lock() - defer prog.methodsMu.Unlock() - fn, ok := prog.bounds[obj] - if !ok { - description := fmt.Sprintf("bound method wrapper for %s", obj) - if prog.mode&LogSource != 0 { - defer logStack("%s", description)() - } - fn = &Function{ - name: obj.Name() + "$bound", - object: obj, - Signature: changeRecv(obj.Type().(*types.Signature), nil), // drop receiver - Synthetic: description, - Prog: prog, - pos: obj.Pos(), - } - - fv := &FreeVar{name: "recv", typ: recvType(obj), parent: fn} - fn.FreeVars = []*FreeVar{fv} - fn.startBody() - createParams(fn, 0) - var c Call - - if !isInterface(recvType(obj)) { // concrete - c.Call.Value = prog.declaredFunc(obj) - c.Call.Args = []Value{fv} - } else { - c.Call.Value = fv - c.Call.Method = obj - } - for _, arg := range fn.Params { - c.Call.Args = append(c.Call.Args, arg) - } - emitTailCall(fn, &c) - fn.finishBody() - - prog.bounds[obj] = fn - } - return fn -} - -// -- thunks ----------------------------------------------------------- - -// makeThunk returns a thunk, a synthetic function that delegates to a -// concrete or interface method denoted by sel.Obj(). The resulting -// function has no receiver, but has an additional (first) regular -// parameter. -// -// Precondition: sel.Kind() == types.MethodExpr. -// -// type T int or: type T interface { meth() } -// func (t T) meth() -// f := T.meth -// var t T -// f(t) // calls t.meth() -// -// f is a synthetic wrapper defined as if by: -// -// f := func(t T) { return t.meth() } -// -// TODO(adonovan): opt: currently the stub is created even when used -// directly in a function call: C.f(i, 0). This is less efficient -// than inlining the stub. -// -// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu) -// -func makeThunk(prog *Program, sel *types.Selection) *Function { - if sel.Kind() != types.MethodExpr { - panic(sel) - } - - key := selectionKey{ - kind: sel.Kind(), - recv: sel.Recv(), - obj: sel.Obj(), - index: fmt.Sprint(sel.Index()), - indirect: sel.Indirect(), - } - - prog.methodsMu.Lock() - defer prog.methodsMu.Unlock() - - // Canonicalize key.recv to avoid constructing duplicate thunks. - canonRecv, ok := prog.canon.At(key.recv).(types.Type) - if !ok { - canonRecv = key.recv - prog.canon.Set(key.recv, canonRecv) - } - key.recv = canonRecv - - fn, ok := prog.thunks[key] - if !ok { - fn = makeWrapper(prog, sel) - if fn.Signature.Recv() != nil { - panic(fn) // unexpected receiver - } - prog.thunks[key] = fn - } - return fn -} - -func changeRecv(s *types.Signature, recv *types.Var) *types.Signature { - return types.NewSignature(recv, s.Params(), s.Results(), s.Variadic()) -} - -// selectionKey is like types.Selection but a usable map key. -type selectionKey struct { - kind types.SelectionKind - recv types.Type // canonicalized via Program.canon - obj types.Object - index string - indirect bool -} diff --git a/vendor/honnef.co/go/tools/ssa/write.go b/vendor/honnef.co/go/tools/ssa/write.go deleted file mode 100644 index 89761a18a55..00000000000 --- a/vendor/honnef.co/go/tools/ssa/write.go +++ /dev/null @@ -1,5 +0,0 @@ -package ssa - -func NewJump(parent *BasicBlock) *Jump { - return &Jump{anInstruction{parent}} -} diff --git a/vendor/honnef.co/go/tools/ssautil/BUILD b/vendor/honnef.co/go/tools/ssautil/BUILD deleted file mode 100644 index 93b9360cd1b..00000000000 --- a/vendor/honnef.co/go/tools/ssautil/BUILD +++ /dev/null @@ -1,24 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["ssautil.go"], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/ssautil", - importpath = "honnef.co/go/tools/ssautil", - visibility = ["//visibility:public"], - deps = ["//vendor/honnef.co/go/tools/ssa:go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/ssautil/ssautil.go b/vendor/honnef.co/go/tools/ssautil/ssautil.go deleted file mode 100644 index 72c3c919d62..00000000000 --- a/vendor/honnef.co/go/tools/ssautil/ssautil.go +++ /dev/null @@ -1,58 +0,0 @@ -package ssautil - -import ( - "honnef.co/go/tools/ssa" -) - -func Reachable(from, to *ssa.BasicBlock) bool { - if from == to { - return true - } - if from.Dominates(to) { - return true - } - - found := false - Walk(from, func(b *ssa.BasicBlock) bool { - if b == to { - found = true - return false - } - return true - }) - return found -} - -func Walk(b *ssa.BasicBlock, fn func(*ssa.BasicBlock) bool) { - seen := map[*ssa.BasicBlock]bool{} - wl := []*ssa.BasicBlock{b} - for len(wl) > 0 { - b := wl[len(wl)-1] - wl = wl[:len(wl)-1] - if seen[b] { - continue - } - seen[b] = true - if !fn(b) { - continue - } - wl = append(wl, b.Succs...) - } -} - -func Vararg(x *ssa.Slice) ([]ssa.Value, bool) { - var out []ssa.Value - slice, ok := x.X.(*ssa.Alloc) - if !ok || slice.Comment != "varargs" { - return nil, false - } - for _, ref := range *slice.Referrers() { - idx, ok := ref.(*ssa.IndexAddr) - if !ok { - continue - } - v := (*idx.Referrers())[0].(*ssa.Store).Val - out = append(out, v) - } - return out, true -} diff --git a/vendor/honnef.co/go/tools/staticcheck/BUILD b/vendor/honnef.co/go/tools/staticcheck/BUILD deleted file mode 100644 index 868d231403e..00000000000 --- a/vendor/honnef.co/go/tools/staticcheck/BUILD +++ /dev/null @@ -1,54 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "analysis.go", - "buildtag.go", - "doc.go", - "knowledge.go", - "lint.go", - "rules.go", - "structtag.go", - ], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/staticcheck", - importpath = "honnef.co/go/tools/staticcheck", - visibility = ["//visibility:public"], - deps = [ - "//vendor/golang.org/x/tools/go/analysis:go_default_library", - "//vendor/golang.org/x/tools/go/analysis/passes/inspect:go_default_library", - "//vendor/golang.org/x/tools/go/ast/astutil:go_default_library", - "//vendor/golang.org/x/tools/go/ast/inspector:go_default_library", - "//vendor/golang.org/x/tools/go/types/typeutil:go_default_library", - "//vendor/honnef.co/go/tools/arg:go_default_library", - "//vendor/honnef.co/go/tools/deprecated:go_default_library", - "//vendor/honnef.co/go/tools/facts:go_default_library", - "//vendor/honnef.co/go/tools/functions:go_default_library", - "//vendor/honnef.co/go/tools/internal/passes/buildssa:go_default_library", - "//vendor/honnef.co/go/tools/internal/sharedcheck:go_default_library", - "//vendor/honnef.co/go/tools/lint:go_default_library", - "//vendor/honnef.co/go/tools/lint/lintdsl:go_default_library", - "//vendor/honnef.co/go/tools/lint/lintutil:go_default_library", - "//vendor/honnef.co/go/tools/printf:go_default_library", - "//vendor/honnef.co/go/tools/ssa:go_default_library", - "//vendor/honnef.co/go/tools/ssautil:go_default_library", - "//vendor/honnef.co/go/tools/staticcheck/vrp:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [ - ":package-srcs", - "//vendor/honnef.co/go/tools/staticcheck/vrp:all-srcs", - ], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/staticcheck/CONTRIBUTING.md b/vendor/honnef.co/go/tools/staticcheck/CONTRIBUTING.md deleted file mode 100644 index b12c7afc748..00000000000 --- a/vendor/honnef.co/go/tools/staticcheck/CONTRIBUTING.md +++ /dev/null @@ -1,15 +0,0 @@ -# Contributing to staticcheck - -## Before filing an issue: - -### Are you having trouble building staticcheck? - -Check you have the latest version of its dependencies. Run -``` -go get -u honnef.co/go/tools/staticcheck -``` -If you still have problems, consider searching for existing issues before filing a new issue. - -## Before sending a pull request: - -Have you understood the purpose of staticcheck? Make sure to carefully read `README`. diff --git a/vendor/honnef.co/go/tools/staticcheck/analysis.go b/vendor/honnef.co/go/tools/staticcheck/analysis.go deleted file mode 100644 index 442aebe5a18..00000000000 --- a/vendor/honnef.co/go/tools/staticcheck/analysis.go +++ /dev/null @@ -1,525 +0,0 @@ -package staticcheck - -import ( - "flag" - - "honnef.co/go/tools/facts" - "honnef.co/go/tools/internal/passes/buildssa" - "honnef.co/go/tools/lint/lintutil" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/analysis/passes/inspect" -) - -func newFlagSet() flag.FlagSet { - fs := flag.NewFlagSet("", flag.PanicOnError) - fs.Var(lintutil.NewVersionFlag(), "go", "Target Go version") - return *fs -} - -var Analyzers = map[string]*analysis.Analyzer{ - "SA1000": { - Name: "SA1000", - Run: callChecker(checkRegexpRules), - Doc: Docs["SA1000"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA1001": { - Name: "SA1001", - Run: CheckTemplate, - Doc: Docs["SA1001"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA1002": { - Name: "SA1002", - Run: callChecker(checkTimeParseRules), - Doc: Docs["SA1002"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA1003": { - Name: "SA1003", - Run: callChecker(checkEncodingBinaryRules), - Doc: Docs["SA1003"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA1004": { - Name: "SA1004", - Run: CheckTimeSleepConstant, - Doc: Docs["SA1004"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA1005": { - Name: "SA1005", - Run: CheckExec, - Doc: Docs["SA1005"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA1006": { - Name: "SA1006", - Run: CheckUnsafePrintf, - Doc: Docs["SA1006"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA1007": { - Name: "SA1007", - Run: callChecker(checkURLsRules), - Doc: Docs["SA1007"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA1008": { - Name: "SA1008", - Run: CheckCanonicalHeaderKey, - Doc: Docs["SA1008"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA1010": { - Name: "SA1010", - Run: callChecker(checkRegexpFindAllRules), - Doc: Docs["SA1010"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA1011": { - Name: "SA1011", - Run: callChecker(checkUTF8CutsetRules), - Doc: Docs["SA1011"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA1012": { - Name: "SA1012", - Run: CheckNilContext, - Doc: Docs["SA1012"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA1013": { - Name: "SA1013", - Run: CheckSeeker, - Doc: Docs["SA1013"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA1014": { - Name: "SA1014", - Run: callChecker(checkUnmarshalPointerRules), - Doc: Docs["SA1014"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA1015": { - Name: "SA1015", - Run: CheckLeakyTimeTick, - Doc: Docs["SA1015"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "SA1016": { - Name: "SA1016", - Run: CheckUntrappableSignal, - Doc: Docs["SA1016"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA1017": { - Name: "SA1017", - Run: callChecker(checkUnbufferedSignalChanRules), - Doc: Docs["SA1017"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA1018": { - Name: "SA1018", - Run: callChecker(checkStringsReplaceZeroRules), - Doc: Docs["SA1018"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA1019": { - Name: "SA1019", - Run: CheckDeprecated, - Doc: Docs["SA1019"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Deprecated}, - Flags: newFlagSet(), - }, - "SA1020": { - Name: "SA1020", - Run: callChecker(checkListenAddressRules), - Doc: Docs["SA1020"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA1021": { - Name: "SA1021", - Run: callChecker(checkBytesEqualIPRules), - Doc: Docs["SA1021"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA1023": { - Name: "SA1023", - Run: CheckWriterBufferModified, - Doc: Docs["SA1023"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "SA1024": { - Name: "SA1024", - Run: callChecker(checkUniqueCutsetRules), - Doc: Docs["SA1024"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA1025": { - Name: "SA1025", - Run: CheckTimerResetReturnValue, - Doc: Docs["SA1025"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "SA1026": { - Name: "SA1026", - Run: callChecker(checkUnsupportedMarshal), - Doc: Docs["SA1026"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA1027": { - Name: "SA1027", - Run: callChecker(checkAtomicAlignment), - Doc: Docs["SA1027"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - - "SA2000": { - Name: "SA2000", - Run: CheckWaitgroupAdd, - Doc: Docs["SA2000"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA2001": { - Name: "SA2001", - Run: CheckEmptyCriticalSection, - Doc: Docs["SA2001"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA2002": { - Name: "SA2002", - Run: CheckConcurrentTesting, - Doc: Docs["SA2002"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "SA2003": { - Name: "SA2003", - Run: CheckDeferLock, - Doc: Docs["SA2003"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - - "SA3000": { - Name: "SA3000", - Run: CheckTestMainExit, - Doc: Docs["SA3000"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA3001": { - Name: "SA3001", - Run: CheckBenchmarkN, - Doc: Docs["SA3001"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - - "SA4000": { - Name: "SA4000", - Run: CheckLhsRhsIdentical, - Doc: Docs["SA4000"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.TokenFile, facts.Generated}, - Flags: newFlagSet(), - }, - "SA4001": { - Name: "SA4001", - Run: CheckIneffectiveCopy, - Doc: Docs["SA4001"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA4002": { - Name: "SA4002", - Run: CheckDiffSizeComparison, - Doc: Docs["SA4002"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA4003": { - Name: "SA4003", - Run: CheckExtremeComparison, - Doc: Docs["SA4003"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA4004": { - Name: "SA4004", - Run: CheckIneffectiveLoop, - Doc: Docs["SA4004"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA4006": { - Name: "SA4006", - Run: CheckUnreadVariableValues, - Doc: Docs["SA4006"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "SA4008": { - Name: "SA4008", - Run: CheckLoopCondition, - Doc: Docs["SA4008"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "SA4009": { - Name: "SA4009", - Run: CheckArgOverwritten, - Doc: Docs["SA4009"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "SA4010": { - Name: "SA4010", - Run: CheckIneffectiveAppend, - Doc: Docs["SA4010"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "SA4011": { - Name: "SA4011", - Run: CheckScopedBreak, - Doc: Docs["SA4011"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA4012": { - Name: "SA4012", - Run: CheckNaNComparison, - Doc: Docs["SA4012"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "SA4013": { - Name: "SA4013", - Run: CheckDoubleNegation, - Doc: Docs["SA4013"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA4014": { - Name: "SA4014", - Run: CheckRepeatedIfElse, - Doc: Docs["SA4014"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA4015": { - Name: "SA4015", - Run: callChecker(checkMathIntRules), - Doc: Docs["SA4015"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA4016": { - Name: "SA4016", - Run: CheckSillyBitwiseOps, - Doc: Docs["SA4016"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.TokenFile}, - Flags: newFlagSet(), - }, - "SA4017": { - Name: "SA4017", - Run: CheckPureFunctions, - Doc: Docs["SA4017"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.Purity}, - Flags: newFlagSet(), - }, - "SA4018": { - Name: "SA4018", - Run: CheckSelfAssignment, - Doc: Docs["SA4018"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile}, - Flags: newFlagSet(), - }, - "SA4019": { - Name: "SA4019", - Run: CheckDuplicateBuildConstraints, - Doc: Docs["SA4019"].String(), - Requires: []*analysis.Analyzer{facts.Generated}, - Flags: newFlagSet(), - }, - "SA4020": { - Name: "SA4020", - Run: CheckUnreachableTypeCases, - Doc: Docs["SA4020"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA4021": { - Name: "SA4021", - Run: CheckSingleArgAppend, - Doc: Docs["SA4021"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile}, - Flags: newFlagSet(), - }, - - "SA5000": { - Name: "SA5000", - Run: CheckNilMaps, - Doc: Docs["SA5000"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "SA5001": { - Name: "SA5001", - Run: CheckEarlyDefer, - Doc: Docs["SA5001"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA5002": { - Name: "SA5002", - Run: CheckInfiniteEmptyLoop, - Doc: Docs["SA5002"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA5003": { - Name: "SA5003", - Run: CheckDeferInInfiniteLoop, - Doc: Docs["SA5003"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA5004": { - Name: "SA5004", - Run: CheckLoopEmptyDefault, - Doc: Docs["SA5004"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA5005": { - Name: "SA5005", - Run: CheckCyclicFinalizer, - Doc: Docs["SA5005"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "SA5007": { - Name: "SA5007", - Run: CheckInfiniteRecursion, - Doc: Docs["SA5007"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "SA5008": { - Name: "SA5008", - Run: CheckStructTags, - Doc: Docs["SA5008"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA5009": { - Name: "SA5009", - Run: callChecker(checkPrintfRules), - Doc: Docs["SA5009"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - - "SA6000": { - Name: "SA6000", - Run: callChecker(checkRegexpMatchLoopRules), - Doc: Docs["SA6000"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA6001": { - Name: "SA6001", - Run: CheckMapBytesKey, - Doc: Docs["SA6001"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "SA6002": { - Name: "SA6002", - Run: callChecker(checkSyncPoolValueRules), - Doc: Docs["SA6002"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer}, - Flags: newFlagSet(), - }, - "SA6003": { - Name: "SA6003", - Run: CheckRangeStringRunes, - Doc: Docs["SA6003"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "SA6005": { - Name: "SA6005", - Run: CheckToLowerToUpperComparison, - Doc: Docs["SA6005"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - - "SA9001": { - Name: "SA9001", - Run: CheckDubiousDeferInChannelRangeLoop, - Doc: Docs["SA9001"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA9002": { - Name: "SA9002", - Run: CheckNonOctalFileMode, - Doc: Docs["SA9002"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - "SA9003": { - Name: "SA9003", - Run: CheckEmptyBranch, - Doc: Docs["SA9003"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.TokenFile, facts.Generated}, - Flags: newFlagSet(), - }, - "SA9004": { - Name: "SA9004", - Run: CheckMissingEnumTypesInDeclaration, - Doc: Docs["SA9004"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, - // Filtering generated code because it may include empty structs generated from data models. - "SA9005": { - Name: "SA9005", - Run: callChecker(checkNoopMarshal), - Doc: Docs["SA9005"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer, facts.Generated, facts.TokenFile}, - Flags: newFlagSet(), - }, -} diff --git a/vendor/honnef.co/go/tools/staticcheck/buildtag.go b/vendor/honnef.co/go/tools/staticcheck/buildtag.go deleted file mode 100644 index 888d3e9dc05..00000000000 --- a/vendor/honnef.co/go/tools/staticcheck/buildtag.go +++ /dev/null @@ -1,21 +0,0 @@ -package staticcheck - -import ( - "go/ast" - "strings" - - . "honnef.co/go/tools/lint/lintdsl" -) - -func buildTags(f *ast.File) [][]string { - var out [][]string - for _, line := range strings.Split(Preamble(f), "\n") { - if !strings.HasPrefix(line, "+build ") { - continue - } - line = strings.TrimSpace(strings.TrimPrefix(line, "+build ")) - fields := strings.Fields(line) - out = append(out, fields) - } - return out -} diff --git a/vendor/honnef.co/go/tools/staticcheck/doc.go b/vendor/honnef.co/go/tools/staticcheck/doc.go deleted file mode 100644 index 4a87d4a24ce..00000000000 --- a/vendor/honnef.co/go/tools/staticcheck/doc.go +++ /dev/null @@ -1,764 +0,0 @@ -package staticcheck - -import "honnef.co/go/tools/lint" - -var Docs = map[string]*lint.Documentation{ - "SA1000": &lint.Documentation{ - Title: `Invalid regular expression`, - Since: "2017.1", - }, - - "SA1001": &lint.Documentation{ - Title: `Invalid template`, - Since: "2017.1", - }, - - "SA1002": &lint.Documentation{ - Title: `Invalid format in time.Parse`, - Since: "2017.1", - }, - - "SA1003": &lint.Documentation{ - Title: `Unsupported argument to functions in encoding/binary`, - Text: `The encoding/binary package can only serialize types with known sizes. -This precludes the use of the int and uint types, as their sizes -differ on different architectures. Furthermore, it doesn't support -serializing maps, channels, strings, or functions. - -Before Go 1.8, bool wasn't supported, either.`, - Since: "2017.1", - }, - - "SA1004": &lint.Documentation{ - Title: `Suspiciously small untyped constant in time.Sleep`, - Text: `The time.Sleep function takes a time.Duration as its only argument. -Durations are expressed in nanoseconds. Thus, calling time.Sleep(1) -will sleep for 1 nanosecond. This is a common source of bugs, as sleep -functions in other languages often accept seconds or milliseconds. - -The time package provides constants such as time.Second to express -large durations. These can be combined with arithmetic to express -arbitrary durations, for example '5 * time.Second' for 5 seconds. - -If you truly meant to sleep for a tiny amount of time, use -'n * time.Nanosecond' to signal to staticcheck that you did mean to sleep -for some amount of nanoseconds.`, - Since: "2017.1", - }, - - "SA1005": &lint.Documentation{ - Title: `Invalid first argument to exec.Command`, - Text: `os/exec runs programs directly (using variants of the fork and exec -system calls on Unix systems). This shouldn't be confused with running -a command in a shell. The shell will allow for features such as input -redirection, pipes, and general scripting. The shell is also -responsible for splitting the user's input into a program name and its -arguments. For example, the equivalent to - - ls / /tmp - -would be - - exec.Command("ls", "/", "/tmp") - -If you want to run a command in a shell, consider using something like -the following – but be aware that not all systems, particularly -Windows, will have a /bin/sh program: - - exec.Command("/bin/sh", "-c", "ls | grep Awesome")`, - Since: "2017.1", - }, - - "SA1006": &lint.Documentation{ - Title: `Printf with dynamic first argument and no further arguments`, - Text: `Using fmt.Printf with a dynamic first argument can lead to unexpected -output. The first argument is a format string, where certain character -combinations have special meaning. If, for example, a user were to -enter a string such as - - Interest rate: 5% - -and you printed it with - - fmt.Printf(s) - -it would lead to the following output: - - Interest rate: 5%!(NOVERB). - -Similarly, forming the first parameter via string concatenation with -user input should be avoided for the same reason. When printing user -input, either use a variant of fmt.Print, or use the %s Printf verb -and pass the string as an argument.`, - Since: "2017.1", - }, - - "SA1007": &lint.Documentation{ - Title: `Invalid URL in net/url.Parse`, - Since: "2017.1", - }, - - "SA1008": &lint.Documentation{ - Title: `Non-canonical key in http.Header map`, - Text: `Keys in http.Header maps are canonical, meaning they follow a specific -combination of uppercase and lowercase letters. Methods such as -http.Header.Add and http.Header.Del convert inputs into this canonical -form before manipulating the map. - -When manipulating http.Header maps directly, as opposed to using the -provided methods, care should be taken to stick to canonical form in -order to avoid inconsistencies. The following piece of code -demonstrates one such inconsistency: - - h := http.Header{} - h["etag"] = []string{"1234"} - h.Add("etag", "5678") - fmt.Println(h) - - // Output: - // map[Etag:[5678] etag:[1234]] - -The easiest way of obtaining the canonical form of a key is to use -http.CanonicalHeaderKey.`, - Since: "2017.1", - }, - - "SA1010": &lint.Documentation{ - Title: `(*regexp.Regexp).FindAll called with n == 0, which will always return zero results`, - Text: `If n >= 0, the function returns at most n matches/submatches. To -return all results, specify a negative number.`, - Since: "2017.1", - }, - - "SA1011": &lint.Documentation{ - Title: `Various methods in the strings package expect valid UTF-8, but invalid input is provided`, - Since: "2017.1", - }, - - "SA1012": &lint.Documentation{ - Title: `A nil context.Context is being passed to a function, consider using context.TODO instead`, - Since: "2017.1", - }, - - "SA1013": &lint.Documentation{ - Title: `io.Seeker.Seek is being called with the whence constant as the first argument, but it should be the second`, - Since: "2017.1", - }, - - "SA1014": &lint.Documentation{ - Title: `Non-pointer value passed to Unmarshal or Decode`, - Since: "2017.1", - }, - - "SA1015": &lint.Documentation{ - Title: `Using time.Tick in a way that will leak. Consider using time.NewTicker, and only use time.Tick in tests, commands and endless functions`, - Since: "2017.1", - }, - - "SA1016": &lint.Documentation{ - Title: `Trapping a signal that cannot be trapped`, - Text: `Not all signals can be intercepted by a process. Speficially, on -UNIX-like systems, the syscall.SIGKILL and syscall.SIGSTOP signals are -never passed to the process, but instead handled directly by the -kernel. It is therefore pointless to try and handle these signals.`, - Since: "2017.1", - }, - - "SA1017": &lint.Documentation{ - Title: `Channels used with os/signal.Notify should be buffered`, - Text: `The os/signal package uses non-blocking channel sends when delivering -signals. If the receiving end of the channel isn't ready and the -channel is either unbuffered or full, the signal will be dropped. To -avoid missing signals, the channel should be buffered and of the -appropriate size. For a channel used for notification of just one -signal value, a buffer of size 1 is sufficient.`, - Since: "2017.1", - }, - - "SA1018": &lint.Documentation{ - Title: `strings.Replace called with n == 0, which does nothing`, - Text: `With n == 0, zero instances will be replaced. To replace all -instances, use a negative number, or use strings.ReplaceAll.`, - Since: "2017.1", - }, - - "SA1019": &lint.Documentation{ - Title: `Using a deprecated function, variable, constant or field`, - Since: "2017.1", - }, - - "SA1020": &lint.Documentation{ - Title: `Using an invalid host:port pair with a net.Listen-related function`, - Since: "2017.1", - }, - - "SA1021": &lint.Documentation{ - Title: `Using bytes.Equal to compare two net.IP`, - Text: `A net.IP stores an IPv4 or IPv6 address as a slice of bytes. The -length of the slice for an IPv4 address, however, can be either 4 or -16 bytes long, using different ways of representing IPv4 addresses. In -order to correctly compare two net.IPs, the net.IP.Equal method should -be used, as it takes both representations into account.`, - Since: "2017.1", - }, - - "SA1023": &lint.Documentation{ - Title: `Modifying the buffer in an io.Writer implementation`, - Text: `Write must not modify the slice data, even temporarily.`, - Since: "2017.1", - }, - - "SA1024": &lint.Documentation{ - Title: `A string cutset contains duplicate characters`, - Text: `The strings.TrimLeft and strings.TrimRight functions take cutsets, not -prefixes. A cutset is treated as a set of characters to remove from a -string. For example, - - strings.TrimLeft("42133word", "1234")) - -will result in the string "word" – any characters that are 1, 2, 3 or -4 are cut from the left of the string. - -In order to remove one string from another, use strings.TrimPrefix instead.`, - Since: "2017.1", - }, - - "SA1025": &lint.Documentation{ - Title: `It is not possible to use (*time.Timer).Reset's return value correctly`, - Since: "2019.1", - }, - - "SA1026": &lint.Documentation{ - Title: `Cannot marshal channels or functions`, - Since: "2019.2", - }, - - "SA1027": &lint.Documentation{ - Title: `Atomic access to 64-bit variable must be 64-bit aligned`, - Text: `On ARM, x86-32, and 32-bit MIPS, it is the caller's responsibility to -arrange for 64-bit alignment of 64-bit words accessed atomically. The -first word in a variable or in an allocated struct, array, or slice -can be relied upon to be 64-bit aligned. - -You can use the structlayout tool to inspect the alignment of fields -in a struct.`, - Since: "2019.2", - }, - - "SA2000": &lint.Documentation{ - Title: `sync.WaitGroup.Add called inside the goroutine, leading to a race condition`, - Since: "2017.1", - }, - - "SA2001": &lint.Documentation{ - Title: `Empty critical section, did you mean to defer the unlock?`, - Text: `Empty critical sections of the kind - - mu.Lock() - mu.Unlock() - -are very often a typo, and the following was intended instead: - - mu.Lock() - defer mu.Unlock() - -Do note that sometimes empty critical sections can be useful, as a -form of signaling to wait on another goroutine. Many times, there are -simpler ways of achieving the same effect. When that isn't the case, -the code should be amply commented to avoid confusion. Combining such -comments with a //lint:ignore directive can be used to suppress this -rare false positive.`, - Since: "2017.1", - }, - - "SA2002": &lint.Documentation{ - Title: `Called testing.T.FailNow or SkipNow in a goroutine, which isn't allowed`, - Since: "2017.1", - }, - - "SA2003": &lint.Documentation{ - Title: `Deferred Lock right after locking, likely meant to defer Unlock instead`, - Since: "2017.1", - }, - - "SA3000": &lint.Documentation{ - Title: `TestMain doesn't call os.Exit, hiding test failures`, - Text: `Test executables (and in turn 'go test') exit with a non-zero status -code if any tests failed. When specifying your own TestMain function, -it is your responsibility to arrange for this, by calling os.Exit with -the correct code. The correct code is returned by (*testing.M).Run, so -the usual way of implementing TestMain is to end it with -os.Exit(m.Run()).`, - Since: "2017.1", - }, - - "SA3001": &lint.Documentation{ - Title: `Assigning to b.N in benchmarks distorts the results`, - Text: `The testing package dynamically sets b.N to improve the reliability of -benchmarks and uses it in computations to determine the duration of a -single operation. Benchmark code must not alter b.N as this would -falsify results.`, - Since: "2017.1", - }, - - "SA4000": &lint.Documentation{ - Title: `Boolean expression has identical expressions on both sides`, - Since: "2017.1", - }, - - "SA4001": &lint.Documentation{ - Title: `&*x gets simplified to x, it does not copy x`, - Since: "2017.1", - }, - - "SA4002": &lint.Documentation{ - Title: `Comparing strings with known different sizes has predictable results`, - Since: "2017.1", - }, - - "SA4003": &lint.Documentation{ - Title: `Comparing unsigned values against negative values is pointless`, - Since: "2017.1", - }, - - "SA4004": &lint.Documentation{ - Title: `The loop exits unconditionally after one iteration`, - Since: "2017.1", - }, - - "SA4005": &lint.Documentation{ - Title: `Field assignment that will never be observed. Did you mean to use a pointer receiver?`, - Since: "2017.1", - }, - - "SA4006": &lint.Documentation{ - Title: `A value assigned to a variable is never read before being overwritten. Forgotten error check or dead code?`, - Since: "2017.1", - }, - - "SA4008": &lint.Documentation{ - Title: `The variable in the loop condition never changes, are you incrementing the wrong variable?`, - Since: "2017.1", - }, - - "SA4009": &lint.Documentation{ - Title: `A function argument is overwritten before its first use`, - Since: "2017.1", - }, - - "SA4010": &lint.Documentation{ - Title: `The result of append will never be observed anywhere`, - Since: "2017.1", - }, - - "SA4011": &lint.Documentation{ - Title: `Break statement with no effect. Did you mean to break out of an outer loop?`, - Since: "2017.1", - }, - - "SA4012": &lint.Documentation{ - Title: `Comparing a value against NaN even though no value is equal to NaN`, - Since: "2017.1", - }, - - "SA4013": &lint.Documentation{ - Title: `Negating a boolean twice (!!b) is the same as writing b. This is either redundant, or a typo.`, - Since: "2017.1", - }, - - "SA4014": &lint.Documentation{ - Title: `An if/else if chain has repeated conditions and no side-effects; if the condition didn't match the first time, it won't match the second time, either`, - Since: "2017.1", - }, - - "SA4015": &lint.Documentation{ - Title: `Calling functions like math.Ceil on floats converted from integers doesn't do anything useful`, - Since: "2017.1", - }, - - "SA4016": &lint.Documentation{ - Title: `Certain bitwise operations, such as x ^ 0, do not do anything useful`, - Since: "2017.1", - }, - - "SA4017": &lint.Documentation{ - Title: `A pure function's return value is discarded, making the call pointless`, - Since: "2017.1", - }, - - "SA4018": &lint.Documentation{ - Title: `Self-assignment of variables`, - Since: "2017.1", - }, - - "SA4019": &lint.Documentation{ - Title: `Multiple, identical build constraints in the same file`, - Since: "2017.1", - }, - - "SA4020": &lint.Documentation{ - Title: `Unreachable case clause in a type switch`, - Text: `In a type switch like the following - - type T struct{} - func (T) Read(b []byte) (int, error) { return 0, nil } - - var v interface{} = T{} - - switch v.(type) { - case io.Reader: - // ... - case T: - // unreachable - } - -the second case clause can never be reached because T implements -io.Reader and case clauses are evaluated in source order. - -Another example: - - type T struct{} - func (T) Read(b []byte) (int, error) { return 0, nil } - func (T) Close() error { return nil } - - var v interface{} = T{} - - switch v.(type) { - case io.Reader: - // ... - case io.ReadCloser: - // unreachable - } - -Even though T has a Close method and thus implements io.ReadCloser, -io.Reader will always match first. The method set of io.Reader is a -subset of io.ReadCloser. Thus it is impossible to match the second -case without matching the first case. - - -Structurally equivalent interfaces - -A special case of the previous example are structurally identical -interfaces. Given these declarations - - type T error - type V error - - func doSomething() error { - err, ok := doAnotherThing() - if ok { - return T(err) - } - - return U(err) - } - -the following type switch will have an unreachable case clause: - - switch doSomething().(type) { - case T: - // ... - case V: - // unreachable - } - -T will always match before V because they are structurally equivalent -and therefore doSomething()'s return value implements both.`, - Since: "2019.2", - }, - - "SA4021": &lint.Documentation{ - Title: `x = append(y) is equivalent to x = y`, - Since: "2019.2", - }, - - "SA5000": &lint.Documentation{ - Title: `Assignment to nil map`, - Since: "2017.1", - }, - - "SA5001": &lint.Documentation{ - Title: `Defering Close before checking for a possible error`, - Since: "2017.1", - }, - - "SA5002": &lint.Documentation{ - Title: `The empty for loop (for {}) spins and can block the scheduler`, - Since: "2017.1", - }, - - "SA5003": &lint.Documentation{ - Title: `Defers in infinite loops will never execute`, - Text: `Defers are scoped to the surrounding function, not the surrounding -block. In a function that never returns, i.e. one containing an -infinite loop, defers will never execute.`, - Since: "2017.1", - }, - - "SA5004": &lint.Documentation{ - Title: `for { select { ... with an empty default branch spins`, - Since: "2017.1", - }, - - "SA5005": &lint.Documentation{ - Title: `The finalizer references the finalized object, preventing garbage collection`, - Text: `A finalizer is a function associated with an object that runs when the -garbage collector is ready to collect said object, that is when the -object is no longer referenced by anything. - -If the finalizer references the object, however, it will always remain -as the final reference to that object, preventing the garbage -collector from collecting the object. The finalizer will never run, -and the object will never be collected, leading to a memory leak. That -is why the finalizer should instead use its first argument to operate -on the object. That way, the number of references can temporarily go -to zero before the object is being passed to the finalizer.`, - Since: "2017.1", - }, - - "SA5006": &lint.Documentation{ - Title: `Slice index out of bounds`, - Since: "2017.1", - }, - - "SA5007": &lint.Documentation{ - Title: `Infinite recursive call`, - Text: `A function that calls itself recursively needs to have an exit -condition. Otherwise it will recurse forever, until the system runs -out of memory. - -This issue can be caused by simple bugs such as forgetting to add an -exit condition. It can also happen "on purpose". Some languages have -tail call optimization which makes certain infinite recursive calls -safe to use. Go, however, does not implement TCO, and as such a loop -should be used instead.`, - Since: "2017.1", - }, - - "SA5008": &lint.Documentation{ - Title: `Invalid struct tag`, - Since: "2019.2", - }, - - "SA5009": &lint.Documentation{ - Title: `Invalid Printf call`, - Since: "2019.2", - }, - - "SA6000": &lint.Documentation{ - Title: `Using regexp.Match or related in a loop, should use regexp.Compile`, - Since: "2017.1", - }, - - "SA6001": &lint.Documentation{ - Title: `Missing an optimization opportunity when indexing maps by byte slices`, - - Text: `Map keys must be comparable, which precludes the use of byte slices. -This usually leads to using string keys and converting byte slices to -strings. - -Normally, a conversion of a byte slice to a string needs to copy the data and -causes allocations. The compiler, however, recognizes m[string(b)] and -uses the data of b directly, without copying it, because it knows that -the data can't change during the map lookup. This leads to the -counter-intuitive situation that - - k := string(b) - println(m[k]) - println(m[k]) - -will be less efficient than - - println(m[string(b)]) - println(m[string(b)]) - -because the first version needs to copy and allocate, while the second -one does not. - -For some history on this optimization, check out commit -f5f5a8b6209f84961687d993b93ea0d397f5d5bf in the Go repository.`, - Since: "2017.1", - }, - - "SA6002": &lint.Documentation{ - Title: `Storing non-pointer values in sync.Pool allocates memory`, - Text: `A sync.Pool is used to avoid unnecessary allocations and reduce the -amount of work the garbage collector has to do. - -When passing a value that is not a pointer to a function that accepts -an interface, the value needs to be placed on the heap, which means an -additional allocation. Slices are a common thing to put in sync.Pools, -and they're structs with 3 fields (length, capacity, and a pointer to -an array). In order to avoid the extra allocation, one should store a -pointer to the slice instead. - -See the comments on https://go-review.googlesource.com/c/go/+/24371 -that discuss this problem.`, - Since: "2017.1", - }, - - "SA6003": &lint.Documentation{ - Title: `Converting a string to a slice of runes before ranging over it`, - Text: `You may want to loop over the runes in a string. Instead of converting -the string to a slice of runes and looping over that, you can loop -over the string itself. That is, - - for _, r := range s {} - -and - - for _, r := range []rune(s) {} - -will yield the same values. The first version, however, will be faster -and avoid unnecessary memory allocations. - -Do note that if you are interested in the indices, ranging over a -string and over a slice of runes will yield different indices. The -first one yields byte offsets, while the second one yields indices in -the slice of runes.`, - Since: "2017.1", - }, - - "SA6005": &lint.Documentation{ - Title: `Inefficient string comparison with strings.ToLower or strings.ToUpper`, - Text: `Converting two strings to the same case and comparing them like so - - if strings.ToLower(s1) == strings.ToLower(s2) { - ... - } - -is significantly more expensive than comparing them with -strings.EqualFold(s1, s2). This is due to memory usage as well as -computational complexity. - -strings.ToLower will have to allocate memory for the new strings, as -well as convert both strings fully, even if they differ on the very -first byte. strings.EqualFold, on the other hand, compares the strings -one character at a time. It doesn't need to create two intermediate -strings and can return as soon as the first non-matching character has -been found. - -For a more in-depth explanation of this issue, see -https://blog.digitalocean.com/how-to-efficiently-compare-strings-in-go/`, - Since: "2019.2", - }, - - "SA9001": &lint.Documentation{ - Title: `Defers in range loops may not run when you expect them to`, - Since: "2017.1", - }, - - "SA9002": &lint.Documentation{ - Title: `Using a non-octal os.FileMode that looks like it was meant to be in octal.`, - Since: "2017.1", - }, - - "SA9003": &lint.Documentation{ - Title: `Empty body in an if or else branch`, - Since: "2017.1", - }, - - "SA9004": &lint.Documentation{ - Title: `Only the first constant has an explicit type`, - - Text: `In a constant declaration such as the following: - - const ( - First byte = 1 - Second = 2 - ) - -the constant Second does not have the same type as the constant First. -This construct shouldn't be confused with - - const ( - First byte = iota - Second - ) - -where First and Second do indeed have the same type. The type is only -passed on when no explicit value is assigned to the constant. - -When declaring enumerations with explicit values it is therefore -important not to write - - const ( - EnumFirst EnumType = 1 - EnumSecond = 2 - EnumThird = 3 - ) - -This discrepancy in types can cause various confusing behaviors and -bugs. - - -Wrong type in variable declarations - -The most obvious issue with such incorrect enumerations expresses -itself as a compile error: - - package pkg - - const ( - EnumFirst uint8 = 1 - EnumSecond = 2 - ) - - func fn(useFirst bool) { - x := EnumSecond - if useFirst { - x = EnumFirst - } - } - -fails to compile with - - ./const.go:11:5: cannot use EnumFirst (type uint8) as type int in assignment - - -Losing method sets - -A more subtle issue occurs with types that have methods and optional -interfaces. Consider the following: - - package main - - import "fmt" - - type Enum int - - func (e Enum) String() string { - return "an enum" - } - - const ( - EnumFirst Enum = 1 - EnumSecond = 2 - ) - - func main() { - fmt.Println(EnumFirst) - fmt.Println(EnumSecond) - } - -This code will output - - an enum - 2 - -as EnumSecond has no explicit type, and thus defaults to int.`, - Since: "2019.1", - }, - - "SA9005": &lint.Documentation{ - Title: `Trying to marshal a struct with no public fields nor custom marshaling`, - Text: `The encoding/json and encoding/xml packages only operate on exported -fields in structs, not unexported ones. It is usually an error to try -to (un)marshal structs that only consist of unexported fields. - -This check will not flag calls involving types that define custom -marshaling behavior, e.g. via MarshalJSON methods. It will also not -flag empty structs.`, - Since: "2019.2", - }, -} diff --git a/vendor/honnef.co/go/tools/staticcheck/knowledge.go b/vendor/honnef.co/go/tools/staticcheck/knowledge.go deleted file mode 100644 index 4c12b866a20..00000000000 --- a/vendor/honnef.co/go/tools/staticcheck/knowledge.go +++ /dev/null @@ -1,25 +0,0 @@ -package staticcheck - -import ( - "reflect" - - "golang.org/x/tools/go/analysis" - "honnef.co/go/tools/internal/passes/buildssa" - "honnef.co/go/tools/ssa" - "honnef.co/go/tools/staticcheck/vrp" -) - -var valueRangesAnalyzer = &analysis.Analyzer{ - Name: "vrp", - Doc: "calculate value ranges of functions", - Run: func(pass *analysis.Pass) (interface{}, error) { - m := map[*ssa.Function]vrp.Ranges{} - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - vr := vrp.BuildGraph(ssafn).Solve() - m[ssafn] = vr - } - return m, nil - }, - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - ResultType: reflect.TypeOf(map[*ssa.Function]vrp.Ranges{}), -} diff --git a/vendor/honnef.co/go/tools/staticcheck/lint.go b/vendor/honnef.co/go/tools/staticcheck/lint.go deleted file mode 100644 index 1558cbf9415..00000000000 --- a/vendor/honnef.co/go/tools/staticcheck/lint.go +++ /dev/null @@ -1,3360 +0,0 @@ -// Package staticcheck contains a linter for Go source code. -package staticcheck // import "honnef.co/go/tools/staticcheck" - -import ( - "fmt" - "go/ast" - "go/constant" - "go/token" - "go/types" - htmltemplate "html/template" - "net/http" - "reflect" - "regexp" - "regexp/syntax" - "sort" - "strconv" - "strings" - texttemplate "text/template" - "unicode" - - . "honnef.co/go/tools/arg" - "honnef.co/go/tools/deprecated" - "honnef.co/go/tools/facts" - "honnef.co/go/tools/functions" - "honnef.co/go/tools/internal/passes/buildssa" - "honnef.co/go/tools/internal/sharedcheck" - "honnef.co/go/tools/lint" - . "honnef.co/go/tools/lint/lintdsl" - "honnef.co/go/tools/printf" - "honnef.co/go/tools/ssa" - "honnef.co/go/tools/ssautil" - "honnef.co/go/tools/staticcheck/vrp" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/analysis/passes/inspect" - "golang.org/x/tools/go/ast/astutil" - "golang.org/x/tools/go/ast/inspector" - "golang.org/x/tools/go/types/typeutil" -) - -func validRegexp(call *Call) { - arg := call.Args[0] - err := ValidateRegexp(arg.Value) - if err != nil { - arg.Invalid(err.Error()) - } -} - -type runeSlice []rune - -func (rs runeSlice) Len() int { return len(rs) } -func (rs runeSlice) Less(i int, j int) bool { return rs[i] < rs[j] } -func (rs runeSlice) Swap(i int, j int) { rs[i], rs[j] = rs[j], rs[i] } - -func utf8Cutset(call *Call) { - arg := call.Args[1] - if InvalidUTF8(arg.Value) { - arg.Invalid(MsgInvalidUTF8) - } -} - -func uniqueCutset(call *Call) { - arg := call.Args[1] - if !UniqueStringCutset(arg.Value) { - arg.Invalid(MsgNonUniqueCutset) - } -} - -func unmarshalPointer(name string, arg int) CallCheck { - return func(call *Call) { - if !Pointer(call.Args[arg].Value) { - call.Args[arg].Invalid(fmt.Sprintf("%s expects to unmarshal into a pointer, but the provided value is not a pointer", name)) - } - } -} - -func pointlessIntMath(call *Call) { - if ConvertedFromInt(call.Args[0].Value) { - call.Invalid(fmt.Sprintf("calling %s on a converted integer is pointless", CallName(call.Instr.Common()))) - } -} - -func checkValidHostPort(arg int) CallCheck { - return func(call *Call) { - if !ValidHostPort(call.Args[arg].Value) { - call.Args[arg].Invalid(MsgInvalidHostPort) - } - } -} - -var ( - checkRegexpRules = map[string]CallCheck{ - "regexp.MustCompile": validRegexp, - "regexp.Compile": validRegexp, - "regexp.Match": validRegexp, - "regexp.MatchReader": validRegexp, - "regexp.MatchString": validRegexp, - } - - checkTimeParseRules = map[string]CallCheck{ - "time.Parse": func(call *Call) { - arg := call.Args[Arg("time.Parse.layout")] - err := ValidateTimeLayout(arg.Value) - if err != nil { - arg.Invalid(err.Error()) - } - }, - } - - checkEncodingBinaryRules = map[string]CallCheck{ - "encoding/binary.Write": func(call *Call) { - arg := call.Args[Arg("encoding/binary.Write.data")] - if !CanBinaryMarshal(call.Pass, arg.Value) { - arg.Invalid(fmt.Sprintf("value of type %s cannot be used with binary.Write", arg.Value.Value.Type())) - } - }, - } - - checkURLsRules = map[string]CallCheck{ - "net/url.Parse": func(call *Call) { - arg := call.Args[Arg("net/url.Parse.rawurl")] - err := ValidateURL(arg.Value) - if err != nil { - arg.Invalid(err.Error()) - } - }, - } - - checkSyncPoolValueRules = map[string]CallCheck{ - "(*sync.Pool).Put": func(call *Call) { - arg := call.Args[Arg("(*sync.Pool).Put.x")] - typ := arg.Value.Value.Type() - if !IsPointerLike(typ) { - arg.Invalid("argument should be pointer-like to avoid allocations") - } - }, - } - - checkRegexpFindAllRules = map[string]CallCheck{ - "(*regexp.Regexp).FindAll": RepeatZeroTimes("a FindAll method", 1), - "(*regexp.Regexp).FindAllIndex": RepeatZeroTimes("a FindAll method", 1), - "(*regexp.Regexp).FindAllString": RepeatZeroTimes("a FindAll method", 1), - "(*regexp.Regexp).FindAllStringIndex": RepeatZeroTimes("a FindAll method", 1), - "(*regexp.Regexp).FindAllStringSubmatch": RepeatZeroTimes("a FindAll method", 1), - "(*regexp.Regexp).FindAllStringSubmatchIndex": RepeatZeroTimes("a FindAll method", 1), - "(*regexp.Regexp).FindAllSubmatch": RepeatZeroTimes("a FindAll method", 1), - "(*regexp.Regexp).FindAllSubmatchIndex": RepeatZeroTimes("a FindAll method", 1), - } - - checkUTF8CutsetRules = map[string]CallCheck{ - "strings.IndexAny": utf8Cutset, - "strings.LastIndexAny": utf8Cutset, - "strings.ContainsAny": utf8Cutset, - "strings.Trim": utf8Cutset, - "strings.TrimLeft": utf8Cutset, - "strings.TrimRight": utf8Cutset, - } - - checkUniqueCutsetRules = map[string]CallCheck{ - "strings.Trim": uniqueCutset, - "strings.TrimLeft": uniqueCutset, - "strings.TrimRight": uniqueCutset, - } - - checkUnmarshalPointerRules = map[string]CallCheck{ - "encoding/xml.Unmarshal": unmarshalPointer("xml.Unmarshal", 1), - "(*encoding/xml.Decoder).Decode": unmarshalPointer("Decode", 0), - "(*encoding/xml.Decoder).DecodeElement": unmarshalPointer("DecodeElement", 0), - "encoding/json.Unmarshal": unmarshalPointer("json.Unmarshal", 1), - "(*encoding/json.Decoder).Decode": unmarshalPointer("Decode", 0), - } - - checkUnbufferedSignalChanRules = map[string]CallCheck{ - "os/signal.Notify": func(call *Call) { - arg := call.Args[Arg("os/signal.Notify.c")] - if UnbufferedChannel(arg.Value) { - arg.Invalid("the channel used with signal.Notify should be buffered") - } - }, - } - - checkMathIntRules = map[string]CallCheck{ - "math.Ceil": pointlessIntMath, - "math.Floor": pointlessIntMath, - "math.IsNaN": pointlessIntMath, - "math.Trunc": pointlessIntMath, - "math.IsInf": pointlessIntMath, - } - - checkStringsReplaceZeroRules = map[string]CallCheck{ - "strings.Replace": RepeatZeroTimes("strings.Replace", 3), - "bytes.Replace": RepeatZeroTimes("bytes.Replace", 3), - } - - checkListenAddressRules = map[string]CallCheck{ - "net/http.ListenAndServe": checkValidHostPort(0), - "net/http.ListenAndServeTLS": checkValidHostPort(0), - } - - checkBytesEqualIPRules = map[string]CallCheck{ - "bytes.Equal": func(call *Call) { - if ConvertedFrom(call.Args[Arg("bytes.Equal.a")].Value, "net.IP") && - ConvertedFrom(call.Args[Arg("bytes.Equal.b")].Value, "net.IP") { - call.Invalid("use net.IP.Equal to compare net.IPs, not bytes.Equal") - } - }, - } - - checkRegexpMatchLoopRules = map[string]CallCheck{ - "regexp.Match": loopedRegexp("regexp.Match"), - "regexp.MatchReader": loopedRegexp("regexp.MatchReader"), - "regexp.MatchString": loopedRegexp("regexp.MatchString"), - } - - checkNoopMarshal = map[string]CallCheck{ - // TODO(dh): should we really flag XML? Even an empty struct - // produces a non-zero amount of data, namely its type name. - // Let's see if we encounter any false positives. - // - // Also, should we flag gob? - "encoding/json.Marshal": checkNoopMarshalImpl(Arg("json.Marshal.v"), "MarshalJSON", "MarshalText"), - "encoding/xml.Marshal": checkNoopMarshalImpl(Arg("xml.Marshal.v"), "MarshalXML", "MarshalText"), - "(*encoding/json.Encoder).Encode": checkNoopMarshalImpl(Arg("(*encoding/json.Encoder).Encode.v"), "MarshalJSON", "MarshalText"), - "(*encoding/xml.Encoder).Encode": checkNoopMarshalImpl(Arg("(*encoding/xml.Encoder).Encode.v"), "MarshalXML", "MarshalText"), - - "encoding/json.Unmarshal": checkNoopMarshalImpl(Arg("json.Unmarshal.v"), "UnmarshalJSON", "UnmarshalText"), - "encoding/xml.Unmarshal": checkNoopMarshalImpl(Arg("xml.Unmarshal.v"), "UnmarshalXML", "UnmarshalText"), - "(*encoding/json.Decoder).Decode": checkNoopMarshalImpl(Arg("(*encoding/json.Decoder).Decode.v"), "UnmarshalJSON", "UnmarshalText"), - "(*encoding/xml.Decoder).Decode": checkNoopMarshalImpl(Arg("(*encoding/xml.Decoder).Decode.v"), "UnmarshalXML", "UnmarshalText"), - } - - checkUnsupportedMarshal = map[string]CallCheck{ - "encoding/json.Marshal": checkUnsupportedMarshalImpl(Arg("json.Marshal.v"), "json", "MarshalJSON", "MarshalText"), - "encoding/xml.Marshal": checkUnsupportedMarshalImpl(Arg("xml.Marshal.v"), "xml", "MarshalXML", "MarshalText"), - "(*encoding/json.Encoder).Encode": checkUnsupportedMarshalImpl(Arg("(*encoding/json.Encoder).Encode.v"), "json", "MarshalJSON", "MarshalText"), - "(*encoding/xml.Encoder).Encode": checkUnsupportedMarshalImpl(Arg("(*encoding/xml.Encoder).Encode.v"), "xml", "MarshalXML", "MarshalText"), - } - - checkAtomicAlignment = map[string]CallCheck{ - "sync/atomic.AddInt64": checkAtomicAlignmentImpl, - "sync/atomic.AddUint64": checkAtomicAlignmentImpl, - "sync/atomic.CompareAndSwapInt64": checkAtomicAlignmentImpl, - "sync/atomic.CompareAndSwapUint64": checkAtomicAlignmentImpl, - "sync/atomic.LoadInt64": checkAtomicAlignmentImpl, - "sync/atomic.LoadUint64": checkAtomicAlignmentImpl, - "sync/atomic.StoreInt64": checkAtomicAlignmentImpl, - "sync/atomic.StoreUint64": checkAtomicAlignmentImpl, - "sync/atomic.SwapInt64": checkAtomicAlignmentImpl, - "sync/atomic.SwapUint64": checkAtomicAlignmentImpl, - } - - // TODO(dh): detect printf wrappers - checkPrintfRules = map[string]CallCheck{ - "fmt.Errorf": func(call *Call) { checkPrintfCall(call, 0, 1) }, - "fmt.Printf": func(call *Call) { checkPrintfCall(call, 0, 1) }, - "fmt.Sprintf": func(call *Call) { checkPrintfCall(call, 0, 1) }, - "fmt.Fprintf": func(call *Call) { checkPrintfCall(call, 1, 2) }, - } -) - -func checkPrintfCall(call *Call, fIdx, vIdx int) { - f := call.Args[fIdx] - var args []ssa.Value - switch v := call.Args[vIdx].Value.Value.(type) { - case *ssa.Slice: - var ok bool - args, ok = ssautil.Vararg(v) - if !ok { - // We don't know what the actual arguments to the function are - return - } - case *ssa.Const: - // nil, i.e. no arguments - default: - // We don't know what the actual arguments to the function are - return - } - checkPrintfCallImpl(call, f.Value.Value, args) -} - -type verbFlag int - -const ( - isInt verbFlag = 1 << iota - isBool - isFP - isString - isPointer - isPseudoPointer - isSlice - isAny - noRecurse -) - -var verbs = [...]verbFlag{ - 'b': isPseudoPointer | isInt | isFP, - 'c': isInt, - 'd': isPseudoPointer | isInt, - 'e': isFP, - 'E': isFP, - 'f': isFP, - 'F': isFP, - 'g': isFP, - 'G': isFP, - 'o': isPseudoPointer | isInt, - 'p': isSlice | isPointer | noRecurse, - 'q': isInt | isString, - 's': isString, - 't': isBool, - 'T': isAny, - 'U': isInt, - 'v': isAny, - 'X': isPseudoPointer | isInt | isString, - 'x': isPseudoPointer | isInt | isString, -} - -func checkPrintfCallImpl(call *Call, f ssa.Value, args []ssa.Value) { - var msCache *typeutil.MethodSetCache - if f.Parent() != nil { - msCache = &f.Parent().Prog.MethodSets - } - - elem := func(T types.Type, verb rune) ([]types.Type, bool) { - if verbs[verb]&noRecurse != 0 { - return []types.Type{T}, false - } - switch T := T.(type) { - case *types.Slice: - if verbs[verb]&isSlice != 0 { - return []types.Type{T}, false - } - if verbs[verb]&isString != 0 && IsType(T.Elem().Underlying(), "byte") { - return []types.Type{T}, false - } - return []types.Type{T.Elem()}, true - case *types.Map: - key := T.Key() - val := T.Elem() - return []types.Type{key, val}, true - case *types.Struct: - out := make([]types.Type, 0, T.NumFields()) - for i := 0; i < T.NumFields(); i++ { - out = append(out, T.Field(i).Type()) - } - return out, true - case *types.Array: - return []types.Type{T.Elem()}, true - default: - return []types.Type{T}, false - } - } - isInfo := func(T types.Type, info types.BasicInfo) bool { - basic, ok := T.Underlying().(*types.Basic) - return ok && basic.Info()&info != 0 - } - - isStringer := func(T types.Type, ms *types.MethodSet) bool { - sel := ms.Lookup(nil, "String") - if sel == nil { - return false - } - fn, ok := sel.Obj().(*types.Func) - if !ok { - // should be unreachable - return false - } - sig := fn.Type().(*types.Signature) - if sig.Params().Len() != 0 { - return false - } - if sig.Results().Len() != 1 { - return false - } - if !IsType(sig.Results().At(0).Type(), "string") { - return false - } - return true - } - isError := func(T types.Type, ms *types.MethodSet) bool { - sel := ms.Lookup(nil, "Error") - if sel == nil { - return false - } - fn, ok := sel.Obj().(*types.Func) - if !ok { - // should be unreachable - return false - } - sig := fn.Type().(*types.Signature) - if sig.Params().Len() != 0 { - return false - } - if sig.Results().Len() != 1 { - return false - } - if !IsType(sig.Results().At(0).Type(), "string") { - return false - } - return true - } - - isFormatter := func(T types.Type, ms *types.MethodSet) bool { - sel := ms.Lookup(nil, "Format") - if sel == nil { - return false - } - fn, ok := sel.Obj().(*types.Func) - if !ok { - // should be unreachable - return false - } - sig := fn.Type().(*types.Signature) - if sig.Params().Len() != 2 { - return false - } - // TODO(dh): check the types of the arguments for more - // precision - if sig.Results().Len() != 0 { - return false - } - return true - } - - seen := map[types.Type]bool{} - var checkType func(verb rune, T types.Type, top bool) bool - checkType = func(verb rune, T types.Type, top bool) bool { - if top { - for k := range seen { - delete(seen, k) - } - } - if seen[T] { - return true - } - seen[T] = true - if int(verb) >= len(verbs) { - // Unknown verb - return true - } - - flags := verbs[verb] - if flags == 0 { - // Unknown verb - return true - } - - ms := msCache.MethodSet(T) - if isFormatter(T, ms) { - // the value is responsible for formatting itself - return true - } - - if flags&isString != 0 && (isStringer(T, ms) || isError(T, ms)) { - // Check for stringer early because we're about to dereference - return true - } - - T = T.Underlying() - if flags&(isPointer|isPseudoPointer) == 0 && top { - T = Dereference(T) - } - if flags&isPseudoPointer != 0 && top { - t := Dereference(T) - if _, ok := t.Underlying().(*types.Struct); ok { - T = t - } - } - - if _, ok := T.(*types.Interface); ok { - // We don't know what's in the interface - return true - } - - var info types.BasicInfo - if flags&isInt != 0 { - info |= types.IsInteger - } - if flags&isBool != 0 { - info |= types.IsBoolean - } - if flags&isFP != 0 { - info |= types.IsFloat | types.IsComplex - } - if flags&isString != 0 { - info |= types.IsString - } - - if info != 0 && isInfo(T, info) { - return true - } - - if flags&isString != 0 && (IsType(T, "[]byte") || isStringer(T, ms) || isError(T, ms)) { - return true - } - - if flags&isPointer != 0 && IsPointerLike(T) { - return true - } - if flags&isPseudoPointer != 0 { - switch U := T.Underlying().(type) { - case *types.Pointer: - if !top { - return true - } - - if _, ok := U.Elem().Underlying().(*types.Struct); !ok { - return true - } - case *types.Chan, *types.Signature: - return true - } - } - - if flags&isSlice != 0 { - if _, ok := T.(*types.Slice); ok { - return true - } - } - - if flags&isAny != 0 { - return true - } - - elems, ok := elem(T.Underlying(), verb) - if !ok { - return false - } - for _, elem := range elems { - if !checkType(verb, elem, false) { - return false - } - } - - return true - } - - k, ok := f.(*ssa.Const) - if !ok { - return - } - actions, err := printf.Parse(constant.StringVal(k.Value)) - if err != nil { - call.Invalid("couldn't parse format string") - return - } - - ptr := 1 - hasExplicit := false - - checkStar := func(verb printf.Verb, star printf.Argument) bool { - if star, ok := star.(printf.Star); ok { - idx := 0 - if star.Index == -1 { - idx = ptr - ptr++ - } else { - hasExplicit = true - idx = star.Index - ptr = star.Index + 1 - } - if idx == 0 { - call.Invalid(fmt.Sprintf("Printf format %s reads invalid arg 0; indices are 1-based", verb.Raw)) - return false - } - if idx > len(args) { - call.Invalid( - fmt.Sprintf("Printf format %s reads arg #%d, but call has only %d args", - verb.Raw, idx, len(args))) - return false - } - if arg, ok := args[idx-1].(*ssa.MakeInterface); ok { - if !isInfo(arg.X.Type(), types.IsInteger) { - call.Invalid(fmt.Sprintf("Printf format %s reads non-int arg #%d as argument of *", verb.Raw, idx)) - } - } - } - return true - } - - // We only report one problem per format string. Making a - // mistake with an index tends to invalidate all future - // implicit indices. - for _, action := range actions { - verb, ok := action.(printf.Verb) - if !ok { - continue - } - - if !checkStar(verb, verb.Width) || !checkStar(verb, verb.Precision) { - return - } - - off := ptr - if verb.Value != -1 { - hasExplicit = true - off = verb.Value - } - if off > len(args) { - call.Invalid( - fmt.Sprintf("Printf format %s reads arg #%d, but call has only %d args", - verb.Raw, off, len(args))) - return - } else if verb.Value == 0 && verb.Letter != '%' { - call.Invalid(fmt.Sprintf("Printf format %s reads invalid arg 0; indices are 1-based", verb.Raw)) - return - } else if off != 0 { - arg, ok := args[off-1].(*ssa.MakeInterface) - if ok { - if !checkType(verb.Letter, arg.X.Type(), true) { - call.Invalid(fmt.Sprintf("Printf format %s has arg #%d of wrong type %s", - verb.Raw, ptr, args[ptr-1].(*ssa.MakeInterface).X.Type())) - return - } - } - } - - switch verb.Value { - case -1: - // Consume next argument - ptr++ - case 0: - // Don't consume any arguments - default: - ptr = verb.Value + 1 - } - } - - if !hasExplicit && ptr <= len(args) { - call.Invalid(fmt.Sprintf("Printf call needs %d args but has %d args", ptr-1, len(args))) - } -} - -func checkAtomicAlignmentImpl(call *Call) { - sizes := call.Pass.TypesSizes - if sizes.Sizeof(types.Typ[types.Uintptr]) != 4 { - // Not running on a 32-bit platform - return - } - v, ok := call.Args[0].Value.Value.(*ssa.FieldAddr) - if !ok { - // TODO(dh): also check indexing into arrays and slices - return - } - T := v.X.Type().Underlying().(*types.Pointer).Elem().Underlying().(*types.Struct) - fields := make([]*types.Var, 0, T.NumFields()) - for i := 0; i < T.NumFields() && i <= v.Field; i++ { - fields = append(fields, T.Field(i)) - } - - off := sizes.Offsetsof(fields)[v.Field] - if off%8 != 0 { - msg := fmt.Sprintf("address of non 64-bit aligned field %s passed to %s", - T.Field(v.Field).Name(), - CallName(call.Instr.Common())) - call.Invalid(msg) - } -} - -func checkNoopMarshalImpl(argN int, meths ...string) CallCheck { - return func(call *Call) { - if IsGenerated(call.Pass, call.Instr.Pos()) { - return - } - arg := call.Args[argN] - T := arg.Value.Value.Type() - Ts, ok := Dereference(T).Underlying().(*types.Struct) - if !ok { - return - } - if Ts.NumFields() == 0 { - return - } - fields := FlattenFields(Ts) - for _, field := range fields { - if field.Var.Exported() { - return - } - } - // OPT(dh): we could use a method set cache here - ms := call.Instr.Parent().Prog.MethodSets.MethodSet(T) - // TODO(dh): we're not checking the signature, which can cause false negatives. - // This isn't a huge problem, however, since vet complains about incorrect signatures. - for _, meth := range meths { - if ms.Lookup(nil, meth) != nil { - return - } - } - arg.Invalid("struct doesn't have any exported fields, nor custom marshaling") - } -} - -func checkUnsupportedMarshalImpl(argN int, tag string, meths ...string) CallCheck { - // TODO(dh): flag slices and maps of unsupported types - return func(call *Call) { - msCache := &call.Instr.Parent().Prog.MethodSets - - arg := call.Args[argN] - T := arg.Value.Value.Type() - Ts, ok := Dereference(T).Underlying().(*types.Struct) - if !ok { - return - } - ms := msCache.MethodSet(T) - // TODO(dh): we're not checking the signature, which can cause false negatives. - // This isn't a huge problem, however, since vet complains about incorrect signatures. - for _, meth := range meths { - if ms.Lookup(nil, meth) != nil { - return - } - } - fields := FlattenFields(Ts) - for _, field := range fields { - if !(field.Var.Exported()) { - continue - } - if reflect.StructTag(field.Tag).Get(tag) == "-" { - continue - } - ms := msCache.MethodSet(field.Var.Type()) - // TODO(dh): we're not checking the signature, which can cause false negatives. - // This isn't a huge problem, however, since vet complains about incorrect signatures. - for _, meth := range meths { - if ms.Lookup(nil, meth) != nil { - return - } - } - switch field.Var.Type().Underlying().(type) { - case *types.Chan, *types.Signature: - arg.Invalid(fmt.Sprintf("trying to marshal chan or func value, field %s", fieldPath(T, field.Path))) - } - } - } -} - -func fieldPath(start types.Type, indices []int) string { - p := start.String() - for _, idx := range indices { - field := Dereference(start).Underlying().(*types.Struct).Field(idx) - start = field.Type() - p += "." + field.Name() - } - return p -} - -func isInLoop(b *ssa.BasicBlock) bool { - sets := functions.FindLoops(b.Parent()) - for _, set := range sets { - if set.Has(b) { - return true - } - } - return false -} - -func CheckUntrappableSignal(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - call := node.(*ast.CallExpr) - if !IsCallToAnyAST(pass, call, - "os/signal.Ignore", "os/signal.Notify", "os/signal.Reset") { - return - } - for _, arg := range call.Args { - if conv, ok := arg.(*ast.CallExpr); ok && isName(pass, conv.Fun, "os.Signal") { - arg = conv.Args[0] - } - - if isName(pass, arg, "os.Kill") || isName(pass, arg, "syscall.SIGKILL") { - ReportNodef(pass, arg, "%s cannot be trapped (did you mean syscall.SIGTERM?)", Render(pass, arg)) - } - if isName(pass, arg, "syscall.SIGSTOP") { - ReportNodef(pass, arg, "%s signal cannot be trapped", Render(pass, arg)) - } - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func CheckTemplate(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - call := node.(*ast.CallExpr) - var kind string - if IsCallToAST(pass, call, "(*text/template.Template).Parse") { - kind = "text" - } else if IsCallToAST(pass, call, "(*html/template.Template).Parse") { - kind = "html" - } else { - return - } - sel := call.Fun.(*ast.SelectorExpr) - if !IsCallToAST(pass, sel.X, "text/template.New") && - !IsCallToAST(pass, sel.X, "html/template.New") { - // TODO(dh): this is a cheap workaround for templates with - // different delims. A better solution with less false - // negatives would use data flow analysis to see where the - // template comes from and where it has been - return - } - s, ok := ExprToString(pass, call.Args[Arg("(*text/template.Template).Parse.text")]) - if !ok { - return - } - var err error - switch kind { - case "text": - _, err = texttemplate.New("").Parse(s) - case "html": - _, err = htmltemplate.New("").Parse(s) - } - if err != nil { - // TODO(dominikh): whitelist other parse errors, if any - if strings.Contains(err.Error(), "unexpected") { - ReportNodef(pass, call.Args[Arg("(*text/template.Template).Parse.text")], "%s", err) - } - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func CheckTimeSleepConstant(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - call := node.(*ast.CallExpr) - if !IsCallToAST(pass, call, "time.Sleep") { - return - } - lit, ok := call.Args[Arg("time.Sleep.d")].(*ast.BasicLit) - if !ok { - return - } - n, err := strconv.Atoi(lit.Value) - if err != nil { - return - } - if n == 0 || n > 120 { - // time.Sleep(0) is a seldom used pattern in concurrency - // tests. >120 might be intentional. 120 was chosen - // because the user could've meant 2 minutes. - return - } - recommendation := "time.Sleep(time.Nanosecond)" - if n != 1 { - recommendation = fmt.Sprintf("time.Sleep(%d * time.Nanosecond)", n) - } - ReportNodef(pass, call.Args[Arg("time.Sleep.d")], - "sleeping for %d nanoseconds is probably a bug. Be explicit if it isn't: %s", n, recommendation) - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func CheckWaitgroupAdd(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - g := node.(*ast.GoStmt) - fun, ok := g.Call.Fun.(*ast.FuncLit) - if !ok { - return - } - if len(fun.Body.List) == 0 { - return - } - stmt, ok := fun.Body.List[0].(*ast.ExprStmt) - if !ok { - return - } - if IsCallToAST(pass, stmt.X, "(*sync.WaitGroup).Add") { - ReportNodef(pass, stmt, "should call %s before starting the goroutine to avoid a race", - Render(pass, stmt)) - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.GoStmt)(nil)}, fn) - return nil, nil -} - -func CheckInfiniteEmptyLoop(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - loop := node.(*ast.ForStmt) - if len(loop.Body.List) != 0 || loop.Post != nil { - return - } - - if loop.Init != nil { - // TODO(dh): this isn't strictly necessary, it just makes - // the check easier. - return - } - // An empty loop is bad news in two cases: 1) The loop has no - // condition. In that case, it's just a loop that spins - // forever and as fast as it can, keeping a core busy. 2) The - // loop condition only consists of variable or field reads and - // operators on those. The only way those could change their - // value is with unsynchronised access, which constitutes a - // data race. - // - // If the condition contains any function calls, its behaviour - // is dynamic and the loop might terminate. Similarly for - // channel receives. - - if loop.Cond != nil { - if hasSideEffects(loop.Cond) { - return - } - if ident, ok := loop.Cond.(*ast.Ident); ok { - if k, ok := pass.TypesInfo.ObjectOf(ident).(*types.Const); ok { - if !constant.BoolVal(k.Val()) { - // don't flag `for false {}` loops. They're a debug aid. - return - } - } - } - ReportNodef(pass, loop, "loop condition never changes or has a race condition") - } - ReportNodef(pass, loop, "this loop will spin, using 100%% CPU") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil)}, fn) - return nil, nil -} - -func CheckDeferInInfiniteLoop(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - mightExit := false - var defers []ast.Stmt - loop := node.(*ast.ForStmt) - if loop.Cond != nil { - return - } - fn2 := func(node ast.Node) bool { - switch stmt := node.(type) { - case *ast.ReturnStmt: - mightExit = true - return false - case *ast.BranchStmt: - // TODO(dominikh): if this sees a break in a switch or - // select, it doesn't check if it breaks the loop or - // just the select/switch. This causes some false - // negatives. - if stmt.Tok == token.BREAK { - mightExit = true - return false - } - case *ast.DeferStmt: - defers = append(defers, stmt) - case *ast.FuncLit: - // Don't look into function bodies - return false - } - return true - } - ast.Inspect(loop.Body, fn2) - if mightExit { - return - } - for _, stmt := range defers { - ReportNodef(pass, stmt, "defers in this infinite loop will never run") - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil)}, fn) - return nil, nil -} - -func CheckDubiousDeferInChannelRangeLoop(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - loop := node.(*ast.RangeStmt) - typ := pass.TypesInfo.TypeOf(loop.X) - _, ok := typ.Underlying().(*types.Chan) - if !ok { - return - } - fn2 := func(node ast.Node) bool { - switch stmt := node.(type) { - case *ast.DeferStmt: - ReportNodef(pass, stmt, "defers in this range loop won't run unless the channel gets closed") - case *ast.FuncLit: - // Don't look into function bodies - return false - } - return true - } - ast.Inspect(loop.Body, fn2) - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.RangeStmt)(nil)}, fn) - return nil, nil -} - -func CheckTestMainExit(pass *analysis.Pass) (interface{}, error) { - var ( - fnmain ast.Node - callsExit bool - callsRun bool - arg types.Object - ) - fn := func(node ast.Node, push bool) bool { - if !push { - if fnmain != nil && node == fnmain { - if !callsExit && callsRun { - ReportNodef(pass, fnmain, "TestMain should call os.Exit to set exit code") - } - fnmain = nil - callsExit = false - callsRun = false - arg = nil - } - return true - } - - switch node := node.(type) { - case *ast.FuncDecl: - if fnmain != nil { - return true - } - if !isTestMain(pass, node) { - return false - } - fnmain = node - arg = pass.TypesInfo.ObjectOf(node.Type.Params.List[0].Names[0]) - return true - case *ast.CallExpr: - if IsCallToAST(pass, node, "os.Exit") { - callsExit = true - return false - } - sel, ok := node.Fun.(*ast.SelectorExpr) - if !ok { - return true - } - ident, ok := sel.X.(*ast.Ident) - if !ok { - return true - } - if arg != pass.TypesInfo.ObjectOf(ident) { - return true - } - if sel.Sel.Name == "Run" { - callsRun = true - return false - } - return true - default: - // unreachable - return true - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Nodes([]ast.Node{(*ast.FuncDecl)(nil), (*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func isTestMain(pass *analysis.Pass, decl *ast.FuncDecl) bool { - if decl.Name.Name != "TestMain" { - return false - } - if len(decl.Type.Params.List) != 1 { - return false - } - arg := decl.Type.Params.List[0] - if len(arg.Names) != 1 { - return false - } - return IsOfType(pass, arg.Type, "*testing.M") -} - -func CheckExec(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - call := node.(*ast.CallExpr) - if !IsCallToAST(pass, call, "os/exec.Command") { - return - } - val, ok := ExprToString(pass, call.Args[Arg("os/exec.Command.name")]) - if !ok { - return - } - if !strings.Contains(val, " ") || strings.Contains(val, `\`) || strings.Contains(val, "/") { - return - } - ReportNodef(pass, call.Args[Arg("os/exec.Command.name")], - "first argument to exec.Command looks like a shell command, but a program name or path are expected") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func CheckLoopEmptyDefault(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - loop := node.(*ast.ForStmt) - if len(loop.Body.List) != 1 || loop.Cond != nil || loop.Init != nil { - return - } - sel, ok := loop.Body.List[0].(*ast.SelectStmt) - if !ok { - return - } - for _, c := range sel.Body.List { - if comm, ok := c.(*ast.CommClause); ok && comm.Comm == nil && len(comm.Body) == 0 { - ReportNodef(pass, comm, "should not have an empty default case in a for+select loop. The loop will spin.") - } - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil)}, fn) - return nil, nil -} - -func CheckLhsRhsIdentical(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - op := node.(*ast.BinaryExpr) - switch op.Op { - case token.EQL, token.NEQ: - if basic, ok := pass.TypesInfo.TypeOf(op.X).Underlying().(*types.Basic); ok { - if kind := basic.Kind(); kind == types.Float32 || kind == types.Float64 { - // f == f and f != f might be used to check for NaN - return - } - } - case token.SUB, token.QUO, token.AND, token.REM, token.OR, token.XOR, token.AND_NOT, - token.LAND, token.LOR, token.LSS, token.GTR, token.LEQ, token.GEQ: - default: - // For some ops, such as + and *, it can make sense to - // have identical operands - return - } - - if Render(pass, op.X) != Render(pass, op.Y) { - return - } - l1, ok1 := op.X.(*ast.BasicLit) - l2, ok2 := op.Y.(*ast.BasicLit) - if ok1 && ok2 && l1.Kind == token.INT && l2.Kind == l1.Kind && l1.Value == "0" && l2.Value == l1.Value && IsGenerated(pass, l1.Pos()) { - // cgo generates the following function call: - // _cgoCheckPointer(_cgoBase0, 0 == 0) – it uses 0 == 0 - // instead of true in case the user shadowed the - // identifier. Ideally we'd restrict this exception to - // calls of _cgoCheckPointer, but it's not worth the - // hassle of keeping track of the stack. - // are very rare to begin with, and we're mostly checking - // for them to catch typos such as 1 == 1 where the user - // meant to type i == 1. The odds of a false negative for - // 0 == 0 are slim. - return - } - ReportNodef(pass, op, "identical expressions on the left and right side of the '%s' operator", op.Op) - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn) - return nil, nil -} - -func CheckScopedBreak(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - var body *ast.BlockStmt - switch node := node.(type) { - case *ast.ForStmt: - body = node.Body - case *ast.RangeStmt: - body = node.Body - default: - panic(fmt.Sprintf("unreachable: %T", node)) - } - for _, stmt := range body.List { - var blocks [][]ast.Stmt - switch stmt := stmt.(type) { - case *ast.SwitchStmt: - for _, c := range stmt.Body.List { - blocks = append(blocks, c.(*ast.CaseClause).Body) - } - case *ast.SelectStmt: - for _, c := range stmt.Body.List { - blocks = append(blocks, c.(*ast.CommClause).Body) - } - default: - continue - } - - for _, body := range blocks { - if len(body) == 0 { - continue - } - lasts := []ast.Stmt{body[len(body)-1]} - // TODO(dh): unfold all levels of nested block - // statements, not just a single level if statement - if ifs, ok := lasts[0].(*ast.IfStmt); ok { - if len(ifs.Body.List) == 0 { - continue - } - lasts[0] = ifs.Body.List[len(ifs.Body.List)-1] - - if block, ok := ifs.Else.(*ast.BlockStmt); ok { - if len(block.List) != 0 { - lasts = append(lasts, block.List[len(block.List)-1]) - } - } - } - for _, last := range lasts { - branch, ok := last.(*ast.BranchStmt) - if !ok || branch.Tok != token.BREAK || branch.Label != nil { - continue - } - ReportNodef(pass, branch, "ineffective break statement. Did you mean to break out of the outer loop?") - } - } - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ForStmt)(nil), (*ast.RangeStmt)(nil)}, fn) - return nil, nil -} - -func CheckUnsafePrintf(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - call := node.(*ast.CallExpr) - var arg int - if IsCallToAnyAST(pass, call, "fmt.Printf", "fmt.Sprintf", "log.Printf") { - arg = Arg("fmt.Printf.format") - } else if IsCallToAnyAST(pass, call, "fmt.Fprintf") { - arg = Arg("fmt.Fprintf.format") - } else { - return - } - if len(call.Args) != arg+1 { - return - } - switch call.Args[arg].(type) { - case *ast.CallExpr, *ast.Ident: - default: - return - } - ReportNodef(pass, call.Args[arg], - "printf-style function with dynamic format string and no further arguments should use print-style function instead") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func CheckEarlyDefer(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - block := node.(*ast.BlockStmt) - if len(block.List) < 2 { - return - } - for i, stmt := range block.List { - if i == len(block.List)-1 { - break - } - assign, ok := stmt.(*ast.AssignStmt) - if !ok { - continue - } - if len(assign.Rhs) != 1 { - continue - } - if len(assign.Lhs) < 2 { - continue - } - if lhs, ok := assign.Lhs[len(assign.Lhs)-1].(*ast.Ident); ok && lhs.Name == "_" { - continue - } - call, ok := assign.Rhs[0].(*ast.CallExpr) - if !ok { - continue - } - sig, ok := pass.TypesInfo.TypeOf(call.Fun).(*types.Signature) - if !ok { - continue - } - if sig.Results().Len() < 2 { - continue - } - last := sig.Results().At(sig.Results().Len() - 1) - // FIXME(dh): check that it's error from universe, not - // another type of the same name - if last.Type().String() != "error" { - continue - } - lhs, ok := assign.Lhs[0].(*ast.Ident) - if !ok { - continue - } - def, ok := block.List[i+1].(*ast.DeferStmt) - if !ok { - continue - } - sel, ok := def.Call.Fun.(*ast.SelectorExpr) - if !ok { - continue - } - ident, ok := selectorX(sel).(*ast.Ident) - if !ok { - continue - } - if ident.Obj != lhs.Obj { - continue - } - if sel.Sel.Name != "Close" { - continue - } - ReportNodef(pass, def, "should check returned error before deferring %s", Render(pass, def.Call)) - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BlockStmt)(nil)}, fn) - return nil, nil -} - -func selectorX(sel *ast.SelectorExpr) ast.Node { - switch x := sel.X.(type) { - case *ast.SelectorExpr: - return selectorX(x) - default: - return x - } -} - -func CheckEmptyCriticalSection(pass *analysis.Pass) (interface{}, error) { - // Initially it might seem like this check would be easier to - // implement in SSA. After all, we're only checking for two - // consecutive method calls. In reality, however, there may be any - // number of other instructions between the lock and unlock, while - // still constituting an empty critical section. For example, - // given `m.x().Lock(); m.x().Unlock()`, there will be a call to - // x(). In the AST-based approach, this has a tiny potential for a - // false positive (the second call to x might be doing work that - // is protected by the mutex). In an SSA-based approach, however, - // it would miss a lot of real bugs. - - mutexParams := func(s ast.Stmt) (x ast.Expr, funcName string, ok bool) { - expr, ok := s.(*ast.ExprStmt) - if !ok { - return nil, "", false - } - call, ok := expr.X.(*ast.CallExpr) - if !ok { - return nil, "", false - } - sel, ok := call.Fun.(*ast.SelectorExpr) - if !ok { - return nil, "", false - } - - fn, ok := pass.TypesInfo.ObjectOf(sel.Sel).(*types.Func) - if !ok { - return nil, "", false - } - sig := fn.Type().(*types.Signature) - if sig.Params().Len() != 0 || sig.Results().Len() != 0 { - return nil, "", false - } - - return sel.X, fn.Name(), true - } - - fn := func(node ast.Node) { - block := node.(*ast.BlockStmt) - if len(block.List) < 2 { - return - } - for i := range block.List[:len(block.List)-1] { - sel1, method1, ok1 := mutexParams(block.List[i]) - sel2, method2, ok2 := mutexParams(block.List[i+1]) - - if !ok1 || !ok2 || Render(pass, sel1) != Render(pass, sel2) { - continue - } - if (method1 == "Lock" && method2 == "Unlock") || - (method1 == "RLock" && method2 == "RUnlock") { - ReportNodef(pass, block.List[i+1], "empty critical section") - } - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BlockStmt)(nil)}, fn) - return nil, nil -} - -// cgo produces code like fn(&*_Cvar_kSomeCallbacks) which we don't -// want to flag. -var cgoIdent = regexp.MustCompile(`^_C(func|var)_.+$`) - -func CheckIneffectiveCopy(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - if unary, ok := node.(*ast.UnaryExpr); ok { - if star, ok := unary.X.(*ast.StarExpr); ok && unary.Op == token.AND { - ident, ok := star.X.(*ast.Ident) - if !ok || !cgoIdent.MatchString(ident.Name) { - ReportNodef(pass, unary, "&*x will be simplified to x. It will not copy x.") - } - } - } - - if star, ok := node.(*ast.StarExpr); ok { - if unary, ok := star.X.(*ast.UnaryExpr); ok && unary.Op == token.AND { - ReportNodef(pass, star, "*&x will be simplified to x. It will not copy x.") - } - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.UnaryExpr)(nil), (*ast.StarExpr)(nil)}, fn) - return nil, nil -} - -func CheckDiffSizeComparison(pass *analysis.Pass) (interface{}, error) { - ranges := pass.ResultOf[valueRangesAnalyzer].(map[*ssa.Function]vrp.Ranges) - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - for _, b := range ssafn.Blocks { - for _, ins := range b.Instrs { - binop, ok := ins.(*ssa.BinOp) - if !ok { - continue - } - if binop.Op != token.EQL && binop.Op != token.NEQ { - continue - } - _, ok1 := binop.X.(*ssa.Slice) - _, ok2 := binop.Y.(*ssa.Slice) - if !ok1 && !ok2 { - continue - } - r := ranges[ssafn] - r1, ok1 := r.Get(binop.X).(vrp.StringInterval) - r2, ok2 := r.Get(binop.Y).(vrp.StringInterval) - if !ok1 || !ok2 { - continue - } - if r1.Length.Intersection(r2.Length).Empty() { - pass.Reportf(binop.Pos(), "comparing strings of different sizes for equality will always return false") - } - } - } - } - return nil, nil -} - -func CheckCanonicalHeaderKey(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node, push bool) bool { - if !push { - return false - } - assign, ok := node.(*ast.AssignStmt) - if ok { - // TODO(dh): This risks missing some Header reads, for - // example in `h1["foo"] = h2["foo"]` – these edge - // cases are probably rare enough to ignore for now. - for _, expr := range assign.Lhs { - op, ok := expr.(*ast.IndexExpr) - if !ok { - continue - } - if IsOfType(pass, op.X, "net/http.Header") { - return false - } - } - return true - } - op, ok := node.(*ast.IndexExpr) - if !ok { - return true - } - if !IsOfType(pass, op.X, "net/http.Header") { - return true - } - s, ok := ExprToString(pass, op.Index) - if !ok { - return true - } - if s == http.CanonicalHeaderKey(s) { - return true - } - ReportNodef(pass, op, "keys in http.Header are canonicalized, %q is not canonical; fix the constant or use http.CanonicalHeaderKey", s) - return true - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Nodes([]ast.Node{(*ast.AssignStmt)(nil), (*ast.IndexExpr)(nil)}, fn) - return nil, nil -} - -func CheckBenchmarkN(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - assign := node.(*ast.AssignStmt) - if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 { - return - } - sel, ok := assign.Lhs[0].(*ast.SelectorExpr) - if !ok { - return - } - if sel.Sel.Name != "N" { - return - } - if !IsOfType(pass, sel.X, "*testing.B") { - return - } - ReportNodef(pass, assign, "should not assign to %s", Render(pass, sel)) - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.AssignStmt)(nil)}, fn) - return nil, nil -} - -func CheckUnreadVariableValues(pass *analysis.Pass) (interface{}, error) { - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - if IsExample(ssafn) { - continue - } - node := ssafn.Syntax() - if node == nil { - continue - } - if gen, ok := Generator(pass, node.Pos()); ok && gen == facts.Goyacc { - // Don't flag unused values in code generated by goyacc. - // There may be hundreds of those due to the way the state - // machine is constructed. - continue - } - - switchTags := map[ssa.Value]struct{}{} - ast.Inspect(node, func(node ast.Node) bool { - s, ok := node.(*ast.SwitchStmt) - if !ok { - return true - } - v, _ := ssafn.ValueForExpr(s.Tag) - switchTags[v] = struct{}{} - return true - }) - - hasUse := func(v ssa.Value) bool { - if _, ok := switchTags[v]; ok { - return true - } - refs := v.Referrers() - if refs == nil { - // TODO investigate why refs can be nil - return true - } - return len(FilterDebug(*refs)) > 0 - } - - ast.Inspect(node, func(node ast.Node) bool { - assign, ok := node.(*ast.AssignStmt) - if !ok { - return true - } - if len(assign.Lhs) > 1 && len(assign.Rhs) == 1 { - // Either a function call with multiple return values, - // or a comma-ok assignment - - val, _ := ssafn.ValueForExpr(assign.Rhs[0]) - if val == nil { - return true - } - refs := val.Referrers() - if refs == nil { - return true - } - for _, ref := range *refs { - ex, ok := ref.(*ssa.Extract) - if !ok { - continue - } - if !hasUse(ex) { - lhs := assign.Lhs[ex.Index] - if ident, ok := lhs.(*ast.Ident); !ok || ok && ident.Name == "_" { - continue - } - ReportNodef(pass, lhs, "this value of %s is never used", lhs) - } - } - return true - } - for i, lhs := range assign.Lhs { - rhs := assign.Rhs[i] - if ident, ok := lhs.(*ast.Ident); !ok || ok && ident.Name == "_" { - continue - } - val, _ := ssafn.ValueForExpr(rhs) - if val == nil { - continue - } - - if !hasUse(val) { - ReportNodef(pass, lhs, "this value of %s is never used", lhs) - } - } - return true - }) - } - return nil, nil -} - -func CheckPredeterminedBooleanExprs(pass *analysis.Pass) (interface{}, error) { - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - for _, block := range ssafn.Blocks { - for _, ins := range block.Instrs { - ssabinop, ok := ins.(*ssa.BinOp) - if !ok { - continue - } - switch ssabinop.Op { - case token.GTR, token.LSS, token.EQL, token.NEQ, token.LEQ, token.GEQ: - default: - continue - } - - xs, ok1 := consts(ssabinop.X, nil, nil) - ys, ok2 := consts(ssabinop.Y, nil, nil) - if !ok1 || !ok2 || len(xs) == 0 || len(ys) == 0 { - continue - } - - trues := 0 - for _, x := range xs { - for _, y := range ys { - if x.Value == nil { - if y.Value == nil { - trues++ - } - continue - } - if constant.Compare(x.Value, ssabinop.Op, y.Value) { - trues++ - } - } - } - b := trues != 0 - if trues == 0 || trues == len(xs)*len(ys) { - pass.Reportf(ssabinop.Pos(), "binary expression is always %t for all possible values (%s %s %s)", - b, xs, ssabinop.Op, ys) - } - } - } - } - return nil, nil -} - -func CheckNilMaps(pass *analysis.Pass) (interface{}, error) { - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - for _, block := range ssafn.Blocks { - for _, ins := range block.Instrs { - mu, ok := ins.(*ssa.MapUpdate) - if !ok { - continue - } - c, ok := mu.Map.(*ssa.Const) - if !ok { - continue - } - if c.Value != nil { - continue - } - pass.Reportf(mu.Pos(), "assignment to nil map") - } - } - } - return nil, nil -} - -func CheckExtremeComparison(pass *analysis.Pass) (interface{}, error) { - isobj := func(expr ast.Expr, name string) bool { - sel, ok := expr.(*ast.SelectorExpr) - if !ok { - return false - } - return IsObject(pass.TypesInfo.ObjectOf(sel.Sel), name) - } - - fn := func(node ast.Node) { - expr := node.(*ast.BinaryExpr) - tx := pass.TypesInfo.TypeOf(expr.X) - basic, ok := tx.Underlying().(*types.Basic) - if !ok { - return - } - - var max string - var min string - - switch basic.Kind() { - case types.Uint8: - max = "math.MaxUint8" - case types.Uint16: - max = "math.MaxUint16" - case types.Uint32: - max = "math.MaxUint32" - case types.Uint64: - max = "math.MaxUint64" - case types.Uint: - max = "math.MaxUint64" - - case types.Int8: - min = "math.MinInt8" - max = "math.MaxInt8" - case types.Int16: - min = "math.MinInt16" - max = "math.MaxInt16" - case types.Int32: - min = "math.MinInt32" - max = "math.MaxInt32" - case types.Int64: - min = "math.MinInt64" - max = "math.MaxInt64" - case types.Int: - min = "math.MinInt64" - max = "math.MaxInt64" - } - - if (expr.Op == token.GTR || expr.Op == token.GEQ) && isobj(expr.Y, max) || - (expr.Op == token.LSS || expr.Op == token.LEQ) && isobj(expr.X, max) { - ReportNodef(pass, expr, "no value of type %s is greater than %s", basic, max) - } - if expr.Op == token.LEQ && isobj(expr.Y, max) || - expr.Op == token.GEQ && isobj(expr.X, max) { - ReportNodef(pass, expr, "every value of type %s is <= %s", basic, max) - } - - if (basic.Info() & types.IsUnsigned) != 0 { - if (expr.Op == token.LSS || expr.Op == token.LEQ) && IsIntLiteral(expr.Y, "0") || - (expr.Op == token.GTR || expr.Op == token.GEQ) && IsIntLiteral(expr.X, "0") { - ReportNodef(pass, expr, "no value of type %s is less than 0", basic) - } - if expr.Op == token.GEQ && IsIntLiteral(expr.Y, "0") || - expr.Op == token.LEQ && IsIntLiteral(expr.X, "0") { - ReportNodef(pass, expr, "every value of type %s is >= 0", basic) - } - } else { - if (expr.Op == token.LSS || expr.Op == token.LEQ) && isobj(expr.Y, min) || - (expr.Op == token.GTR || expr.Op == token.GEQ) && isobj(expr.X, min) { - ReportNodef(pass, expr, "no value of type %s is less than %s", basic, min) - } - if expr.Op == token.GEQ && isobj(expr.Y, min) || - expr.Op == token.LEQ && isobj(expr.X, min) { - ReportNodef(pass, expr, "every value of type %s is >= %s", basic, min) - } - } - - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn) - return nil, nil -} - -func consts(val ssa.Value, out []*ssa.Const, visitedPhis map[string]bool) ([]*ssa.Const, bool) { - if visitedPhis == nil { - visitedPhis = map[string]bool{} - } - var ok bool - switch val := val.(type) { - case *ssa.Phi: - if visitedPhis[val.Name()] { - break - } - visitedPhis[val.Name()] = true - vals := val.Operands(nil) - for _, phival := range vals { - out, ok = consts(*phival, out, visitedPhis) - if !ok { - return nil, false - } - } - case *ssa.Const: - out = append(out, val) - case *ssa.Convert: - out, ok = consts(val.X, out, visitedPhis) - if !ok { - return nil, false - } - default: - return nil, false - } - if len(out) < 2 { - return out, true - } - uniq := []*ssa.Const{out[0]} - for _, val := range out[1:] { - if val.Value == uniq[len(uniq)-1].Value { - continue - } - uniq = append(uniq, val) - } - return uniq, true -} - -func CheckLoopCondition(pass *analysis.Pass) (interface{}, error) { - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - fn := func(node ast.Node) bool { - loop, ok := node.(*ast.ForStmt) - if !ok { - return true - } - if loop.Init == nil || loop.Cond == nil || loop.Post == nil { - return true - } - init, ok := loop.Init.(*ast.AssignStmt) - if !ok || len(init.Lhs) != 1 || len(init.Rhs) != 1 { - return true - } - cond, ok := loop.Cond.(*ast.BinaryExpr) - if !ok { - return true - } - x, ok := cond.X.(*ast.Ident) - if !ok { - return true - } - lhs, ok := init.Lhs[0].(*ast.Ident) - if !ok { - return true - } - if x.Obj != lhs.Obj { - return true - } - if _, ok := loop.Post.(*ast.IncDecStmt); !ok { - return true - } - - v, isAddr := ssafn.ValueForExpr(cond.X) - if v == nil || isAddr { - return true - } - switch v := v.(type) { - case *ssa.Phi: - ops := v.Operands(nil) - if len(ops) != 2 { - return true - } - _, ok := (*ops[0]).(*ssa.Const) - if !ok { - return true - } - sigma, ok := (*ops[1]).(*ssa.Sigma) - if !ok { - return true - } - if sigma.X != v { - return true - } - case *ssa.UnOp: - return true - } - ReportNodef(pass, cond, "variable in loop condition never changes") - - return true - } - Inspect(ssafn.Syntax(), fn) - } - return nil, nil -} - -func CheckArgOverwritten(pass *analysis.Pass) (interface{}, error) { - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - fn := func(node ast.Node) bool { - var typ *ast.FuncType - var body *ast.BlockStmt - switch fn := node.(type) { - case *ast.FuncDecl: - typ = fn.Type - body = fn.Body - case *ast.FuncLit: - typ = fn.Type - body = fn.Body - } - if body == nil { - return true - } - if len(typ.Params.List) == 0 { - return true - } - for _, field := range typ.Params.List { - for _, arg := range field.Names { - obj := pass.TypesInfo.ObjectOf(arg) - var ssaobj *ssa.Parameter - for _, param := range ssafn.Params { - if param.Object() == obj { - ssaobj = param - break - } - } - if ssaobj == nil { - continue - } - refs := ssaobj.Referrers() - if refs == nil { - continue - } - if len(FilterDebug(*refs)) != 0 { - continue - } - - assigned := false - ast.Inspect(body, func(node ast.Node) bool { - assign, ok := node.(*ast.AssignStmt) - if !ok { - return true - } - for _, lhs := range assign.Lhs { - ident, ok := lhs.(*ast.Ident) - if !ok { - continue - } - if pass.TypesInfo.ObjectOf(ident) == obj { - assigned = true - return false - } - } - return true - }) - if assigned { - ReportNodef(pass, arg, "argument %s is overwritten before first use", arg) - } - } - } - return true - } - Inspect(ssafn.Syntax(), fn) - } - return nil, nil -} - -func CheckIneffectiveLoop(pass *analysis.Pass) (interface{}, error) { - // This check detects some, but not all unconditional loop exits. - // We give up in the following cases: - // - // - a goto anywhere in the loop. The goto might skip over our - // return, and we don't check that it doesn't. - // - // - any nested, unlabelled continue, even if it is in another - // loop or closure. - fn := func(node ast.Node) { - var body *ast.BlockStmt - switch fn := node.(type) { - case *ast.FuncDecl: - body = fn.Body - case *ast.FuncLit: - body = fn.Body - default: - panic(fmt.Sprintf("unreachable: %T", node)) - } - if body == nil { - return - } - labels := map[*ast.Object]ast.Stmt{} - ast.Inspect(body, func(node ast.Node) bool { - label, ok := node.(*ast.LabeledStmt) - if !ok { - return true - } - labels[label.Label.Obj] = label.Stmt - return true - }) - - ast.Inspect(body, func(node ast.Node) bool { - var loop ast.Node - var body *ast.BlockStmt - switch node := node.(type) { - case *ast.ForStmt: - body = node.Body - loop = node - case *ast.RangeStmt: - typ := pass.TypesInfo.TypeOf(node.X) - if _, ok := typ.Underlying().(*types.Map); ok { - // looping once over a map is a valid pattern for - // getting an arbitrary element. - return true - } - body = node.Body - loop = node - default: - return true - } - if len(body.List) < 2 { - // avoid flagging the somewhat common pattern of using - // a range loop to get the first element in a slice, - // or the first rune in a string. - return true - } - var unconditionalExit ast.Node - hasBranching := false - for _, stmt := range body.List { - switch stmt := stmt.(type) { - case *ast.BranchStmt: - switch stmt.Tok { - case token.BREAK: - if stmt.Label == nil || labels[stmt.Label.Obj] == loop { - unconditionalExit = stmt - } - case token.CONTINUE: - if stmt.Label == nil || labels[stmt.Label.Obj] == loop { - unconditionalExit = nil - return false - } - } - case *ast.ReturnStmt: - unconditionalExit = stmt - case *ast.IfStmt, *ast.ForStmt, *ast.RangeStmt, *ast.SwitchStmt, *ast.SelectStmt: - hasBranching = true - } - } - if unconditionalExit == nil || !hasBranching { - return false - } - ast.Inspect(body, func(node ast.Node) bool { - if branch, ok := node.(*ast.BranchStmt); ok { - - switch branch.Tok { - case token.GOTO: - unconditionalExit = nil - return false - case token.CONTINUE: - if branch.Label != nil && labels[branch.Label.Obj] != loop { - return true - } - unconditionalExit = nil - return false - } - } - return true - }) - if unconditionalExit != nil { - ReportNodef(pass, unconditionalExit, "the surrounding loop is unconditionally terminated") - } - return true - }) - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.FuncDecl)(nil), (*ast.FuncLit)(nil)}, fn) - return nil, nil -} - -func CheckNilContext(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - call := node.(*ast.CallExpr) - if len(call.Args) == 0 { - return - } - if typ, ok := pass.TypesInfo.TypeOf(call.Args[0]).(*types.Basic); !ok || typ.Kind() != types.UntypedNil { - return - } - sig, ok := pass.TypesInfo.TypeOf(call.Fun).(*types.Signature) - if !ok { - return - } - if sig.Params().Len() == 0 { - return - } - if !IsType(sig.Params().At(0).Type(), "context.Context") { - return - } - ReportNodef(pass, call.Args[0], - "do not pass a nil Context, even if a function permits it; pass context.TODO if you are unsure about which Context to use") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func CheckSeeker(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - call := node.(*ast.CallExpr) - sel, ok := call.Fun.(*ast.SelectorExpr) - if !ok { - return - } - if sel.Sel.Name != "Seek" { - return - } - if len(call.Args) != 2 { - return - } - arg0, ok := call.Args[Arg("(io.Seeker).Seek.offset")].(*ast.SelectorExpr) - if !ok { - return - } - switch arg0.Sel.Name { - case "SeekStart", "SeekCurrent", "SeekEnd": - default: - return - } - pkg, ok := arg0.X.(*ast.Ident) - if !ok { - return - } - if pkg.Name != "io" { - return - } - ReportNodef(pass, call, "the first argument of io.Seeker is the offset, but an io.Seek* constant is being used instead") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func CheckIneffectiveAppend(pass *analysis.Pass) (interface{}, error) { - isAppend := func(ins ssa.Value) bool { - call, ok := ins.(*ssa.Call) - if !ok { - return false - } - if call.Call.IsInvoke() { - return false - } - if builtin, ok := call.Call.Value.(*ssa.Builtin); !ok || builtin.Name() != "append" { - return false - } - return true - } - - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - for _, block := range ssafn.Blocks { - for _, ins := range block.Instrs { - val, ok := ins.(ssa.Value) - if !ok || !isAppend(val) { - continue - } - - isUsed := false - visited := map[ssa.Instruction]bool{} - var walkRefs func(refs []ssa.Instruction) - walkRefs = func(refs []ssa.Instruction) { - loop: - for _, ref := range refs { - if visited[ref] { - continue - } - visited[ref] = true - if _, ok := ref.(*ssa.DebugRef); ok { - continue - } - switch ref := ref.(type) { - case *ssa.Phi: - walkRefs(*ref.Referrers()) - case *ssa.Sigma: - walkRefs(*ref.Referrers()) - case ssa.Value: - if !isAppend(ref) { - isUsed = true - } else { - walkRefs(*ref.Referrers()) - } - case ssa.Instruction: - isUsed = true - break loop - } - } - } - refs := val.Referrers() - if refs == nil { - continue - } - walkRefs(*refs) - if !isUsed { - pass.Reportf(ins.Pos(), "this result of append is never used, except maybe in other appends") - } - } - } - } - return nil, nil -} - -func CheckConcurrentTesting(pass *analysis.Pass) (interface{}, error) { - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - for _, block := range ssafn.Blocks { - for _, ins := range block.Instrs { - gostmt, ok := ins.(*ssa.Go) - if !ok { - continue - } - var fn *ssa.Function - switch val := gostmt.Call.Value.(type) { - case *ssa.Function: - fn = val - case *ssa.MakeClosure: - fn = val.Fn.(*ssa.Function) - default: - continue - } - if fn.Blocks == nil { - continue - } - for _, block := range fn.Blocks { - for _, ins := range block.Instrs { - call, ok := ins.(*ssa.Call) - if !ok { - continue - } - if call.Call.IsInvoke() { - continue - } - callee := call.Call.StaticCallee() - if callee == nil { - continue - } - recv := callee.Signature.Recv() - if recv == nil { - continue - } - if !IsType(recv.Type(), "*testing.common") { - continue - } - fn, ok := call.Call.StaticCallee().Object().(*types.Func) - if !ok { - continue - } - name := fn.Name() - switch name { - case "FailNow", "Fatal", "Fatalf", "SkipNow", "Skip", "Skipf": - default: - continue - } - pass.Reportf(gostmt.Pos(), "the goroutine calls T.%s, which must be called in the same goroutine as the test", name) - } - } - } - } - } - return nil, nil -} - -func eachCall(ssafn *ssa.Function, fn func(caller *ssa.Function, site ssa.CallInstruction, callee *ssa.Function)) { - for _, b := range ssafn.Blocks { - for _, instr := range b.Instrs { - if site, ok := instr.(ssa.CallInstruction); ok { - if g := site.Common().StaticCallee(); g != nil { - fn(ssafn, site, g) - } - } - } - } -} - -func CheckCyclicFinalizer(pass *analysis.Pass) (interface{}, error) { - fn := func(caller *ssa.Function, site ssa.CallInstruction, callee *ssa.Function) { - if callee.RelString(nil) != "runtime.SetFinalizer" { - return - } - arg0 := site.Common().Args[Arg("runtime.SetFinalizer.obj")] - if iface, ok := arg0.(*ssa.MakeInterface); ok { - arg0 = iface.X - } - unop, ok := arg0.(*ssa.UnOp) - if !ok { - return - } - v, ok := unop.X.(*ssa.Alloc) - if !ok { - return - } - arg1 := site.Common().Args[Arg("runtime.SetFinalizer.finalizer")] - if iface, ok := arg1.(*ssa.MakeInterface); ok { - arg1 = iface.X - } - mc, ok := arg1.(*ssa.MakeClosure) - if !ok { - return - } - for _, b := range mc.Bindings { - if b == v { - pos := lint.DisplayPosition(pass.Fset, mc.Fn.Pos()) - pass.Reportf(site.Pos(), "the finalizer closes over the object, preventing the finalizer from ever running (at %s)", pos) - } - } - } - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - eachCall(ssafn, fn) - } - return nil, nil -} - -/* -func CheckSliceOutOfBounds(pass *analysis.Pass) (interface{}, error) { - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - for _, block := range ssafn.Blocks { - for _, ins := range block.Instrs { - ia, ok := ins.(*ssa.IndexAddr) - if !ok { - continue - } - if _, ok := ia.X.Type().Underlying().(*types.Slice); !ok { - continue - } - sr, ok1 := c.funcDescs.Get(ssafn).Ranges[ia.X].(vrp.SliceInterval) - idxr, ok2 := c.funcDescs.Get(ssafn).Ranges[ia.Index].(vrp.IntInterval) - if !ok1 || !ok2 || !sr.IsKnown() || !idxr.IsKnown() || sr.Length.Empty() || idxr.Empty() { - continue - } - if idxr.Lower.Cmp(sr.Length.Upper) >= 0 { - ReportNodef(pass, ia, "index out of bounds") - } - } - } - } - return nil, nil -} -*/ - -func CheckDeferLock(pass *analysis.Pass) (interface{}, error) { - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - for _, block := range ssafn.Blocks { - instrs := FilterDebug(block.Instrs) - if len(instrs) < 2 { - continue - } - for i, ins := range instrs[:len(instrs)-1] { - call, ok := ins.(*ssa.Call) - if !ok { - continue - } - if !IsCallTo(call.Common(), "(*sync.Mutex).Lock") && !IsCallTo(call.Common(), "(*sync.RWMutex).RLock") { - continue - } - nins, ok := instrs[i+1].(*ssa.Defer) - if !ok { - continue - } - if !IsCallTo(&nins.Call, "(*sync.Mutex).Lock") && !IsCallTo(&nins.Call, "(*sync.RWMutex).RLock") { - continue - } - if call.Common().Args[0] != nins.Call.Args[0] { - continue - } - name := shortCallName(call.Common()) - alt := "" - switch name { - case "Lock": - alt = "Unlock" - case "RLock": - alt = "RUnlock" - } - pass.Reportf(nins.Pos(), "deferring %s right after having locked already; did you mean to defer %s?", name, alt) - } - } - } - return nil, nil -} - -func CheckNaNComparison(pass *analysis.Pass) (interface{}, error) { - isNaN := func(v ssa.Value) bool { - call, ok := v.(*ssa.Call) - if !ok { - return false - } - return IsCallTo(call.Common(), "math.NaN") - } - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - for _, block := range ssafn.Blocks { - for _, ins := range block.Instrs { - ins, ok := ins.(*ssa.BinOp) - if !ok { - continue - } - if isNaN(ins.X) || isNaN(ins.Y) { - pass.Reportf(ins.Pos(), "no value is equal to NaN, not even NaN itself") - } - } - } - } - return nil, nil -} - -func CheckInfiniteRecursion(pass *analysis.Pass) (interface{}, error) { - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - eachCall(ssafn, func(caller *ssa.Function, site ssa.CallInstruction, callee *ssa.Function) { - if callee != ssafn { - return - } - if _, ok := site.(*ssa.Go); ok { - // Recursively spawning goroutines doesn't consume - // stack space infinitely, so don't flag it. - return - } - - block := site.Block() - canReturn := false - for _, b := range ssafn.Blocks { - if block.Dominates(b) { - continue - } - if len(b.Instrs) == 0 { - continue - } - if _, ok := b.Instrs[len(b.Instrs)-1].(*ssa.Return); ok { - canReturn = true - break - } - } - if canReturn { - return - } - pass.Reportf(site.Pos(), "infinite recursive call") - }) - } - return nil, nil -} - -func objectName(obj types.Object) string { - if obj == nil { - return "" - } - var name string - if obj.Pkg() != nil && obj.Pkg().Scope().Lookup(obj.Name()) == obj { - s := obj.Pkg().Path() - if s != "" { - name += s + "." - } - } - name += obj.Name() - return name -} - -func isName(pass *analysis.Pass, expr ast.Expr, name string) bool { - var obj types.Object - switch expr := expr.(type) { - case *ast.Ident: - obj = pass.TypesInfo.ObjectOf(expr) - case *ast.SelectorExpr: - obj = pass.TypesInfo.ObjectOf(expr.Sel) - } - return objectName(obj) == name -} - -func CheckLeakyTimeTick(pass *analysis.Pass) (interface{}, error) { - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - if IsInMain(pass, ssafn) || IsInTest(pass, ssafn) { - continue - } - for _, block := range ssafn.Blocks { - for _, ins := range block.Instrs { - call, ok := ins.(*ssa.Call) - if !ok || !IsCallTo(call.Common(), "time.Tick") { - continue - } - if !functions.Terminates(call.Parent()) { - continue - } - pass.Reportf(call.Pos(), "using time.Tick leaks the underlying ticker, consider using it only in endless functions, tests and the main package, and use time.NewTicker here") - } - } - } - return nil, nil -} - -func CheckDoubleNegation(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - unary1 := node.(*ast.UnaryExpr) - unary2, ok := unary1.X.(*ast.UnaryExpr) - if !ok { - return - } - if unary1.Op != token.NOT || unary2.Op != token.NOT { - return - } - ReportNodef(pass, unary1, "negating a boolean twice has no effect; is this a typo?") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.UnaryExpr)(nil)}, fn) - return nil, nil -} - -func hasSideEffects(node ast.Node) bool { - dynamic := false - ast.Inspect(node, func(node ast.Node) bool { - switch node := node.(type) { - case *ast.CallExpr: - dynamic = true - return false - case *ast.UnaryExpr: - if node.Op == token.ARROW { - dynamic = true - return false - } - } - return true - }) - return dynamic -} - -func CheckRepeatedIfElse(pass *analysis.Pass) (interface{}, error) { - seen := map[ast.Node]bool{} - - var collectConds func(ifstmt *ast.IfStmt, inits []ast.Stmt, conds []ast.Expr) ([]ast.Stmt, []ast.Expr) - collectConds = func(ifstmt *ast.IfStmt, inits []ast.Stmt, conds []ast.Expr) ([]ast.Stmt, []ast.Expr) { - seen[ifstmt] = true - if ifstmt.Init != nil { - inits = append(inits, ifstmt.Init) - } - conds = append(conds, ifstmt.Cond) - if elsestmt, ok := ifstmt.Else.(*ast.IfStmt); ok { - return collectConds(elsestmt, inits, conds) - } - return inits, conds - } - fn := func(node ast.Node) { - ifstmt := node.(*ast.IfStmt) - if seen[ifstmt] { - return - } - inits, conds := collectConds(ifstmt, nil, nil) - if len(inits) > 0 { - return - } - for _, cond := range conds { - if hasSideEffects(cond) { - return - } - } - counts := map[string]int{} - for _, cond := range conds { - s := Render(pass, cond) - counts[s]++ - if counts[s] == 2 { - ReportNodef(pass, cond, "this condition occurs multiple times in this if/else if chain") - } - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.IfStmt)(nil)}, fn) - return nil, nil -} - -func CheckSillyBitwiseOps(pass *analysis.Pass) (interface{}, error) { - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - for _, block := range ssafn.Blocks { - for _, ins := range block.Instrs { - ins, ok := ins.(*ssa.BinOp) - if !ok { - continue - } - - if c, ok := ins.Y.(*ssa.Const); !ok || c.Value == nil || c.Value.Kind() != constant.Int || c.Uint64() != 0 { - continue - } - switch ins.Op { - case token.AND, token.OR, token.XOR: - default: - // we do not flag shifts because too often, x<<0 is part - // of a pattern, x<<0, x<<8, x<<16, ... - continue - } - path, _ := astutil.PathEnclosingInterval(File(pass, ins), ins.Pos(), ins.Pos()) - if len(path) == 0 { - continue - } - if node, ok := path[0].(*ast.BinaryExpr); !ok || !IsZero(node.Y) { - continue - } - - switch ins.Op { - case token.AND: - pass.Reportf(ins.Pos(), "x & 0 always equals 0") - case token.OR, token.XOR: - pass.Reportf(ins.Pos(), "x %s 0 always equals x", ins.Op) - } - } - } - } - return nil, nil -} - -func CheckNonOctalFileMode(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - call := node.(*ast.CallExpr) - sig, ok := pass.TypesInfo.TypeOf(call.Fun).(*types.Signature) - if !ok { - return - } - n := sig.Params().Len() - var args []int - for i := 0; i < n; i++ { - typ := sig.Params().At(i).Type() - if IsType(typ, "os.FileMode") { - args = append(args, i) - } - } - for _, i := range args { - lit, ok := call.Args[i].(*ast.BasicLit) - if !ok { - continue - } - if len(lit.Value) == 3 && - lit.Value[0] != '0' && - lit.Value[0] >= '0' && lit.Value[0] <= '7' && - lit.Value[1] >= '0' && lit.Value[1] <= '7' && - lit.Value[2] >= '0' && lit.Value[2] <= '7' { - - v, err := strconv.ParseInt(lit.Value, 10, 64) - if err != nil { - continue - } - ReportNodef(pass, call.Args[i], "file mode '%s' evaluates to %#o; did you mean '0%s'?", lit.Value, v, lit.Value) - } - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func CheckPureFunctions(pass *analysis.Pass) (interface{}, error) { - pure := pass.ResultOf[facts.Purity].(facts.PurityResult) - -fnLoop: - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - if IsInTest(pass, ssafn) { - params := ssafn.Signature.Params() - for i := 0; i < params.Len(); i++ { - param := params.At(i) - if IsType(param.Type(), "*testing.B") { - // Ignore discarded pure functions in code related - // to benchmarks. Instead of matching BenchmarkFoo - // functions, we match any function accepting a - // *testing.B. Benchmarks sometimes call generic - // functions for doing the actual work, and - // checking for the parameter is a lot easier and - // faster than analyzing call trees. - continue fnLoop - } - } - } - - for _, b := range ssafn.Blocks { - for _, ins := range b.Instrs { - ins, ok := ins.(*ssa.Call) - if !ok { - continue - } - refs := ins.Referrers() - if refs == nil || len(FilterDebug(*refs)) > 0 { - continue - } - callee := ins.Common().StaticCallee() - if callee == nil { - continue - } - if callee.Object() == nil { - // TODO(dh): support anonymous functions - continue - } - if _, ok := pure[callee.Object().(*types.Func)]; ok { - pass.Reportf(ins.Pos(), "%s is a pure function but its return value is ignored", callee.Name()) - continue - } - } - } - } - return nil, nil -} - -func CheckDeprecated(pass *analysis.Pass) (interface{}, error) { - deprs := pass.ResultOf[facts.Deprecated].(facts.DeprecatedResult) - - // Selectors can appear outside of function literals, e.g. when - // declaring package level variables. - - var tfn types.Object - stack := 0 - fn := func(node ast.Node, push bool) bool { - if !push { - stack-- - return false - } - stack++ - if stack == 1 { - tfn = nil - } - if fn, ok := node.(*ast.FuncDecl); ok { - tfn = pass.TypesInfo.ObjectOf(fn.Name) - } - sel, ok := node.(*ast.SelectorExpr) - if !ok { - return true - } - - obj := pass.TypesInfo.ObjectOf(sel.Sel) - if obj.Pkg() == nil { - return true - } - if pass.Pkg == obj.Pkg() || obj.Pkg().Path()+"_test" == pass.Pkg.Path() { - // Don't flag stuff in our own package - return true - } - if depr, ok := deprs.Objects[obj]; ok { - // Look for the first available alternative, not the first - // version something was deprecated in. If a function was - // deprecated in Go 1.6, an alternative has been available - // already in 1.0, and we're targeting 1.2, it still - // makes sense to use the alternative from 1.0, to be - // future-proof. - minVersion := deprecated.Stdlib[SelectorName(pass, sel)].AlternativeAvailableSince - if !IsGoVersion(pass, minVersion) { - return true - } - - if tfn != nil { - if _, ok := deprs.Objects[tfn]; ok { - // functions that are deprecated may use deprecated - // symbols - return true - } - } - ReportNodef(pass, sel, "%s is deprecated: %s", Render(pass, sel), depr.Msg) - return true - } - return true - } - - imps := map[string]*types.Package{} - for _, imp := range pass.Pkg.Imports() { - imps[imp.Path()] = imp - } - fn2 := func(node ast.Node) { - spec := node.(*ast.ImportSpec) - p := spec.Path.Value - path := p[1 : len(p)-1] - imp := imps[path] - if depr, ok := deprs.Packages[imp]; ok { - ReportNodef(pass, spec, "Package %s is deprecated: %s", path, depr.Msg) - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Nodes(nil, fn) - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.ImportSpec)(nil)}, fn2) - return nil, nil -} - -func callChecker(rules map[string]CallCheck) func(pass *analysis.Pass) (interface{}, error) { - return func(pass *analysis.Pass) (interface{}, error) { - return checkCalls(pass, rules) - } -} - -func checkCalls(pass *analysis.Pass, rules map[string]CallCheck) (interface{}, error) { - ranges := pass.ResultOf[valueRangesAnalyzer].(map[*ssa.Function]vrp.Ranges) - fn := func(caller *ssa.Function, site ssa.CallInstruction, callee *ssa.Function) { - obj, ok := callee.Object().(*types.Func) - if !ok { - return - } - - r, ok := rules[lint.FuncName(obj)] - if !ok { - return - } - var args []*Argument - ssaargs := site.Common().Args - if callee.Signature.Recv() != nil { - ssaargs = ssaargs[1:] - } - for _, arg := range ssaargs { - if iarg, ok := arg.(*ssa.MakeInterface); ok { - arg = iarg.X - } - vr := ranges[site.Parent()][arg] - args = append(args, &Argument{Value: Value{arg, vr}}) - } - call := &Call{ - Pass: pass, - Instr: site, - Args: args, - Parent: site.Parent(), - } - r(call) - for idx, arg := range call.Args { - _ = idx - for _, e := range arg.invalids { - // path, _ := astutil.PathEnclosingInterval(f.File, edge.Site.Pos(), edge.Site.Pos()) - // if len(path) < 2 { - // continue - // } - // astcall, ok := path[0].(*ast.CallExpr) - // if !ok { - // continue - // } - // pass.Reportf(astcall.Args[idx], "%s", e) - - pass.Reportf(site.Pos(), "%s", e) - } - } - for _, e := range call.invalids { - pass.Reportf(call.Instr.Common().Pos(), "%s", e) - } - } - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - eachCall(ssafn, fn) - } - return nil, nil -} - -func shortCallName(call *ssa.CallCommon) string { - if call.IsInvoke() { - return "" - } - switch v := call.Value.(type) { - case *ssa.Function: - fn, ok := v.Object().(*types.Func) - if !ok { - return "" - } - return fn.Name() - case *ssa.Builtin: - return v.Name() - } - return "" -} - -func CheckWriterBufferModified(pass *analysis.Pass) (interface{}, error) { - // TODO(dh): this might be a good candidate for taint analysis. - // Taint the argument as MUST_NOT_MODIFY, then propagate that - // through functions like bytes.Split - - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - sig := ssafn.Signature - if ssafn.Name() != "Write" || sig.Recv() == nil || sig.Params().Len() != 1 || sig.Results().Len() != 2 { - continue - } - tArg, ok := sig.Params().At(0).Type().(*types.Slice) - if !ok { - continue - } - if basic, ok := tArg.Elem().(*types.Basic); !ok || basic.Kind() != types.Byte { - continue - } - if basic, ok := sig.Results().At(0).Type().(*types.Basic); !ok || basic.Kind() != types.Int { - continue - } - if named, ok := sig.Results().At(1).Type().(*types.Named); !ok || !IsType(named, "error") { - continue - } - - for _, block := range ssafn.Blocks { - for _, ins := range block.Instrs { - switch ins := ins.(type) { - case *ssa.Store: - addr, ok := ins.Addr.(*ssa.IndexAddr) - if !ok { - continue - } - if addr.X != ssafn.Params[1] { - continue - } - pass.Reportf(ins.Pos(), "io.Writer.Write must not modify the provided buffer, not even temporarily") - case *ssa.Call: - if !IsCallTo(ins.Common(), "append") { - continue - } - if ins.Common().Args[0] != ssafn.Params[1] { - continue - } - pass.Reportf(ins.Pos(), "io.Writer.Write must not modify the provided buffer, not even temporarily") - } - } - } - } - return nil, nil -} - -func loopedRegexp(name string) CallCheck { - return func(call *Call) { - if len(extractConsts(call.Args[0].Value.Value)) == 0 { - return - } - if !isInLoop(call.Instr.Block()) { - return - } - call.Invalid(fmt.Sprintf("calling %s in a loop has poor performance, consider using regexp.Compile", name)) - } -} - -func CheckEmptyBranch(pass *analysis.Pass) (interface{}, error) { - for _, ssafn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - if ssafn.Syntax() == nil { - continue - } - if IsExample(ssafn) { - continue - } - fn := func(node ast.Node) bool { - ifstmt, ok := node.(*ast.IfStmt) - if !ok { - return true - } - if ifstmt.Else != nil { - b, ok := ifstmt.Else.(*ast.BlockStmt) - if !ok || len(b.List) != 0 { - return true - } - ReportfFG(pass, ifstmt.Else.Pos(), "empty branch") - } - if len(ifstmt.Body.List) != 0 { - return true - } - ReportfFG(pass, ifstmt.Pos(), "empty branch") - return true - } - Inspect(ssafn.Syntax(), fn) - } - return nil, nil -} - -func CheckMapBytesKey(pass *analysis.Pass) (interface{}, error) { - for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - for _, b := range fn.Blocks { - insLoop: - for _, ins := range b.Instrs { - // find []byte -> string conversions - conv, ok := ins.(*ssa.Convert) - if !ok || conv.Type() != types.Universe.Lookup("string").Type() { - continue - } - if s, ok := conv.X.Type().(*types.Slice); !ok || s.Elem() != types.Universe.Lookup("byte").Type() { - continue - } - refs := conv.Referrers() - // need at least two (DebugRef) references: the - // conversion and the *ast.Ident - if refs == nil || len(*refs) < 2 { - continue - } - ident := false - // skip first reference, that's the conversion itself - for _, ref := range (*refs)[1:] { - switch ref := ref.(type) { - case *ssa.DebugRef: - if _, ok := ref.Expr.(*ast.Ident); !ok { - // the string seems to be used somewhere - // unexpected; the default branch should - // catch this already, but be safe - continue insLoop - } else { - ident = true - } - case *ssa.Lookup: - default: - // the string is used somewhere else than a - // map lookup - continue insLoop - } - } - - // the result of the conversion wasn't assigned to an - // identifier - if !ident { - continue - } - pass.Reportf(conv.Pos(), "m[string(key)] would be more efficient than k := string(key); m[k]") - } - } - } - return nil, nil -} - -func CheckRangeStringRunes(pass *analysis.Pass) (interface{}, error) { - return sharedcheck.CheckRangeStringRunes(pass) -} - -func CheckSelfAssignment(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - assign := node.(*ast.AssignStmt) - if assign.Tok != token.ASSIGN || len(assign.Lhs) != len(assign.Rhs) { - return - } - for i, stmt := range assign.Lhs { - rlh := Render(pass, stmt) - rrh := Render(pass, assign.Rhs[i]) - if rlh == rrh { - ReportfFG(pass, assign.Pos(), "self-assignment of %s to %s", rrh, rlh) - } - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.AssignStmt)(nil)}, fn) - return nil, nil -} - -func buildTagsIdentical(s1, s2 []string) bool { - if len(s1) != len(s2) { - return false - } - s1s := make([]string, len(s1)) - copy(s1s, s1) - sort.Strings(s1s) - s2s := make([]string, len(s2)) - copy(s2s, s2) - sort.Strings(s2s) - for i, s := range s1s { - if s != s2s[i] { - return false - } - } - return true -} - -func CheckDuplicateBuildConstraints(pass *analysis.Pass) (interface{}, error) { - for _, f := range pass.Files { - constraints := buildTags(f) - for i, constraint1 := range constraints { - for j, constraint2 := range constraints { - if i >= j { - continue - } - if buildTagsIdentical(constraint1, constraint2) { - ReportfFG(pass, f.Pos(), "identical build constraints %q and %q", - strings.Join(constraint1, " "), - strings.Join(constraint2, " ")) - } - } - } - } - return nil, nil -} - -func CheckSillyRegexp(pass *analysis.Pass) (interface{}, error) { - // We could use the rule checking engine for this, but the - // arguments aren't really invalid. - for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - for _, b := range fn.Blocks { - for _, ins := range b.Instrs { - call, ok := ins.(*ssa.Call) - if !ok { - continue - } - switch CallName(call.Common()) { - case "regexp.MustCompile", "regexp.Compile", "regexp.Match", "regexp.MatchReader", "regexp.MatchString": - default: - continue - } - c, ok := call.Common().Args[0].(*ssa.Const) - if !ok { - continue - } - s := constant.StringVal(c.Value) - re, err := syntax.Parse(s, 0) - if err != nil { - continue - } - if re.Op != syntax.OpLiteral && re.Op != syntax.OpEmptyMatch { - continue - } - pass.Reportf(call.Pos(), "regular expression does not contain any meta characters") - } - } - } - return nil, nil -} - -func CheckMissingEnumTypesInDeclaration(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - decl := node.(*ast.GenDecl) - if !decl.Lparen.IsValid() { - return - } - if decl.Tok != token.CONST { - return - } - - groups := GroupSpecs(pass.Fset, decl.Specs) - groupLoop: - for _, group := range groups { - if len(group) < 2 { - continue - } - if group[0].(*ast.ValueSpec).Type == nil { - // first constant doesn't have a type - continue groupLoop - } - for i, spec := range group { - spec := spec.(*ast.ValueSpec) - if len(spec.Names) != 1 || len(spec.Values) != 1 { - continue groupLoop - } - switch v := spec.Values[0].(type) { - case *ast.BasicLit: - case *ast.UnaryExpr: - if _, ok := v.X.(*ast.BasicLit); !ok { - continue groupLoop - } - default: - // if it's not a literal it might be typed, such as - // time.Microsecond = 1000 * Nanosecond - continue groupLoop - } - if i == 0 { - continue - } - if spec.Type != nil { - continue groupLoop - } - } - ReportNodef(pass, group[0], "only the first constant in this group has an explicit type") - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.GenDecl)(nil)}, fn) - return nil, nil -} - -func CheckTimerResetReturnValue(pass *analysis.Pass) (interface{}, error) { - for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - for _, block := range fn.Blocks { - for _, ins := range block.Instrs { - call, ok := ins.(*ssa.Call) - if !ok { - continue - } - if !IsCallTo(call.Common(), "(*time.Timer).Reset") { - continue - } - refs := call.Referrers() - if refs == nil { - continue - } - for _, ref := range FilterDebug(*refs) { - ifstmt, ok := ref.(*ssa.If) - if !ok { - continue - } - - found := false - for _, succ := range ifstmt.Block().Succs { - if len(succ.Preds) != 1 { - // Merge point, not a branch in the - // syntactical sense. - - // FIXME(dh): this is broken for if - // statements a la "if x || y" - continue - } - ssautil.Walk(succ, func(b *ssa.BasicBlock) bool { - if !succ.Dominates(b) { - // We've reached the end of the branch - return false - } - for _, ins := range b.Instrs { - // TODO(dh): we should check that - // we're receiving from the channel of - // a time.Timer to further reduce - // false positives. Not a key - // priority, considering the rarity of - // Reset and the tiny likeliness of a - // false positive - if ins, ok := ins.(*ssa.UnOp); ok && ins.Op == token.ARROW && IsType(ins.X.Type(), "<-chan time.Time") { - found = true - return false - } - } - return true - }) - } - - if found { - pass.Reportf(call.Pos(), "it is not possible to use Reset's return value correctly, as there is a race condition between draining the channel and the new timer expiring") - } - } - } - } - } - return nil, nil -} - -func CheckToLowerToUpperComparison(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - binExpr := node.(*ast.BinaryExpr) - - var negative bool - switch binExpr.Op { - case token.EQL: - negative = false - case token.NEQ: - negative = true - default: - return - } - - const ( - lo = "strings.ToLower" - up = "strings.ToUpper" - ) - - var call string - if IsCallToAST(pass, binExpr.X, lo) && IsCallToAST(pass, binExpr.Y, lo) { - call = lo - } else if IsCallToAST(pass, binExpr.X, up) && IsCallToAST(pass, binExpr.Y, up) { - call = up - } else { - return - } - - bang := "" - if negative { - bang = "!" - } - - ReportNodef(pass, binExpr, "should use %sstrings.EqualFold(a, b) instead of %s(a) %s %s(b)", bang, call, binExpr.Op, call) - } - - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn) - return nil, nil -} - -func CheckUnreachableTypeCases(pass *analysis.Pass) (interface{}, error) { - // Check if T subsumes V in a type switch. T subsumes V if T is an interface and T's method set is a subset of V's method set. - subsumes := func(T, V types.Type) bool { - tIface, ok := T.Underlying().(*types.Interface) - if !ok { - return false - } - - return types.Implements(V, tIface) - } - - subsumesAny := func(Ts, Vs []types.Type) (types.Type, types.Type, bool) { - for _, T := range Ts { - for _, V := range Vs { - if subsumes(T, V) { - return T, V, true - } - } - } - - return nil, nil, false - } - - fn := func(node ast.Node) { - tsStmt := node.(*ast.TypeSwitchStmt) - - type ccAndTypes struct { - cc *ast.CaseClause - types []types.Type - } - - // All asserted types in the order of case clauses. - ccs := make([]ccAndTypes, 0, len(tsStmt.Body.List)) - for _, stmt := range tsStmt.Body.List { - cc, _ := stmt.(*ast.CaseClause) - - // Exclude the 'default' case. - if len(cc.List) == 0 { - continue - } - - Ts := make([]types.Type, len(cc.List)) - for i, expr := range cc.List { - Ts[i] = pass.TypesInfo.TypeOf(expr) - } - - ccs = append(ccs, ccAndTypes{cc: cc, types: Ts}) - } - - if len(ccs) <= 1 { - // Zero or one case clauses, nothing to check. - return - } - - // Check if case clauses following cc have types that are subsumed by cc. - for i, cc := range ccs[:len(ccs)-1] { - for _, next := range ccs[i+1:] { - if T, V, yes := subsumesAny(cc.types, next.types); yes { - ReportNodef(pass, next.cc, "unreachable case clause: %s will always match before %s", T.String(), V.String()) - } - } - } - } - - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.TypeSwitchStmt)(nil)}, fn) - return nil, nil -} - -func CheckSingleArgAppend(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - if !IsCallToAST(pass, node, "append") { - return - } - call := node.(*ast.CallExpr) - if len(call.Args) != 1 { - return - } - ReportfFG(pass, call.Pos(), "x = append(y) is equivalent to x = y") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.CallExpr)(nil)}, fn) - return nil, nil -} - -func CheckStructTags(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - for _, field := range node.(*ast.StructType).Fields.List { - if field.Tag == nil { - continue - } - tags, err := parseStructTag(field.Tag.Value[1 : len(field.Tag.Value)-1]) - if err != nil { - ReportNodef(pass, field.Tag, "unparseable struct tag: %s", err) - continue - } - for k, v := range tags { - if len(v) > 1 { - ReportNodef(pass, field.Tag, "duplicate struct tag %q", k) - continue - } - - switch k { - case "json": - checkJSONTag(pass, field, v[0]) - case "xml": - checkXMLTag(pass, field, v[0]) - } - } - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.StructType)(nil)}, fn) - return nil, nil -} - -func checkJSONTag(pass *analysis.Pass, field *ast.Field, tag string) { - //lint:ignore SA9003 TODO(dh): should we flag empty tags? - if len(tag) == 0 { - } - fields := strings.Split(tag, ",") - for _, r := range fields[0] { - if !unicode.IsLetter(r) && !unicode.IsDigit(r) && !strings.ContainsRune("!#$%&()*+-./:<=>?@[]^_{|}~ ", r) { - ReportNodef(pass, field.Tag, "invalid JSON field name %q", fields[0]) - } - } - var co, cs, ci int - for _, s := range fields[1:] { - switch s { - case "omitempty": - co++ - case "": - // allow stuff like "-," - case "string": - cs++ - // only for string, floating point, integer and bool - T := Dereference(pass.TypesInfo.TypeOf(field.Type).Underlying()).Underlying() - basic, ok := T.(*types.Basic) - if !ok || (basic.Info()&(types.IsBoolean|types.IsInteger|types.IsFloat|types.IsString)) == 0 { - ReportNodef(pass, field.Tag, "the JSON string option only applies to fields of type string, floating point, integer or bool, or pointers to those") - } - case "inline": - ci++ - default: - ReportNodef(pass, field.Tag, "unknown JSON option %q", s) - } - } - if co > 1 { - ReportNodef(pass, field.Tag, `duplicate JSON option "omitempty"`) - } - if cs > 1 { - ReportNodef(pass, field.Tag, `duplicate JSON option "string"`) - } - if ci > 1 { - ReportNodef(pass, field.Tag, `duplicate JSON option "inline"`) - } -} - -func checkXMLTag(pass *analysis.Pass, field *ast.Field, tag string) { - //lint:ignore SA9003 TODO(dh): should we flag empty tags? - if len(tag) == 0 { - } - fields := strings.Split(tag, ",") - counts := map[string]int{} - var exclusives []string - for _, s := range fields[1:] { - switch s { - case "attr", "chardata", "cdata", "innerxml", "comment": - counts[s]++ - if counts[s] == 1 { - exclusives = append(exclusives, s) - } - case "omitempty", "any": - counts[s]++ - case "": - default: - ReportNodef(pass, field.Tag, "unknown XML option %q", s) - } - } - for k, v := range counts { - if v > 1 { - ReportNodef(pass, field.Tag, "duplicate XML option %q", k) - } - } - if len(exclusives) > 1 { - ReportNodef(pass, field.Tag, "XML options %s are mutually exclusive", strings.Join(exclusives, " and ")) - } -} diff --git a/vendor/honnef.co/go/tools/staticcheck/rules.go b/vendor/honnef.co/go/tools/staticcheck/rules.go deleted file mode 100644 index 0152cac1af1..00000000000 --- a/vendor/honnef.co/go/tools/staticcheck/rules.go +++ /dev/null @@ -1,321 +0,0 @@ -package staticcheck - -import ( - "fmt" - "go/constant" - "go/types" - "net" - "net/url" - "regexp" - "sort" - "strconv" - "strings" - "time" - "unicode/utf8" - - "golang.org/x/tools/go/analysis" - . "honnef.co/go/tools/lint/lintdsl" - "honnef.co/go/tools/ssa" - "honnef.co/go/tools/staticcheck/vrp" -) - -const ( - MsgInvalidHostPort = "invalid port or service name in host:port pair" - MsgInvalidUTF8 = "argument is not a valid UTF-8 encoded string" - MsgNonUniqueCutset = "cutset contains duplicate characters" -) - -type Call struct { - Pass *analysis.Pass - Instr ssa.CallInstruction - Args []*Argument - - Parent *ssa.Function - - invalids []string -} - -func (c *Call) Invalid(msg string) { - c.invalids = append(c.invalids, msg) -} - -type Argument struct { - Value Value - invalids []string -} - -func (arg *Argument) Invalid(msg string) { - arg.invalids = append(arg.invalids, msg) -} - -type Value struct { - Value ssa.Value - Range vrp.Range -} - -type CallCheck func(call *Call) - -func extractConsts(v ssa.Value) []*ssa.Const { - switch v := v.(type) { - case *ssa.Const: - return []*ssa.Const{v} - case *ssa.MakeInterface: - return extractConsts(v.X) - default: - return nil - } -} - -func ValidateRegexp(v Value) error { - for _, c := range extractConsts(v.Value) { - if c.Value == nil { - continue - } - if c.Value.Kind() != constant.String { - continue - } - s := constant.StringVal(c.Value) - if _, err := regexp.Compile(s); err != nil { - return err - } - } - return nil -} - -func ValidateTimeLayout(v Value) error { - for _, c := range extractConsts(v.Value) { - if c.Value == nil { - continue - } - if c.Value.Kind() != constant.String { - continue - } - s := constant.StringVal(c.Value) - s = strings.Replace(s, "_", " ", -1) - s = strings.Replace(s, "Z", "-", -1) - _, err := time.Parse(s, s) - if err != nil { - return err - } - } - return nil -} - -func ValidateURL(v Value) error { - for _, c := range extractConsts(v.Value) { - if c.Value == nil { - continue - } - if c.Value.Kind() != constant.String { - continue - } - s := constant.StringVal(c.Value) - _, err := url.Parse(s) - if err != nil { - return fmt.Errorf("%q is not a valid URL: %s", s, err) - } - } - return nil -} - -func IntValue(v Value, z vrp.Z) bool { - r, ok := v.Range.(vrp.IntInterval) - if !ok || !r.IsKnown() { - return false - } - if r.Lower != r.Upper { - return false - } - if r.Lower.Cmp(z) == 0 { - return true - } - return false -} - -func InvalidUTF8(v Value) bool { - for _, c := range extractConsts(v.Value) { - if c.Value == nil { - continue - } - if c.Value.Kind() != constant.String { - continue - } - s := constant.StringVal(c.Value) - if !utf8.ValidString(s) { - return true - } - } - return false -} - -func UnbufferedChannel(v Value) bool { - r, ok := v.Range.(vrp.ChannelInterval) - if !ok || !r.IsKnown() { - return false - } - if r.Size.Lower.Cmp(vrp.NewZ(0)) == 0 && - r.Size.Upper.Cmp(vrp.NewZ(0)) == 0 { - return true - } - return false -} - -func Pointer(v Value) bool { - switch v.Value.Type().Underlying().(type) { - case *types.Pointer, *types.Interface: - return true - } - return false -} - -func ConvertedFromInt(v Value) bool { - conv, ok := v.Value.(*ssa.Convert) - if !ok { - return false - } - b, ok := conv.X.Type().Underlying().(*types.Basic) - if !ok { - return false - } - if (b.Info() & types.IsInteger) == 0 { - return false - } - return true -} - -func validEncodingBinaryType(pass *analysis.Pass, typ types.Type) bool { - typ = typ.Underlying() - switch typ := typ.(type) { - case *types.Basic: - switch typ.Kind() { - case types.Uint8, types.Uint16, types.Uint32, types.Uint64, - types.Int8, types.Int16, types.Int32, types.Int64, - types.Float32, types.Float64, types.Complex64, types.Complex128, types.Invalid: - return true - case types.Bool: - return IsGoVersion(pass, 8) - } - return false - case *types.Struct: - n := typ.NumFields() - for i := 0; i < n; i++ { - if !validEncodingBinaryType(pass, typ.Field(i).Type()) { - return false - } - } - return true - case *types.Array: - return validEncodingBinaryType(pass, typ.Elem()) - case *types.Interface: - // we can't determine if it's a valid type or not - return true - } - return false -} - -func CanBinaryMarshal(pass *analysis.Pass, v Value) bool { - typ := v.Value.Type().Underlying() - if ttyp, ok := typ.(*types.Pointer); ok { - typ = ttyp.Elem().Underlying() - } - if ttyp, ok := typ.(interface { - Elem() types.Type - }); ok { - if _, ok := ttyp.(*types.Pointer); !ok { - typ = ttyp.Elem() - } - } - - return validEncodingBinaryType(pass, typ) -} - -func RepeatZeroTimes(name string, arg int) CallCheck { - return func(call *Call) { - arg := call.Args[arg] - if IntValue(arg.Value, vrp.NewZ(0)) { - arg.Invalid(fmt.Sprintf("calling %s with n == 0 will return no results, did you mean -1?", name)) - } - } -} - -func validateServiceName(s string) bool { - if len(s) < 1 || len(s) > 15 { - return false - } - if s[0] == '-' || s[len(s)-1] == '-' { - return false - } - if strings.Contains(s, "--") { - return false - } - hasLetter := false - for _, r := range s { - if (r >= 'A' && r <= 'Z') || (r >= 'a' && r <= 'z') { - hasLetter = true - continue - } - if r >= '0' && r <= '9' { - continue - } - return false - } - return hasLetter -} - -func validatePort(s string) bool { - n, err := strconv.ParseInt(s, 10, 64) - if err != nil { - return validateServiceName(s) - } - return n >= 0 && n <= 65535 -} - -func ValidHostPort(v Value) bool { - for _, k := range extractConsts(v.Value) { - if k.Value == nil { - continue - } - if k.Value.Kind() != constant.String { - continue - } - s := constant.StringVal(k.Value) - _, port, err := net.SplitHostPort(s) - if err != nil { - return false - } - // TODO(dh): check hostname - if !validatePort(port) { - return false - } - } - return true -} - -// ConvertedFrom reports whether value v was converted from type typ. -func ConvertedFrom(v Value, typ string) bool { - change, ok := v.Value.(*ssa.ChangeType) - return ok && IsType(change.X.Type(), typ) -} - -func UniqueStringCutset(v Value) bool { - for _, c := range extractConsts(v.Value) { - if c.Value == nil { - continue - } - if c.Value.Kind() != constant.String { - continue - } - s := constant.StringVal(c.Value) - rs := runeSlice(s) - if len(rs) < 2 { - continue - } - sort.Sort(rs) - for i, r := range rs[1:] { - if rs[i] == r { - return false - } - } - } - return true -} diff --git a/vendor/honnef.co/go/tools/staticcheck/structtag.go b/vendor/honnef.co/go/tools/staticcheck/structtag.go deleted file mode 100644 index 38830a22c63..00000000000 --- a/vendor/honnef.co/go/tools/staticcheck/structtag.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Copyright 2019 Dominik Honnef. All rights reserved. - -package staticcheck - -import "strconv" - -func parseStructTag(tag string) (map[string][]string, error) { - // FIXME(dh): detect missing closing quote - out := map[string][]string{} - - for tag != "" { - // Skip leading space. - i := 0 - for i < len(tag) && tag[i] == ' ' { - i++ - } - tag = tag[i:] - if tag == "" { - break - } - - // Scan to colon. A space, a quote or a control character is a syntax error. - // Strictly speaking, control chars include the range [0x7f, 0x9f], not just - // [0x00, 0x1f], but in practice, we ignore the multi-byte control characters - // as it is simpler to inspect the tag's bytes than the tag's runes. - i = 0 - for i < len(tag) && tag[i] > ' ' && tag[i] != ':' && tag[i] != '"' && tag[i] != 0x7f { - i++ - } - if i == 0 || i+1 >= len(tag) || tag[i] != ':' || tag[i+1] != '"' { - break - } - name := string(tag[:i]) - tag = tag[i+1:] - - // Scan quoted string to find value. - i = 1 - for i < len(tag) && tag[i] != '"' { - if tag[i] == '\\' { - i++ - } - i++ - } - if i >= len(tag) { - break - } - qvalue := string(tag[:i+1]) - tag = tag[i+1:] - - value, err := strconv.Unquote(qvalue) - if err != nil { - return nil, err - } - out[name] = append(out[name], value) - } - return out, nil -} diff --git a/vendor/honnef.co/go/tools/staticcheck/vrp/BUILD b/vendor/honnef.co/go/tools/staticcheck/vrp/BUILD deleted file mode 100644 index b727579bd61..00000000000 --- a/vendor/honnef.co/go/tools/staticcheck/vrp/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "channel.go", - "int.go", - "slice.go", - "string.go", - "vrp.go", - ], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/staticcheck/vrp", - importpath = "honnef.co/go/tools/staticcheck/vrp", - visibility = ["//visibility:public"], - deps = [ - "//vendor/honnef.co/go/tools/lint:go_default_library", - "//vendor/honnef.co/go/tools/ssa:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/staticcheck/vrp/channel.go b/vendor/honnef.co/go/tools/staticcheck/vrp/channel.go deleted file mode 100644 index 0ef73787ba3..00000000000 --- a/vendor/honnef.co/go/tools/staticcheck/vrp/channel.go +++ /dev/null @@ -1,73 +0,0 @@ -package vrp - -import ( - "fmt" - - "honnef.co/go/tools/ssa" -) - -type ChannelInterval struct { - Size IntInterval -} - -func (c ChannelInterval) Union(other Range) Range { - i, ok := other.(ChannelInterval) - if !ok { - i = ChannelInterval{EmptyIntInterval} - } - if c.Size.Empty() || !c.Size.IsKnown() { - return i - } - if i.Size.Empty() || !i.Size.IsKnown() { - return c - } - return ChannelInterval{ - Size: c.Size.Union(i.Size).(IntInterval), - } -} - -func (c ChannelInterval) String() string { - return c.Size.String() -} - -func (c ChannelInterval) IsKnown() bool { - return c.Size.IsKnown() -} - -type MakeChannelConstraint struct { - aConstraint - Buffer ssa.Value -} -type ChannelChangeTypeConstraint struct { - aConstraint - X ssa.Value -} - -func NewMakeChannelConstraint(buffer, y ssa.Value) Constraint { - return &MakeChannelConstraint{NewConstraint(y), buffer} -} -func NewChannelChangeTypeConstraint(x, y ssa.Value) Constraint { - return &ChannelChangeTypeConstraint{NewConstraint(y), x} -} - -func (c *MakeChannelConstraint) Operands() []ssa.Value { return []ssa.Value{c.Buffer} } -func (c *ChannelChangeTypeConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} } - -func (c *MakeChannelConstraint) String() string { - return fmt.Sprintf("%s = make(chan, %s)", c.Y().Name(), c.Buffer.Name()) -} -func (c *ChannelChangeTypeConstraint) String() string { - return fmt.Sprintf("%s = changetype(%s)", c.Y().Name(), c.X.Name()) -} - -func (c *MakeChannelConstraint) Eval(g *Graph) Range { - i, ok := g.Range(c.Buffer).(IntInterval) - if !ok { - return ChannelInterval{NewIntInterval(NewZ(0), PInfinity)} - } - if i.Lower.Sign() == -1 { - i.Lower = NewZ(0) - } - return ChannelInterval{i} -} -func (c *ChannelChangeTypeConstraint) Eval(g *Graph) Range { return g.Range(c.X) } diff --git a/vendor/honnef.co/go/tools/staticcheck/vrp/int.go b/vendor/honnef.co/go/tools/staticcheck/vrp/int.go deleted file mode 100644 index 926bb7af3d6..00000000000 --- a/vendor/honnef.co/go/tools/staticcheck/vrp/int.go +++ /dev/null @@ -1,476 +0,0 @@ -package vrp - -import ( - "fmt" - "go/token" - "go/types" - "math/big" - - "honnef.co/go/tools/ssa" -) - -type Zs []Z - -func (zs Zs) Len() int { - return len(zs) -} - -func (zs Zs) Less(i int, j int) bool { - return zs[i].Cmp(zs[j]) == -1 -} - -func (zs Zs) Swap(i int, j int) { - zs[i], zs[j] = zs[j], zs[i] -} - -type Z struct { - infinity int8 - integer *big.Int -} - -func NewZ(n int64) Z { - return NewBigZ(big.NewInt(n)) -} - -func NewBigZ(n *big.Int) Z { - return Z{integer: n} -} - -func (z1 Z) Infinite() bool { - return z1.infinity != 0 -} - -func (z1 Z) Add(z2 Z) Z { - if z2.Sign() == -1 { - return z1.Sub(z2.Negate()) - } - if z1 == NInfinity { - return NInfinity - } - if z1 == PInfinity { - return PInfinity - } - if z2 == PInfinity { - return PInfinity - } - - if !z1.Infinite() && !z2.Infinite() { - n := &big.Int{} - n.Add(z1.integer, z2.integer) - return NewBigZ(n) - } - - panic(fmt.Sprintf("%s + %s is not defined", z1, z2)) -} - -func (z1 Z) Sub(z2 Z) Z { - if z2.Sign() == -1 { - return z1.Add(z2.Negate()) - } - if !z1.Infinite() && !z2.Infinite() { - n := &big.Int{} - n.Sub(z1.integer, z2.integer) - return NewBigZ(n) - } - - if z1 != PInfinity && z2 == PInfinity { - return NInfinity - } - if z1.Infinite() && !z2.Infinite() { - return Z{infinity: z1.infinity} - } - if z1 == PInfinity && z2 == PInfinity { - return PInfinity - } - panic(fmt.Sprintf("%s - %s is not defined", z1, z2)) -} - -func (z1 Z) Mul(z2 Z) Z { - if (z1.integer != nil && z1.integer.Sign() == 0) || - (z2.integer != nil && z2.integer.Sign() == 0) { - return NewBigZ(&big.Int{}) - } - - if z1.infinity != 0 || z2.infinity != 0 { - return Z{infinity: int8(z1.Sign() * z2.Sign())} - } - - n := &big.Int{} - n.Mul(z1.integer, z2.integer) - return NewBigZ(n) -} - -func (z1 Z) Negate() Z { - if z1.infinity == 1 { - return NInfinity - } - if z1.infinity == -1 { - return PInfinity - } - n := &big.Int{} - n.Neg(z1.integer) - return NewBigZ(n) -} - -func (z1 Z) Sign() int { - if z1.infinity != 0 { - return int(z1.infinity) - } - return z1.integer.Sign() -} - -func (z1 Z) String() string { - if z1 == NInfinity { - return "-∞" - } - if z1 == PInfinity { - return "∞" - } - return fmt.Sprintf("%d", z1.integer) -} - -func (z1 Z) Cmp(z2 Z) int { - if z1.infinity == z2.infinity && z1.infinity != 0 { - return 0 - } - if z1 == PInfinity { - return 1 - } - if z1 == NInfinity { - return -1 - } - if z2 == NInfinity { - return 1 - } - if z2 == PInfinity { - return -1 - } - return z1.integer.Cmp(z2.integer) -} - -func MaxZ(zs ...Z) Z { - if len(zs) == 0 { - panic("Max called with no arguments") - } - if len(zs) == 1 { - return zs[0] - } - ret := zs[0] - for _, z := range zs[1:] { - if z.Cmp(ret) == 1 { - ret = z - } - } - return ret -} - -func MinZ(zs ...Z) Z { - if len(zs) == 0 { - panic("Min called with no arguments") - } - if len(zs) == 1 { - return zs[0] - } - ret := zs[0] - for _, z := range zs[1:] { - if z.Cmp(ret) == -1 { - ret = z - } - } - return ret -} - -var NInfinity = Z{infinity: -1} -var PInfinity = Z{infinity: 1} -var EmptyIntInterval = IntInterval{true, PInfinity, NInfinity} - -func InfinityFor(v ssa.Value) IntInterval { - if b, ok := v.Type().Underlying().(*types.Basic); ok { - if (b.Info() & types.IsUnsigned) != 0 { - return NewIntInterval(NewZ(0), PInfinity) - } - } - return NewIntInterval(NInfinity, PInfinity) -} - -type IntInterval struct { - known bool - Lower Z - Upper Z -} - -func NewIntInterval(l, u Z) IntInterval { - if u.Cmp(l) == -1 { - return EmptyIntInterval - } - return IntInterval{known: true, Lower: l, Upper: u} -} - -func (i IntInterval) IsKnown() bool { - return i.known -} - -func (i IntInterval) Empty() bool { - return i.Lower == PInfinity && i.Upper == NInfinity -} - -func (i IntInterval) IsMaxRange() bool { - return i.Lower == NInfinity && i.Upper == PInfinity -} - -func (i1 IntInterval) Intersection(i2 IntInterval) IntInterval { - if !i1.IsKnown() { - return i2 - } - if !i2.IsKnown() { - return i1 - } - if i1.Empty() || i2.Empty() { - return EmptyIntInterval - } - i3 := NewIntInterval(MaxZ(i1.Lower, i2.Lower), MinZ(i1.Upper, i2.Upper)) - if i3.Lower.Cmp(i3.Upper) == 1 { - return EmptyIntInterval - } - return i3 -} - -func (i1 IntInterval) Union(other Range) Range { - i2, ok := other.(IntInterval) - if !ok { - i2 = EmptyIntInterval - } - if i1.Empty() || !i1.IsKnown() { - return i2 - } - if i2.Empty() || !i2.IsKnown() { - return i1 - } - return NewIntInterval(MinZ(i1.Lower, i2.Lower), MaxZ(i1.Upper, i2.Upper)) -} - -func (i1 IntInterval) Add(i2 IntInterval) IntInterval { - if i1.Empty() || i2.Empty() { - return EmptyIntInterval - } - l1, u1, l2, u2 := i1.Lower, i1.Upper, i2.Lower, i2.Upper - return NewIntInterval(l1.Add(l2), u1.Add(u2)) -} - -func (i1 IntInterval) Sub(i2 IntInterval) IntInterval { - if i1.Empty() || i2.Empty() { - return EmptyIntInterval - } - l1, u1, l2, u2 := i1.Lower, i1.Upper, i2.Lower, i2.Upper - return NewIntInterval(l1.Sub(u2), u1.Sub(l2)) -} - -func (i1 IntInterval) Mul(i2 IntInterval) IntInterval { - if i1.Empty() || i2.Empty() { - return EmptyIntInterval - } - x1, x2 := i1.Lower, i1.Upper - y1, y2 := i2.Lower, i2.Upper - return NewIntInterval( - MinZ(x1.Mul(y1), x1.Mul(y2), x2.Mul(y1), x2.Mul(y2)), - MaxZ(x1.Mul(y1), x1.Mul(y2), x2.Mul(y1), x2.Mul(y2)), - ) -} - -func (i1 IntInterval) String() string { - if !i1.IsKnown() { - return "[⊥, ⊥]" - } - if i1.Empty() { - return "{}" - } - return fmt.Sprintf("[%s, %s]", i1.Lower, i1.Upper) -} - -type IntArithmeticConstraint struct { - aConstraint - A ssa.Value - B ssa.Value - Op token.Token - Fn func(IntInterval, IntInterval) IntInterval -} - -type IntAddConstraint struct{ *IntArithmeticConstraint } -type IntSubConstraint struct{ *IntArithmeticConstraint } -type IntMulConstraint struct{ *IntArithmeticConstraint } - -type IntConversionConstraint struct { - aConstraint - X ssa.Value -} - -type IntIntersectionConstraint struct { - aConstraint - ranges Ranges - A ssa.Value - B ssa.Value - Op token.Token - I IntInterval - resolved bool -} - -type IntIntervalConstraint struct { - aConstraint - I IntInterval -} - -func NewIntArithmeticConstraint(a, b, y ssa.Value, op token.Token, fn func(IntInterval, IntInterval) IntInterval) *IntArithmeticConstraint { - return &IntArithmeticConstraint{NewConstraint(y), a, b, op, fn} -} -func NewIntAddConstraint(a, b, y ssa.Value) Constraint { - return &IntAddConstraint{NewIntArithmeticConstraint(a, b, y, token.ADD, IntInterval.Add)} -} -func NewIntSubConstraint(a, b, y ssa.Value) Constraint { - return &IntSubConstraint{NewIntArithmeticConstraint(a, b, y, token.SUB, IntInterval.Sub)} -} -func NewIntMulConstraint(a, b, y ssa.Value) Constraint { - return &IntMulConstraint{NewIntArithmeticConstraint(a, b, y, token.MUL, IntInterval.Mul)} -} -func NewIntConversionConstraint(x, y ssa.Value) Constraint { - return &IntConversionConstraint{NewConstraint(y), x} -} -func NewIntIntersectionConstraint(a, b ssa.Value, op token.Token, ranges Ranges, y ssa.Value) Constraint { - return &IntIntersectionConstraint{ - aConstraint: NewConstraint(y), - ranges: ranges, - A: a, - B: b, - Op: op, - } -} -func NewIntIntervalConstraint(i IntInterval, y ssa.Value) Constraint { - return &IntIntervalConstraint{NewConstraint(y), i} -} - -func (c *IntArithmeticConstraint) Operands() []ssa.Value { return []ssa.Value{c.A, c.B} } -func (c *IntConversionConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} } -func (c *IntIntersectionConstraint) Operands() []ssa.Value { return []ssa.Value{c.A} } -func (s *IntIntervalConstraint) Operands() []ssa.Value { return nil } - -func (c *IntArithmeticConstraint) String() string { - return fmt.Sprintf("%s = %s %s %s", c.Y().Name(), c.A.Name(), c.Op, c.B.Name()) -} -func (c *IntConversionConstraint) String() string { - return fmt.Sprintf("%s = %s(%s)", c.Y().Name(), c.Y().Type(), c.X.Name()) -} -func (c *IntIntersectionConstraint) String() string { - return fmt.Sprintf("%s = %s %s %s (%t branch)", c.Y().Name(), c.A.Name(), c.Op, c.B.Name(), c.Y().(*ssa.Sigma).Branch) -} -func (c *IntIntervalConstraint) String() string { return fmt.Sprintf("%s = %s", c.Y().Name(), c.I) } - -func (c *IntArithmeticConstraint) Eval(g *Graph) Range { - i1, i2 := g.Range(c.A).(IntInterval), g.Range(c.B).(IntInterval) - if !i1.IsKnown() || !i2.IsKnown() { - return IntInterval{} - } - return c.Fn(i1, i2) -} -func (c *IntConversionConstraint) Eval(g *Graph) Range { - s := &types.StdSizes{ - // XXX is it okay to assume the largest word size, or do we - // need to be platform specific? - WordSize: 8, - MaxAlign: 1, - } - fromI := g.Range(c.X).(IntInterval) - toI := g.Range(c.Y()).(IntInterval) - fromT := c.X.Type().Underlying().(*types.Basic) - toT := c.Y().Type().Underlying().(*types.Basic) - fromB := s.Sizeof(c.X.Type()) - toB := s.Sizeof(c.Y().Type()) - - if !fromI.IsKnown() { - return toI - } - if !toI.IsKnown() { - return fromI - } - - // uint -> sint/uint, M > N: [max(0, l1), min(2**N-1, u2)] - if (fromT.Info()&types.IsUnsigned != 0) && - toB > fromB { - - n := big.NewInt(1) - n.Lsh(n, uint(fromB*8)) - n.Sub(n, big.NewInt(1)) - return NewIntInterval( - MaxZ(NewZ(0), fromI.Lower), - MinZ(NewBigZ(n), toI.Upper), - ) - } - - // sint -> sint, M > N; [max(-∞, l1), min(2**N-1, u2)] - if (fromT.Info()&types.IsUnsigned == 0) && - (toT.Info()&types.IsUnsigned == 0) && - toB > fromB { - - n := big.NewInt(1) - n.Lsh(n, uint(fromB*8)) - n.Sub(n, big.NewInt(1)) - return NewIntInterval( - MaxZ(NInfinity, fromI.Lower), - MinZ(NewBigZ(n), toI.Upper), - ) - } - - return fromI -} -func (c *IntIntersectionConstraint) Eval(g *Graph) Range { - xi := g.Range(c.A).(IntInterval) - if !xi.IsKnown() { - return c.I - } - return xi.Intersection(c.I) -} -func (c *IntIntervalConstraint) Eval(*Graph) Range { return c.I } - -func (c *IntIntersectionConstraint) Futures() []ssa.Value { - return []ssa.Value{c.B} -} - -func (c *IntIntersectionConstraint) Resolve() { - r, ok := c.ranges[c.B].(IntInterval) - if !ok { - c.I = InfinityFor(c.Y()) - return - } - - switch c.Op { - case token.EQL: - c.I = r - case token.GTR: - c.I = NewIntInterval(r.Lower.Add(NewZ(1)), PInfinity) - case token.GEQ: - c.I = NewIntInterval(r.Lower, PInfinity) - case token.LSS: - // TODO(dh): do we need 0 instead of NInfinity for uints? - c.I = NewIntInterval(NInfinity, r.Upper.Sub(NewZ(1))) - case token.LEQ: - c.I = NewIntInterval(NInfinity, r.Upper) - case token.NEQ: - c.I = InfinityFor(c.Y()) - default: - panic("unsupported op " + c.Op.String()) - } -} - -func (c *IntIntersectionConstraint) IsKnown() bool { - return c.I.IsKnown() -} - -func (c *IntIntersectionConstraint) MarkUnresolved() { - c.resolved = false -} - -func (c *IntIntersectionConstraint) MarkResolved() { - c.resolved = true -} - -func (c *IntIntersectionConstraint) IsResolved() bool { - return c.resolved -} diff --git a/vendor/honnef.co/go/tools/staticcheck/vrp/slice.go b/vendor/honnef.co/go/tools/staticcheck/vrp/slice.go deleted file mode 100644 index 40658dd8d86..00000000000 --- a/vendor/honnef.co/go/tools/staticcheck/vrp/slice.go +++ /dev/null @@ -1,273 +0,0 @@ -package vrp - -// TODO(dh): most of the constraints have implementations identical to -// that of strings. Consider reusing them. - -import ( - "fmt" - "go/types" - - "honnef.co/go/tools/ssa" -) - -type SliceInterval struct { - Length IntInterval -} - -func (s SliceInterval) Union(other Range) Range { - i, ok := other.(SliceInterval) - if !ok { - i = SliceInterval{EmptyIntInterval} - } - if s.Length.Empty() || !s.Length.IsKnown() { - return i - } - if i.Length.Empty() || !i.Length.IsKnown() { - return s - } - return SliceInterval{ - Length: s.Length.Union(i.Length).(IntInterval), - } -} -func (s SliceInterval) String() string { return s.Length.String() } -func (s SliceInterval) IsKnown() bool { return s.Length.IsKnown() } - -type SliceAppendConstraint struct { - aConstraint - A ssa.Value - B ssa.Value -} - -type SliceSliceConstraint struct { - aConstraint - X ssa.Value - Lower ssa.Value - Upper ssa.Value -} - -type ArraySliceConstraint struct { - aConstraint - X ssa.Value - Lower ssa.Value - Upper ssa.Value -} - -type SliceIntersectionConstraint struct { - aConstraint - X ssa.Value - I IntInterval -} - -type SliceLengthConstraint struct { - aConstraint - X ssa.Value -} - -type MakeSliceConstraint struct { - aConstraint - Size ssa.Value -} - -type SliceIntervalConstraint struct { - aConstraint - I IntInterval -} - -func NewSliceAppendConstraint(a, b, y ssa.Value) Constraint { - return &SliceAppendConstraint{NewConstraint(y), a, b} -} -func NewSliceSliceConstraint(x, lower, upper, y ssa.Value) Constraint { - return &SliceSliceConstraint{NewConstraint(y), x, lower, upper} -} -func NewArraySliceConstraint(x, lower, upper, y ssa.Value) Constraint { - return &ArraySliceConstraint{NewConstraint(y), x, lower, upper} -} -func NewSliceIntersectionConstraint(x ssa.Value, i IntInterval, y ssa.Value) Constraint { - return &SliceIntersectionConstraint{NewConstraint(y), x, i} -} -func NewSliceLengthConstraint(x, y ssa.Value) Constraint { - return &SliceLengthConstraint{NewConstraint(y), x} -} -func NewMakeSliceConstraint(size, y ssa.Value) Constraint { - return &MakeSliceConstraint{NewConstraint(y), size} -} -func NewSliceIntervalConstraint(i IntInterval, y ssa.Value) Constraint { - return &SliceIntervalConstraint{NewConstraint(y), i} -} - -func (c *SliceAppendConstraint) Operands() []ssa.Value { return []ssa.Value{c.A, c.B} } -func (c *SliceSliceConstraint) Operands() []ssa.Value { - ops := []ssa.Value{c.X} - if c.Lower != nil { - ops = append(ops, c.Lower) - } - if c.Upper != nil { - ops = append(ops, c.Upper) - } - return ops -} -func (c *ArraySliceConstraint) Operands() []ssa.Value { - ops := []ssa.Value{c.X} - if c.Lower != nil { - ops = append(ops, c.Lower) - } - if c.Upper != nil { - ops = append(ops, c.Upper) - } - return ops -} -func (c *SliceIntersectionConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} } -func (c *SliceLengthConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} } -func (c *MakeSliceConstraint) Operands() []ssa.Value { return []ssa.Value{c.Size} } -func (s *SliceIntervalConstraint) Operands() []ssa.Value { return nil } - -func (c *SliceAppendConstraint) String() string { - return fmt.Sprintf("%s = append(%s, %s)", c.Y().Name(), c.A.Name(), c.B.Name()) -} -func (c *SliceSliceConstraint) String() string { - var lname, uname string - if c.Lower != nil { - lname = c.Lower.Name() - } - if c.Upper != nil { - uname = c.Upper.Name() - } - return fmt.Sprintf("%s[%s:%s]", c.X.Name(), lname, uname) -} -func (c *ArraySliceConstraint) String() string { - var lname, uname string - if c.Lower != nil { - lname = c.Lower.Name() - } - if c.Upper != nil { - uname = c.Upper.Name() - } - return fmt.Sprintf("%s[%s:%s]", c.X.Name(), lname, uname) -} -func (c *SliceIntersectionConstraint) String() string { - return fmt.Sprintf("%s = %s.%t ⊓ %s", c.Y().Name(), c.X.Name(), c.Y().(*ssa.Sigma).Branch, c.I) -} -func (c *SliceLengthConstraint) String() string { - return fmt.Sprintf("%s = len(%s)", c.Y().Name(), c.X.Name()) -} -func (c *MakeSliceConstraint) String() string { - return fmt.Sprintf("%s = make(slice, %s)", c.Y().Name(), c.Size.Name()) -} -func (c *SliceIntervalConstraint) String() string { return fmt.Sprintf("%s = %s", c.Y().Name(), c.I) } - -func (c *SliceAppendConstraint) Eval(g *Graph) Range { - l1 := g.Range(c.A).(SliceInterval).Length - var l2 IntInterval - switch r := g.Range(c.B).(type) { - case SliceInterval: - l2 = r.Length - case StringInterval: - l2 = r.Length - default: - return SliceInterval{} - } - if !l1.IsKnown() || !l2.IsKnown() { - return SliceInterval{} - } - return SliceInterval{ - Length: l1.Add(l2), - } -} -func (c *SliceSliceConstraint) Eval(g *Graph) Range { - lr := NewIntInterval(NewZ(0), NewZ(0)) - if c.Lower != nil { - lr = g.Range(c.Lower).(IntInterval) - } - ur := g.Range(c.X).(SliceInterval).Length - if c.Upper != nil { - ur = g.Range(c.Upper).(IntInterval) - } - if !lr.IsKnown() || !ur.IsKnown() { - return SliceInterval{} - } - - ls := []Z{ - ur.Lower.Sub(lr.Lower), - ur.Upper.Sub(lr.Lower), - ur.Lower.Sub(lr.Upper), - ur.Upper.Sub(lr.Upper), - } - // TODO(dh): if we don't truncate lengths to 0 we might be able to - // easily detect slices with high < low. we'd need to treat -∞ - // specially, though. - for i, l := range ls { - if l.Sign() == -1 { - ls[i] = NewZ(0) - } - } - - return SliceInterval{ - Length: NewIntInterval(MinZ(ls...), MaxZ(ls...)), - } -} -func (c *ArraySliceConstraint) Eval(g *Graph) Range { - lr := NewIntInterval(NewZ(0), NewZ(0)) - if c.Lower != nil { - lr = g.Range(c.Lower).(IntInterval) - } - var l int64 - switch typ := c.X.Type().(type) { - case *types.Array: - l = typ.Len() - case *types.Pointer: - l = typ.Elem().(*types.Array).Len() - } - ur := NewIntInterval(NewZ(l), NewZ(l)) - if c.Upper != nil { - ur = g.Range(c.Upper).(IntInterval) - } - if !lr.IsKnown() || !ur.IsKnown() { - return SliceInterval{} - } - - ls := []Z{ - ur.Lower.Sub(lr.Lower), - ur.Upper.Sub(lr.Lower), - ur.Lower.Sub(lr.Upper), - ur.Upper.Sub(lr.Upper), - } - // TODO(dh): if we don't truncate lengths to 0 we might be able to - // easily detect slices with high < low. we'd need to treat -∞ - // specially, though. - for i, l := range ls { - if l.Sign() == -1 { - ls[i] = NewZ(0) - } - } - - return SliceInterval{ - Length: NewIntInterval(MinZ(ls...), MaxZ(ls...)), - } -} -func (c *SliceIntersectionConstraint) Eval(g *Graph) Range { - xi := g.Range(c.X).(SliceInterval) - if !xi.IsKnown() { - return c.I - } - return SliceInterval{ - Length: xi.Length.Intersection(c.I), - } -} -func (c *SliceLengthConstraint) Eval(g *Graph) Range { - i := g.Range(c.X).(SliceInterval).Length - if !i.IsKnown() { - return NewIntInterval(NewZ(0), PInfinity) - } - return i -} -func (c *MakeSliceConstraint) Eval(g *Graph) Range { - i, ok := g.Range(c.Size).(IntInterval) - if !ok { - return SliceInterval{NewIntInterval(NewZ(0), PInfinity)} - } - if i.Lower.Sign() == -1 { - i.Lower = NewZ(0) - } - return SliceInterval{i} -} -func (c *SliceIntervalConstraint) Eval(*Graph) Range { return SliceInterval{c.I} } diff --git a/vendor/honnef.co/go/tools/staticcheck/vrp/string.go b/vendor/honnef.co/go/tools/staticcheck/vrp/string.go deleted file mode 100644 index e05877f9f78..00000000000 --- a/vendor/honnef.co/go/tools/staticcheck/vrp/string.go +++ /dev/null @@ -1,258 +0,0 @@ -package vrp - -import ( - "fmt" - "go/token" - "go/types" - - "honnef.co/go/tools/ssa" -) - -type StringInterval struct { - Length IntInterval -} - -func (s StringInterval) Union(other Range) Range { - i, ok := other.(StringInterval) - if !ok { - i = StringInterval{EmptyIntInterval} - } - if s.Length.Empty() || !s.Length.IsKnown() { - return i - } - if i.Length.Empty() || !i.Length.IsKnown() { - return s - } - return StringInterval{ - Length: s.Length.Union(i.Length).(IntInterval), - } -} - -func (s StringInterval) String() string { - return s.Length.String() -} - -func (s StringInterval) IsKnown() bool { - return s.Length.IsKnown() -} - -type StringSliceConstraint struct { - aConstraint - X ssa.Value - Lower ssa.Value - Upper ssa.Value -} - -type StringIntersectionConstraint struct { - aConstraint - ranges Ranges - A ssa.Value - B ssa.Value - Op token.Token - I IntInterval - resolved bool -} - -type StringConcatConstraint struct { - aConstraint - A ssa.Value - B ssa.Value -} - -type StringLengthConstraint struct { - aConstraint - X ssa.Value -} - -type StringIntervalConstraint struct { - aConstraint - I IntInterval -} - -func NewStringSliceConstraint(x, lower, upper, y ssa.Value) Constraint { - return &StringSliceConstraint{NewConstraint(y), x, lower, upper} -} -func NewStringIntersectionConstraint(a, b ssa.Value, op token.Token, ranges Ranges, y ssa.Value) Constraint { - return &StringIntersectionConstraint{ - aConstraint: NewConstraint(y), - ranges: ranges, - A: a, - B: b, - Op: op, - } -} -func NewStringConcatConstraint(a, b, y ssa.Value) Constraint { - return &StringConcatConstraint{NewConstraint(y), a, b} -} -func NewStringLengthConstraint(x ssa.Value, y ssa.Value) Constraint { - return &StringLengthConstraint{NewConstraint(y), x} -} -func NewStringIntervalConstraint(i IntInterval, y ssa.Value) Constraint { - return &StringIntervalConstraint{NewConstraint(y), i} -} - -func (c *StringSliceConstraint) Operands() []ssa.Value { - vs := []ssa.Value{c.X} - if c.Lower != nil { - vs = append(vs, c.Lower) - } - if c.Upper != nil { - vs = append(vs, c.Upper) - } - return vs -} -func (c *StringIntersectionConstraint) Operands() []ssa.Value { return []ssa.Value{c.A} } -func (c StringConcatConstraint) Operands() []ssa.Value { return []ssa.Value{c.A, c.B} } -func (c *StringLengthConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} } -func (s *StringIntervalConstraint) Operands() []ssa.Value { return nil } - -func (c *StringSliceConstraint) String() string { - var lname, uname string - if c.Lower != nil { - lname = c.Lower.Name() - } - if c.Upper != nil { - uname = c.Upper.Name() - } - return fmt.Sprintf("%s[%s:%s]", c.X.Name(), lname, uname) -} -func (c *StringIntersectionConstraint) String() string { - return fmt.Sprintf("%s = %s %s %s (%t branch)", c.Y().Name(), c.A.Name(), c.Op, c.B.Name(), c.Y().(*ssa.Sigma).Branch) -} -func (c StringConcatConstraint) String() string { - return fmt.Sprintf("%s = %s + %s", c.Y().Name(), c.A.Name(), c.B.Name()) -} -func (c *StringLengthConstraint) String() string { - return fmt.Sprintf("%s = len(%s)", c.Y().Name(), c.X.Name()) -} -func (c *StringIntervalConstraint) String() string { return fmt.Sprintf("%s = %s", c.Y().Name(), c.I) } - -func (c *StringSliceConstraint) Eval(g *Graph) Range { - lr := NewIntInterval(NewZ(0), NewZ(0)) - if c.Lower != nil { - lr = g.Range(c.Lower).(IntInterval) - } - ur := g.Range(c.X).(StringInterval).Length - if c.Upper != nil { - ur = g.Range(c.Upper).(IntInterval) - } - if !lr.IsKnown() || !ur.IsKnown() { - return StringInterval{} - } - - ls := []Z{ - ur.Lower.Sub(lr.Lower), - ur.Upper.Sub(lr.Lower), - ur.Lower.Sub(lr.Upper), - ur.Upper.Sub(lr.Upper), - } - // TODO(dh): if we don't truncate lengths to 0 we might be able to - // easily detect slices with high < low. we'd need to treat -∞ - // specially, though. - for i, l := range ls { - if l.Sign() == -1 { - ls[i] = NewZ(0) - } - } - - return StringInterval{ - Length: NewIntInterval(MinZ(ls...), MaxZ(ls...)), - } -} -func (c *StringIntersectionConstraint) Eval(g *Graph) Range { - var l IntInterval - switch r := g.Range(c.A).(type) { - case StringInterval: - l = r.Length - case IntInterval: - l = r - } - - if !l.IsKnown() { - return StringInterval{c.I} - } - return StringInterval{ - Length: l.Intersection(c.I), - } -} -func (c StringConcatConstraint) Eval(g *Graph) Range { - i1, i2 := g.Range(c.A).(StringInterval), g.Range(c.B).(StringInterval) - if !i1.Length.IsKnown() || !i2.Length.IsKnown() { - return StringInterval{} - } - return StringInterval{ - Length: i1.Length.Add(i2.Length), - } -} -func (c *StringLengthConstraint) Eval(g *Graph) Range { - i := g.Range(c.X).(StringInterval).Length - if !i.IsKnown() { - return NewIntInterval(NewZ(0), PInfinity) - } - return i -} -func (c *StringIntervalConstraint) Eval(*Graph) Range { return StringInterval{c.I} } - -func (c *StringIntersectionConstraint) Futures() []ssa.Value { - return []ssa.Value{c.B} -} - -func (c *StringIntersectionConstraint) Resolve() { - if (c.A.Type().Underlying().(*types.Basic).Info() & types.IsString) != 0 { - // comparing two strings - r, ok := c.ranges[c.B].(StringInterval) - if !ok { - c.I = NewIntInterval(NewZ(0), PInfinity) - return - } - switch c.Op { - case token.EQL: - c.I = r.Length - case token.GTR, token.GEQ: - c.I = NewIntInterval(r.Length.Lower, PInfinity) - case token.LSS, token.LEQ: - c.I = NewIntInterval(NewZ(0), r.Length.Upper) - case token.NEQ: - default: - panic("unsupported op " + c.Op.String()) - } - } else { - r, ok := c.ranges[c.B].(IntInterval) - if !ok { - c.I = NewIntInterval(NewZ(0), PInfinity) - return - } - // comparing two lengths - switch c.Op { - case token.EQL: - c.I = r - case token.GTR: - c.I = NewIntInterval(r.Lower.Add(NewZ(1)), PInfinity) - case token.GEQ: - c.I = NewIntInterval(r.Lower, PInfinity) - case token.LSS: - c.I = NewIntInterval(NInfinity, r.Upper.Sub(NewZ(1))) - case token.LEQ: - c.I = NewIntInterval(NInfinity, r.Upper) - case token.NEQ: - default: - panic("unsupported op " + c.Op.String()) - } - } -} - -func (c *StringIntersectionConstraint) IsKnown() bool { - return c.I.IsKnown() -} - -func (c *StringIntersectionConstraint) MarkUnresolved() { - c.resolved = false -} - -func (c *StringIntersectionConstraint) MarkResolved() { - c.resolved = true -} - -func (c *StringIntersectionConstraint) IsResolved() bool { - return c.resolved -} diff --git a/vendor/honnef.co/go/tools/staticcheck/vrp/vrp.go b/vendor/honnef.co/go/tools/staticcheck/vrp/vrp.go deleted file mode 100644 index 3c138e51229..00000000000 --- a/vendor/honnef.co/go/tools/staticcheck/vrp/vrp.go +++ /dev/null @@ -1,1056 +0,0 @@ -package vrp - -// TODO(dh) widening and narrowing have a lot of code in common. Make -// it reusable. - -import ( - "fmt" - "go/constant" - "go/token" - "go/types" - "math/big" - "sort" - "strings" - - "honnef.co/go/tools/lint" - "honnef.co/go/tools/ssa" -) - -type Future interface { - Constraint - Futures() []ssa.Value - Resolve() - IsKnown() bool - MarkUnresolved() - MarkResolved() - IsResolved() bool -} - -type Range interface { - Union(other Range) Range - IsKnown() bool -} - -type Constraint interface { - Y() ssa.Value - isConstraint() - String() string - Eval(*Graph) Range - Operands() []ssa.Value -} - -type aConstraint struct { - y ssa.Value -} - -func NewConstraint(y ssa.Value) aConstraint { - return aConstraint{y} -} - -func (aConstraint) isConstraint() {} -func (c aConstraint) Y() ssa.Value { return c.y } - -type PhiConstraint struct { - aConstraint - Vars []ssa.Value -} - -func NewPhiConstraint(vars []ssa.Value, y ssa.Value) Constraint { - uniqm := map[ssa.Value]struct{}{} - for _, v := range vars { - uniqm[v] = struct{}{} - } - var uniq []ssa.Value - for v := range uniqm { - uniq = append(uniq, v) - } - return &PhiConstraint{ - aConstraint: NewConstraint(y), - Vars: uniq, - } -} - -func (c *PhiConstraint) Operands() []ssa.Value { - return c.Vars -} - -func (c *PhiConstraint) Eval(g *Graph) Range { - i := Range(nil) - for _, v := range c.Vars { - i = g.Range(v).Union(i) - } - return i -} - -func (c *PhiConstraint) String() string { - names := make([]string, len(c.Vars)) - for i, v := range c.Vars { - names[i] = v.Name() - } - return fmt.Sprintf("%s = φ(%s)", c.Y().Name(), strings.Join(names, ", ")) -} - -func isSupportedType(typ types.Type) bool { - switch typ := typ.Underlying().(type) { - case *types.Basic: - switch typ.Kind() { - case types.String, types.UntypedString: - return true - default: - if (typ.Info() & types.IsInteger) == 0 { - return false - } - } - case *types.Chan: - return true - case *types.Slice: - return true - default: - return false - } - return true -} - -func ConstantToZ(c constant.Value) Z { - s := constant.ToInt(c).ExactString() - n := &big.Int{} - n.SetString(s, 10) - return NewBigZ(n) -} - -func sigmaInteger(g *Graph, ins *ssa.Sigma, cond *ssa.BinOp, ops []*ssa.Value) Constraint { - op := cond.Op - if !ins.Branch { - op = (invertToken(op)) - } - - switch op { - case token.EQL, token.GTR, token.GEQ, token.LSS, token.LEQ: - default: - return nil - } - var a, b ssa.Value - if (*ops[0]) == ins.X { - a = *ops[0] - b = *ops[1] - } else { - a = *ops[1] - b = *ops[0] - op = flipToken(op) - } - return NewIntIntersectionConstraint(a, b, op, g.ranges, ins) -} - -func sigmaString(g *Graph, ins *ssa.Sigma, cond *ssa.BinOp, ops []*ssa.Value) Constraint { - op := cond.Op - if !ins.Branch { - op = (invertToken(op)) - } - - switch op { - case token.EQL, token.GTR, token.GEQ, token.LSS, token.LEQ: - default: - return nil - } - - if ((*ops[0]).Type().Underlying().(*types.Basic).Info() & types.IsString) == 0 { - var a, b ssa.Value - call, ok := (*ops[0]).(*ssa.Call) - if ok && call.Common().Args[0] == ins.X { - a = *ops[0] - b = *ops[1] - } else { - a = *ops[1] - b = *ops[0] - op = flipToken(op) - } - return NewStringIntersectionConstraint(a, b, op, g.ranges, ins) - } - var a, b ssa.Value - if (*ops[0]) == ins.X { - a = *ops[0] - b = *ops[1] - } else { - a = *ops[1] - b = *ops[0] - op = flipToken(op) - } - return NewStringIntersectionConstraint(a, b, op, g.ranges, ins) -} - -func sigmaSlice(g *Graph, ins *ssa.Sigma, cond *ssa.BinOp, ops []*ssa.Value) Constraint { - // TODO(dh) sigmaSlice and sigmaString are a lot alike. Can they - // be merged? - // - // XXX support futures - - op := cond.Op - if !ins.Branch { - op = (invertToken(op)) - } - - k, ok := (*ops[1]).(*ssa.Const) - // XXX investigate in what cases this wouldn't be a Const - // - // XXX what if left and right are swapped? - if !ok { - return nil - } - - call, ok := (*ops[0]).(*ssa.Call) - if !ok { - return nil - } - builtin, ok := call.Common().Value.(*ssa.Builtin) - if !ok { - return nil - } - if builtin.Name() != "len" { - return nil - } - callops := call.Operands(nil) - - v := ConstantToZ(k.Value) - c := NewSliceIntersectionConstraint(*callops[1], IntInterval{}, ins).(*SliceIntersectionConstraint) - switch op { - case token.EQL: - c.I = NewIntInterval(v, v) - case token.GTR, token.GEQ: - off := int64(0) - if cond.Op == token.GTR { - off = 1 - } - c.I = NewIntInterval( - v.Add(NewZ(off)), - PInfinity, - ) - case token.LSS, token.LEQ: - off := int64(0) - if cond.Op == token.LSS { - off = -1 - } - c.I = NewIntInterval( - NInfinity, - v.Add(NewZ(off)), - ) - default: - return nil - } - return c -} - -func BuildGraph(f *ssa.Function) *Graph { - g := &Graph{ - Vertices: map[interface{}]*Vertex{}, - ranges: Ranges{}, - } - - var cs []Constraint - - ops := make([]*ssa.Value, 16) - seen := map[ssa.Value]bool{} - for _, block := range f.Blocks { - for _, ins := range block.Instrs { - ops = ins.Operands(ops[:0]) - for _, op := range ops { - if c, ok := (*op).(*ssa.Const); ok { - if seen[c] { - continue - } - seen[c] = true - if c.Value == nil { - switch c.Type().Underlying().(type) { - case *types.Slice: - cs = append(cs, NewSliceIntervalConstraint(NewIntInterval(NewZ(0), NewZ(0)), c)) - } - continue - } - switch c.Value.Kind() { - case constant.Int: - v := ConstantToZ(c.Value) - cs = append(cs, NewIntIntervalConstraint(NewIntInterval(v, v), c)) - case constant.String: - s := constant.StringVal(c.Value) - n := NewZ(int64(len(s))) - cs = append(cs, NewStringIntervalConstraint(NewIntInterval(n, n), c)) - } - } - } - } - } - for _, block := range f.Blocks { - for _, ins := range block.Instrs { - switch ins := ins.(type) { - case *ssa.Convert: - switch v := ins.Type().Underlying().(type) { - case *types.Basic: - if (v.Info() & types.IsInteger) == 0 { - continue - } - cs = append(cs, NewIntConversionConstraint(ins.X, ins)) - } - case *ssa.Call: - if static := ins.Common().StaticCallee(); static != nil { - if fn, ok := static.Object().(*types.Func); ok { - switch lint.FuncName(fn) { - case "bytes.Index", "bytes.IndexAny", "bytes.IndexByte", - "bytes.IndexFunc", "bytes.IndexRune", "bytes.LastIndex", - "bytes.LastIndexAny", "bytes.LastIndexByte", "bytes.LastIndexFunc", - "strings.Index", "strings.IndexAny", "strings.IndexByte", - "strings.IndexFunc", "strings.IndexRune", "strings.LastIndex", - "strings.LastIndexAny", "strings.LastIndexByte", "strings.LastIndexFunc": - // TODO(dh): instead of limiting by +∞, - // limit by the upper bound of the passed - // string - cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(-1), PInfinity), ins)) - case "bytes.Title", "bytes.ToLower", "bytes.ToTitle", "bytes.ToUpper", - "strings.Title", "strings.ToLower", "strings.ToTitle", "strings.ToUpper": - cs = append(cs, NewCopyConstraint(ins.Common().Args[0], ins)) - case "bytes.ToLowerSpecial", "bytes.ToTitleSpecial", "bytes.ToUpperSpecial", - "strings.ToLowerSpecial", "strings.ToTitleSpecial", "strings.ToUpperSpecial": - cs = append(cs, NewCopyConstraint(ins.Common().Args[1], ins)) - case "bytes.Compare", "strings.Compare": - cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(-1), NewZ(1)), ins)) - case "bytes.Count", "strings.Count": - // TODO(dh): instead of limiting by +∞, - // limit by the upper bound of the passed - // string. - cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(0), PInfinity), ins)) - case "bytes.Map", "bytes.TrimFunc", "bytes.TrimLeft", "bytes.TrimLeftFunc", - "bytes.TrimRight", "bytes.TrimRightFunc", "bytes.TrimSpace", - "strings.Map", "strings.TrimFunc", "strings.TrimLeft", "strings.TrimLeftFunc", - "strings.TrimRight", "strings.TrimRightFunc", "strings.TrimSpace": - // TODO(dh): lower = 0, upper = upper of passed string - case "bytes.TrimPrefix", "bytes.TrimSuffix", - "strings.TrimPrefix", "strings.TrimSuffix": - // TODO(dh) range between "unmodified" and len(cutset) removed - case "(*bytes.Buffer).Cap", "(*bytes.Buffer).Len", "(*bytes.Reader).Len", "(*bytes.Reader).Size": - cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(0), PInfinity), ins)) - } - } - } - builtin, ok := ins.Common().Value.(*ssa.Builtin) - ops := ins.Operands(nil) - if !ok { - continue - } - switch builtin.Name() { - case "len": - switch op1 := (*ops[1]).Type().Underlying().(type) { - case *types.Basic: - if op1.Kind() == types.String || op1.Kind() == types.UntypedString { - cs = append(cs, NewStringLengthConstraint(*ops[1], ins)) - } - case *types.Slice: - cs = append(cs, NewSliceLengthConstraint(*ops[1], ins)) - } - - case "append": - cs = append(cs, NewSliceAppendConstraint(ins.Common().Args[0], ins.Common().Args[1], ins)) - } - case *ssa.BinOp: - ops := ins.Operands(nil) - basic, ok := (*ops[0]).Type().Underlying().(*types.Basic) - if !ok { - continue - } - switch basic.Kind() { - case types.Int, types.Int8, types.Int16, types.Int32, types.Int64, - types.Uint, types.Uint8, types.Uint16, types.Uint32, types.Uint64, types.UntypedInt: - fns := map[token.Token]func(ssa.Value, ssa.Value, ssa.Value) Constraint{ - token.ADD: NewIntAddConstraint, - token.SUB: NewIntSubConstraint, - token.MUL: NewIntMulConstraint, - // XXX support QUO, REM, SHL, SHR - } - fn, ok := fns[ins.Op] - if ok { - cs = append(cs, fn(*ops[0], *ops[1], ins)) - } - case types.String, types.UntypedString: - if ins.Op == token.ADD { - cs = append(cs, NewStringConcatConstraint(*ops[0], *ops[1], ins)) - } - } - case *ssa.Slice: - typ := ins.X.Type().Underlying() - switch typ := typ.(type) { - case *types.Basic: - cs = append(cs, NewStringSliceConstraint(ins.X, ins.Low, ins.High, ins)) - case *types.Slice: - cs = append(cs, NewSliceSliceConstraint(ins.X, ins.Low, ins.High, ins)) - case *types.Array: - cs = append(cs, NewArraySliceConstraint(ins.X, ins.Low, ins.High, ins)) - case *types.Pointer: - if _, ok := typ.Elem().(*types.Array); !ok { - continue - } - cs = append(cs, NewArraySliceConstraint(ins.X, ins.Low, ins.High, ins)) - } - case *ssa.Phi: - if !isSupportedType(ins.Type()) { - continue - } - ops := ins.Operands(nil) - dops := make([]ssa.Value, len(ops)) - for i, op := range ops { - dops[i] = *op - } - cs = append(cs, NewPhiConstraint(dops, ins)) - case *ssa.Sigma: - pred := ins.Block().Preds[0] - instrs := pred.Instrs - cond, ok := instrs[len(instrs)-1].(*ssa.If).Cond.(*ssa.BinOp) - ops := cond.Operands(nil) - if !ok { - continue - } - switch typ := ins.Type().Underlying().(type) { - case *types.Basic: - var c Constraint - switch typ.Kind() { - case types.Int, types.Int8, types.Int16, types.Int32, types.Int64, - types.Uint, types.Uint8, types.Uint16, types.Uint32, types.Uint64, types.UntypedInt: - c = sigmaInteger(g, ins, cond, ops) - case types.String, types.UntypedString: - c = sigmaString(g, ins, cond, ops) - } - if c != nil { - cs = append(cs, c) - } - case *types.Slice: - c := sigmaSlice(g, ins, cond, ops) - if c != nil { - cs = append(cs, c) - } - default: - //log.Printf("unsupported sigma type %T", typ) // XXX - } - case *ssa.MakeChan: - cs = append(cs, NewMakeChannelConstraint(ins.Size, ins)) - case *ssa.MakeSlice: - cs = append(cs, NewMakeSliceConstraint(ins.Len, ins)) - case *ssa.ChangeType: - switch ins.X.Type().Underlying().(type) { - case *types.Chan: - cs = append(cs, NewChannelChangeTypeConstraint(ins.X, ins)) - } - } - } - } - - for _, c := range cs { - if c == nil { - panic("nil constraint") - } - // If V is used in constraint C, then we create an edge V->C - for _, op := range c.Operands() { - g.AddEdge(op, c, false) - } - if c, ok := c.(Future); ok { - for _, op := range c.Futures() { - g.AddEdge(op, c, true) - } - } - // If constraint C defines variable V, then we create an edge - // C->V - g.AddEdge(c, c.Y(), false) - } - - g.FindSCCs() - g.sccEdges = make([][]Edge, len(g.SCCs)) - g.futures = make([][]Future, len(g.SCCs)) - for _, e := range g.Edges { - g.sccEdges[e.From.SCC] = append(g.sccEdges[e.From.SCC], e) - if !e.control { - continue - } - if c, ok := e.To.Value.(Future); ok { - g.futures[e.From.SCC] = append(g.futures[e.From.SCC], c) - } - } - return g -} - -func (g *Graph) Solve() Ranges { - var consts []Z - off := NewZ(1) - for _, n := range g.Vertices { - if c, ok := n.Value.(*ssa.Const); ok { - basic, ok := c.Type().Underlying().(*types.Basic) - if !ok { - continue - } - if (basic.Info() & types.IsInteger) != 0 { - z := ConstantToZ(c.Value) - consts = append(consts, z) - consts = append(consts, z.Add(off)) - consts = append(consts, z.Sub(off)) - } - } - - } - sort.Sort(Zs(consts)) - - for scc, vertices := range g.SCCs { - n := 0 - n = len(vertices) - if n == 1 { - g.resolveFutures(scc) - v := vertices[0] - if v, ok := v.Value.(ssa.Value); ok { - switch typ := v.Type().Underlying().(type) { - case *types.Basic: - switch typ.Kind() { - case types.String, types.UntypedString: - if !g.Range(v).(StringInterval).IsKnown() { - g.SetRange(v, StringInterval{NewIntInterval(NewZ(0), PInfinity)}) - } - default: - if !g.Range(v).(IntInterval).IsKnown() { - g.SetRange(v, InfinityFor(v)) - } - } - case *types.Chan: - if !g.Range(v).(ChannelInterval).IsKnown() { - g.SetRange(v, ChannelInterval{NewIntInterval(NewZ(0), PInfinity)}) - } - case *types.Slice: - if !g.Range(v).(SliceInterval).IsKnown() { - g.SetRange(v, SliceInterval{NewIntInterval(NewZ(0), PInfinity)}) - } - } - } - if c, ok := v.Value.(Constraint); ok { - g.SetRange(c.Y(), c.Eval(g)) - } - } else { - uses := g.uses(scc) - entries := g.entries(scc) - for len(entries) > 0 { - v := entries[len(entries)-1] - entries = entries[:len(entries)-1] - for _, use := range uses[v] { - if g.widen(use, consts) { - entries = append(entries, use.Y()) - } - } - } - - g.resolveFutures(scc) - - // XXX this seems to be necessary, but shouldn't be. - // removing it leads to nil pointer derefs; investigate - // where we're not setting values correctly. - for _, n := range vertices { - if v, ok := n.Value.(ssa.Value); ok { - i, ok := g.Range(v).(IntInterval) - if !ok { - continue - } - if !i.IsKnown() { - g.SetRange(v, InfinityFor(v)) - } - } - } - - actives := g.actives(scc) - for len(actives) > 0 { - v := actives[len(actives)-1] - actives = actives[:len(actives)-1] - for _, use := range uses[v] { - if g.narrow(use) { - actives = append(actives, use.Y()) - } - } - } - } - // propagate scc - for _, edge := range g.sccEdges[scc] { - if edge.control { - continue - } - if edge.From.SCC == edge.To.SCC { - continue - } - if c, ok := edge.To.Value.(Constraint); ok { - g.SetRange(c.Y(), c.Eval(g)) - } - if c, ok := edge.To.Value.(Future); ok { - if !c.IsKnown() { - c.MarkUnresolved() - } - } - } - } - - for v, r := range g.ranges { - i, ok := r.(IntInterval) - if !ok { - continue - } - if (v.Type().Underlying().(*types.Basic).Info() & types.IsUnsigned) == 0 { - if i.Upper != PInfinity { - s := &types.StdSizes{ - // XXX is it okay to assume the largest word size, or do we - // need to be platform specific? - WordSize: 8, - MaxAlign: 1, - } - bits := (s.Sizeof(v.Type()) * 8) - 1 - n := big.NewInt(1) - n = n.Lsh(n, uint(bits)) - upper, lower := &big.Int{}, &big.Int{} - upper.Sub(n, big.NewInt(1)) - lower.Neg(n) - - if i.Upper.Cmp(NewBigZ(upper)) == 1 { - i = NewIntInterval(NInfinity, PInfinity) - } else if i.Lower.Cmp(NewBigZ(lower)) == -1 { - i = NewIntInterval(NInfinity, PInfinity) - } - } - } - - g.ranges[v] = i - } - - return g.ranges -} - -func VertexString(v *Vertex) string { - switch v := v.Value.(type) { - case Constraint: - return v.String() - case ssa.Value: - return v.Name() - case nil: - return "BUG: nil vertex value" - default: - panic(fmt.Sprintf("unexpected type %T", v)) - } -} - -type Vertex struct { - Value interface{} // one of Constraint or ssa.Value - SCC int - index int - lowlink int - stack bool - - Succs []Edge -} - -type Ranges map[ssa.Value]Range - -func (r Ranges) Get(x ssa.Value) Range { - if x == nil { - return nil - } - i, ok := r[x] - if !ok { - switch x := x.Type().Underlying().(type) { - case *types.Basic: - switch x.Kind() { - case types.String, types.UntypedString: - return StringInterval{} - default: - return IntInterval{} - } - case *types.Chan: - return ChannelInterval{} - case *types.Slice: - return SliceInterval{} - } - } - return i -} - -type Graph struct { - Vertices map[interface{}]*Vertex - Edges []Edge - SCCs [][]*Vertex - ranges Ranges - - // map SCCs to futures - futures [][]Future - // map SCCs to edges - sccEdges [][]Edge -} - -func (g Graph) Graphviz() string { - var lines []string - lines = append(lines, "digraph{") - ids := map[interface{}]int{} - i := 1 - for _, v := range g.Vertices { - ids[v] = i - shape := "box" - if _, ok := v.Value.(ssa.Value); ok { - shape = "oval" - } - lines = append(lines, fmt.Sprintf(`n%d [shape="%s", label=%q, colorscheme=spectral11, style="filled", fillcolor="%d"]`, - i, shape, VertexString(v), (v.SCC%11)+1)) - i++ - } - for _, e := range g.Edges { - style := "solid" - if e.control { - style = "dashed" - } - lines = append(lines, fmt.Sprintf(`n%d -> n%d [style="%s"]`, ids[e.From], ids[e.To], style)) - } - lines = append(lines, "}") - return strings.Join(lines, "\n") -} - -func (g *Graph) SetRange(x ssa.Value, r Range) { - g.ranges[x] = r -} - -func (g *Graph) Range(x ssa.Value) Range { - return g.ranges.Get(x) -} - -func (g *Graph) widen(c Constraint, consts []Z) bool { - setRange := func(i Range) { - g.SetRange(c.Y(), i) - } - widenIntInterval := func(oi, ni IntInterval) (IntInterval, bool) { - if !ni.IsKnown() { - return oi, false - } - nlc := NInfinity - nuc := PInfinity - - // Don't get stuck widening for an absurd amount of time due - // to an excess number of constants, as may be present in - // table-based scanners. - if len(consts) < 1000 { - for _, co := range consts { - if co.Cmp(ni.Lower) <= 0 { - nlc = co - break - } - } - for _, co := range consts { - if co.Cmp(ni.Upper) >= 0 { - nuc = co - break - } - } - } - - if !oi.IsKnown() { - return ni, true - } - if ni.Lower.Cmp(oi.Lower) == -1 && ni.Upper.Cmp(oi.Upper) == 1 { - return NewIntInterval(nlc, nuc), true - } - if ni.Lower.Cmp(oi.Lower) == -1 { - return NewIntInterval(nlc, oi.Upper), true - } - if ni.Upper.Cmp(oi.Upper) == 1 { - return NewIntInterval(oi.Lower, nuc), true - } - return oi, false - } - switch oi := g.Range(c.Y()).(type) { - case IntInterval: - ni := c.Eval(g).(IntInterval) - si, changed := widenIntInterval(oi, ni) - if changed { - setRange(si) - return true - } - return false - case StringInterval: - ni := c.Eval(g).(StringInterval) - si, changed := widenIntInterval(oi.Length, ni.Length) - if changed { - setRange(StringInterval{si}) - return true - } - return false - case SliceInterval: - ni := c.Eval(g).(SliceInterval) - si, changed := widenIntInterval(oi.Length, ni.Length) - if changed { - setRange(SliceInterval{si}) - return true - } - return false - default: - return false - } -} - -func (g *Graph) narrow(c Constraint) bool { - narrowIntInterval := func(oi, ni IntInterval) (IntInterval, bool) { - oLower := oi.Lower - oUpper := oi.Upper - nLower := ni.Lower - nUpper := ni.Upper - - if oLower == NInfinity && nLower != NInfinity { - return NewIntInterval(nLower, oUpper), true - } - if oUpper == PInfinity && nUpper != PInfinity { - return NewIntInterval(oLower, nUpper), true - } - if oLower.Cmp(nLower) == 1 { - return NewIntInterval(nLower, oUpper), true - } - if oUpper.Cmp(nUpper) == -1 { - return NewIntInterval(oLower, nUpper), true - } - return oi, false - } - switch oi := g.Range(c.Y()).(type) { - case IntInterval: - ni := c.Eval(g).(IntInterval) - si, changed := narrowIntInterval(oi, ni) - if changed { - g.SetRange(c.Y(), si) - return true - } - return false - case StringInterval: - ni := c.Eval(g).(StringInterval) - si, changed := narrowIntInterval(oi.Length, ni.Length) - if changed { - g.SetRange(c.Y(), StringInterval{si}) - return true - } - return false - case SliceInterval: - ni := c.Eval(g).(SliceInterval) - si, changed := narrowIntInterval(oi.Length, ni.Length) - if changed { - g.SetRange(c.Y(), SliceInterval{si}) - return true - } - return false - default: - return false - } -} - -func (g *Graph) resolveFutures(scc int) { - for _, c := range g.futures[scc] { - c.Resolve() - } -} - -func (g *Graph) entries(scc int) []ssa.Value { - var entries []ssa.Value - for _, n := range g.Vertices { - if n.SCC != scc { - continue - } - if v, ok := n.Value.(ssa.Value); ok { - // XXX avoid quadratic runtime - // - // XXX I cannot think of any code where the future and its - // variables aren't in the same SCC, in which case this - // code isn't very useful (the variables won't be resolved - // yet). Before we have a cross-SCC example, however, we - // can't really verify that this code is working - // correctly, or indeed doing anything useful. - for _, on := range g.Vertices { - if c, ok := on.Value.(Future); ok { - if c.Y() == v { - if !c.IsResolved() { - g.SetRange(c.Y(), c.Eval(g)) - c.MarkResolved() - } - break - } - } - } - if g.Range(v).IsKnown() { - entries = append(entries, v) - } - } - } - return entries -} - -func (g *Graph) uses(scc int) map[ssa.Value][]Constraint { - m := map[ssa.Value][]Constraint{} - for _, e := range g.sccEdges[scc] { - if e.control { - continue - } - if v, ok := e.From.Value.(ssa.Value); ok { - c := e.To.Value.(Constraint) - sink := c.Y() - if g.Vertices[sink].SCC == scc { - m[v] = append(m[v], c) - } - } - } - return m -} - -func (g *Graph) actives(scc int) []ssa.Value { - var actives []ssa.Value - for _, n := range g.Vertices { - if n.SCC != scc { - continue - } - if v, ok := n.Value.(ssa.Value); ok { - if _, ok := v.(*ssa.Const); !ok { - actives = append(actives, v) - } - } - } - return actives -} - -func (g *Graph) AddEdge(from, to interface{}, ctrl bool) { - vf, ok := g.Vertices[from] - if !ok { - vf = &Vertex{Value: from} - g.Vertices[from] = vf - } - vt, ok := g.Vertices[to] - if !ok { - vt = &Vertex{Value: to} - g.Vertices[to] = vt - } - e := Edge{From: vf, To: vt, control: ctrl} - g.Edges = append(g.Edges, e) - vf.Succs = append(vf.Succs, e) -} - -type Edge struct { - From, To *Vertex - control bool -} - -func (e Edge) String() string { - return fmt.Sprintf("%s -> %s", VertexString(e.From), VertexString(e.To)) -} - -func (g *Graph) FindSCCs() { - // use Tarjan to find the SCCs - - index := 1 - var s []*Vertex - - scc := 0 - var strongconnect func(v *Vertex) - strongconnect = func(v *Vertex) { - // set the depth index for v to the smallest unused index - v.index = index - v.lowlink = index - index++ - s = append(s, v) - v.stack = true - - for _, e := range v.Succs { - w := e.To - if w.index == 0 { - // successor w has not yet been visited; recurse on it - strongconnect(w) - if w.lowlink < v.lowlink { - v.lowlink = w.lowlink - } - } else if w.stack { - // successor w is in stack s and hence in the current scc - if w.index < v.lowlink { - v.lowlink = w.index - } - } - } - - if v.lowlink == v.index { - for { - w := s[len(s)-1] - s = s[:len(s)-1] - w.stack = false - w.SCC = scc - if w == v { - break - } - } - scc++ - } - } - for _, v := range g.Vertices { - if v.index == 0 { - strongconnect(v) - } - } - - g.SCCs = make([][]*Vertex, scc) - for _, n := range g.Vertices { - n.SCC = scc - n.SCC - 1 - g.SCCs[n.SCC] = append(g.SCCs[n.SCC], n) - } -} - -func invertToken(tok token.Token) token.Token { - switch tok { - case token.LSS: - return token.GEQ - case token.GTR: - return token.LEQ - case token.EQL: - return token.NEQ - case token.NEQ: - return token.EQL - case token.GEQ: - return token.LSS - case token.LEQ: - return token.GTR - default: - panic(fmt.Sprintf("unsupported token %s", tok)) - } -} - -func flipToken(tok token.Token) token.Token { - switch tok { - case token.LSS: - return token.GTR - case token.GTR: - return token.LSS - case token.EQL: - return token.EQL - case token.NEQ: - return token.NEQ - case token.GEQ: - return token.LEQ - case token.LEQ: - return token.GEQ - default: - panic(fmt.Sprintf("unsupported token %s", tok)) - } -} - -type CopyConstraint struct { - aConstraint - X ssa.Value -} - -func (c *CopyConstraint) String() string { - return fmt.Sprintf("%s = copy(%s)", c.Y().Name(), c.X.Name()) -} - -func (c *CopyConstraint) Eval(g *Graph) Range { - return g.Range(c.X) -} - -func (c *CopyConstraint) Operands() []ssa.Value { - return []ssa.Value{c.X} -} - -func NewCopyConstraint(x, y ssa.Value) Constraint { - return &CopyConstraint{ - aConstraint: aConstraint{ - y: y, - }, - X: x, - } -} diff --git a/vendor/honnef.co/go/tools/stylecheck/BUILD b/vendor/honnef.co/go/tools/stylecheck/BUILD deleted file mode 100644 index 38d4daf69c2..00000000000 --- a/vendor/honnef.co/go/tools/stylecheck/BUILD +++ /dev/null @@ -1,41 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "analysis.go", - "doc.go", - "lint.go", - "names.go", - ], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/stylecheck", - importpath = "honnef.co/go/tools/stylecheck", - visibility = ["//visibility:public"], - deps = [ - "//vendor/golang.org/x/tools/go/analysis:go_default_library", - "//vendor/golang.org/x/tools/go/analysis/passes/inspect:go_default_library", - "//vendor/golang.org/x/tools/go/ast/inspector:go_default_library", - "//vendor/golang.org/x/tools/go/types/typeutil:go_default_library", - "//vendor/honnef.co/go/tools/config:go_default_library", - "//vendor/honnef.co/go/tools/facts:go_default_library", - "//vendor/honnef.co/go/tools/internal/passes/buildssa:go_default_library", - "//vendor/honnef.co/go/tools/lint:go_default_library", - "//vendor/honnef.co/go/tools/lint/lintdsl:go_default_library", - "//vendor/honnef.co/go/tools/lint/lintutil:go_default_library", - "//vendor/honnef.co/go/tools/ssa:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/stylecheck/analysis.go b/vendor/honnef.co/go/tools/stylecheck/analysis.go deleted file mode 100644 index f252487f735..00000000000 --- a/vendor/honnef.co/go/tools/stylecheck/analysis.go +++ /dev/null @@ -1,111 +0,0 @@ -package stylecheck - -import ( - "flag" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/analysis/passes/inspect" - "honnef.co/go/tools/config" - "honnef.co/go/tools/facts" - "honnef.co/go/tools/internal/passes/buildssa" - "honnef.co/go/tools/lint/lintutil" -) - -func newFlagSet() flag.FlagSet { - fs := flag.NewFlagSet("", flag.PanicOnError) - fs.Var(lintutil.NewVersionFlag(), "go", "Target Go version") - return *fs -} - -var Analyzers = map[string]*analysis.Analyzer{ - "ST1000": { - Name: "ST1000", - Run: CheckPackageComment, - Doc: Docs["ST1000"].String(), - Requires: []*analysis.Analyzer{}, - Flags: newFlagSet(), - }, - "ST1001": { - Name: "ST1001", - Run: CheckDotImports, - Doc: Docs["ST1001"].String(), - Requires: []*analysis.Analyzer{facts.Generated, config.Analyzer}, - Flags: newFlagSet(), - }, - "ST1003": { - Name: "ST1003", - Run: CheckNames, - Doc: Docs["ST1003"].String(), - Requires: []*analysis.Analyzer{facts.Generated, config.Analyzer}, - Flags: newFlagSet(), - }, - "ST1005": { - Name: "ST1005", - Run: CheckErrorStrings, - Doc: Docs["ST1005"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "ST1006": { - Name: "ST1006", - Run: CheckReceiverNames, - Doc: Docs["ST1006"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.Generated}, - Flags: newFlagSet(), - }, - "ST1008": { - Name: "ST1008", - Run: CheckErrorReturn, - Doc: Docs["ST1008"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "ST1011": { - Name: "ST1011", - Run: CheckTimeNames, - Doc: Docs["ST1011"].String(), - Flags: newFlagSet(), - }, - "ST1012": { - Name: "ST1012", - Run: CheckErrorVarNames, - Doc: Docs["ST1012"].String(), - Requires: []*analysis.Analyzer{config.Analyzer}, - Flags: newFlagSet(), - }, - "ST1013": { - Name: "ST1013", - Run: CheckHTTPStatusCodes, - Doc: Docs["ST1013"].String(), - Requires: []*analysis.Analyzer{facts.Generated, facts.TokenFile, config.Analyzer}, - Flags: newFlagSet(), - }, - "ST1015": { - Name: "ST1015", - Run: CheckDefaultCaseOrder, - Doc: Docs["ST1015"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile}, - Flags: newFlagSet(), - }, - "ST1016": { - Name: "ST1016", - Run: CheckReceiverNamesIdentical, - Doc: Docs["ST1016"].String(), - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - Flags: newFlagSet(), - }, - "ST1017": { - Name: "ST1017", - Run: CheckYodaConditions, - Doc: Docs["ST1017"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile}, - Flags: newFlagSet(), - }, - "ST1018": { - Name: "ST1018", - Run: CheckInvisibleCharacters, - Doc: Docs["ST1018"].String(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - Flags: newFlagSet(), - }, -} diff --git a/vendor/honnef.co/go/tools/stylecheck/doc.go b/vendor/honnef.co/go/tools/stylecheck/doc.go deleted file mode 100644 index 9097214d9bf..00000000000 --- a/vendor/honnef.co/go/tools/stylecheck/doc.go +++ /dev/null @@ -1,154 +0,0 @@ -package stylecheck - -import "honnef.co/go/tools/lint" - -var Docs = map[string]*lint.Documentation{ - "ST1000": &lint.Documentation{ - Title: `Incorrect or missing package comment`, - Text: `Packages must have a package comment that is formatted according to -the guidelines laid out in -https://github.com/golang/go/wiki/CodeReviewComments#package-comments.`, - Since: "2019.1", - NonDefault: true, - }, - - "ST1001": &lint.Documentation{ - Title: `Dot imports are discouraged`, - Text: `Dot imports that aren't in external test packages are discouraged. - -The dot_import_whitelist option can be used to whitelist certain -imports. - -Quoting Go Code Review Comments: - - The import . form can be useful in tests that, due to circular - dependencies, cannot be made part of the package being tested: - - package foo_test - - import ( - "bar/testutil" // also imports "foo" - . "foo" - ) - - In this case, the test file cannot be in package foo because it - uses bar/testutil, which imports foo. So we use the 'import .' - form to let the file pretend to be part of package foo even though - it is not. Except for this one case, do not use import . in your - programs. It makes the programs much harder to read because it is - unclear whether a name like Quux is a top-level identifier in the - current package or in an imported package.`, - Since: "2019.1", - Options: []string{"dot_import_whitelist"}, - }, - - "ST1003": &lint.Documentation{ - Title: `Poorly chosen identifier`, - Text: `Identifiers, such as variable and package names, follow certain rules. - -See the following links for details: - -- https://golang.org/doc/effective_go.html#package-names -- https://golang.org/doc/effective_go.html#mixed-caps -- https://github.com/golang/go/wiki/CodeReviewComments#initialisms -- https://github.com/golang/go/wiki/CodeReviewComments#variable-names`, - Since: "2019.1", - NonDefault: true, - Options: []string{"initialisms"}, - }, - - "ST1005": &lint.Documentation{ - Title: `Incorrectly formatted error string`, - Text: `Error strings follow a set of guidelines to ensure uniformity and good -composability. - -Quoting Go Code Review Comments: - - Error strings should not be capitalized (unless beginning with - proper nouns or acronyms) or end with punctuation, since they are - usually printed following other context. That is, use - fmt.Errorf("something bad") not fmt.Errorf("Something bad"), so - that log.Printf("Reading %s: %v", filename, err) formats without a - spurious capital letter mid-message.`, - Since: "2019.1", - }, - - "ST1006": &lint.Documentation{ - Title: `Poorly chosen receiver name`, - Text: `Quoting Go Code Review Comments: - - The name of a method's receiver should be a reflection of its - identity; often a one or two letter abbreviation of its type - suffices (such as "c" or "cl" for "Client"). Don't use generic - names such as "me", "this" or "self", identifiers typical of - object-oriented languages that place more emphasis on methods as - opposed to functions. The name need not be as descriptive as that - of a method argument, as its role is obvious and serves no - documentary purpose. It can be very short as it will appear on - almost every line of every method of the type; familiarity admits - brevity. Be consistent, too: if you call the receiver "c" in one - method, don't call it "cl" in another.`, - Since: "2019.1", - }, - - "ST1008": &lint.Documentation{ - Title: `A function's error value should be its last return value`, - Text: `A function's error value should be its last return value.`, - Since: `2019.1`, - }, - - "ST1011": &lint.Documentation{ - Title: `Poorly chosen name for variable of type time.Duration`, - Text: `time.Duration values represent an amount of time, which is represented -as a count of nanoseconds. An expression like 5 * time.Microsecond -yields the value 5000. It is therefore not appropriate to suffix a -variable of type time.Duration with any time unit, such as Msec or -Milli.`, - Since: `2019.1`, - }, - - "ST1012": &lint.Documentation{ - Title: `Poorly chosen name for error variable`, - Text: `Error variables that are part of an API should be called errFoo or -ErrFoo.`, - Since: "2019.1", - }, - - "ST1013": &lint.Documentation{ - Title: `Should use constants for HTTP error codes, not magic numbers`, - Text: `HTTP has a tremendous number of status codes. While some of those are -well known (200, 400, 404, 500), most of them are not. The net/http -package provides constants for all status codes that are part of the -various specifications. It is recommended to use these constants -instead of hard-coding magic numbers, to vastly improve the -readability of your code.`, - Since: "2019.1", - Options: []string{"http_status_code_whitelist"}, - }, - - "ST1015": &lint.Documentation{ - Title: `A switch's default case should be the first or last case`, - Since: "2019.1", - }, - - "ST1016": &lint.Documentation{ - Title: `Use consistent method receiver names`, - Since: "2019.1", - NonDefault: true, - }, - - "ST1017": &lint.Documentation{ - Title: `Don't use Yoda conditions`, - Text: `Yoda conditions are conditions of the kind 'if 42 == x', where the -literal is on the left side of the comparison. These are a common -idiom in languages in which assignment is an expression, to avoid bugs -of the kind 'if (x = 42)'. In Go, which doesn't allow for this kind of -bug, we prefer the more idiomatic 'if x == 42'.`, - Since: "2019.2", - }, - - "ST1018": &lint.Documentation{ - Title: `Avoid zero-width and control characters in string literals`, - Since: "2019.2", - }, -} diff --git a/vendor/honnef.co/go/tools/stylecheck/lint.go b/vendor/honnef.co/go/tools/stylecheck/lint.go deleted file mode 100644 index 1699d5898c0..00000000000 --- a/vendor/honnef.co/go/tools/stylecheck/lint.go +++ /dev/null @@ -1,629 +0,0 @@ -package stylecheck // import "honnef.co/go/tools/stylecheck" - -import ( - "fmt" - "go/ast" - "go/constant" - "go/token" - "go/types" - "strconv" - "strings" - "unicode" - "unicode/utf8" - - "honnef.co/go/tools/config" - "honnef.co/go/tools/internal/passes/buildssa" - . "honnef.co/go/tools/lint/lintdsl" - "honnef.co/go/tools/ssa" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/analysis/passes/inspect" - "golang.org/x/tools/go/ast/inspector" - "golang.org/x/tools/go/types/typeutil" -) - -func CheckPackageComment(pass *analysis.Pass) (interface{}, error) { - // - At least one file in a non-main package should have a package comment - // - // - The comment should be of the form - // "Package x ...". This has a slight potential for false - // positives, as multiple files can have package comments, in - // which case they get appended. But that doesn't happen a lot in - // the real world. - - if pass.Pkg.Name() == "main" { - return nil, nil - } - hasDocs := false - for _, f := range pass.Files { - if IsInTest(pass, f) { - continue - } - if f.Doc != nil && len(f.Doc.List) > 0 { - hasDocs = true - prefix := "Package " + f.Name.Name + " " - if !strings.HasPrefix(strings.TrimSpace(f.Doc.Text()), prefix) { - ReportNodef(pass, f.Doc, `package comment should be of the form "%s..."`, prefix) - } - f.Doc.Text() - } - } - - if !hasDocs { - for _, f := range pass.Files { - if IsInTest(pass, f) { - continue - } - ReportNodef(pass, f, "at least one file in a package should have a package comment") - } - } - return nil, nil -} - -func CheckDotImports(pass *analysis.Pass) (interface{}, error) { - for _, f := range pass.Files { - imports: - for _, imp := range f.Imports { - path := imp.Path.Value - path = path[1 : len(path)-1] - for _, w := range config.For(pass).DotImportWhitelist { - if w == path { - continue imports - } - } - - if imp.Name != nil && imp.Name.Name == "." && !IsInTest(pass, f) { - ReportNodefFG(pass, imp, "should not use dot imports") - } - } - } - return nil, nil -} - -func CheckBlankImports(pass *analysis.Pass) (interface{}, error) { - fset := pass.Fset - for _, f := range pass.Files { - if IsInMain(pass, f) || IsInTest(pass, f) { - continue - } - - // Collect imports of the form `import _ "foo"`, i.e. with no - // parentheses, as their comment will be associated with the - // (paren-free) GenDecl, not the import spec itself. - // - // We don't directly process the GenDecl so that we can - // correctly handle the following: - // - // import _ "foo" - // import _ "bar" - // - // where only the first import should get flagged. - skip := map[ast.Spec]bool{} - ast.Inspect(f, func(node ast.Node) bool { - switch node := node.(type) { - case *ast.File: - return true - case *ast.GenDecl: - if node.Tok != token.IMPORT { - return false - } - if node.Lparen == token.NoPos && node.Doc != nil { - skip[node.Specs[0]] = true - } - return false - } - return false - }) - for i, imp := range f.Imports { - pos := fset.Position(imp.Pos()) - - if !IsBlank(imp.Name) { - continue - } - // Only flag the first blank import in a group of imports, - // or don't flag any of them, if the first one is - // commented - if i > 0 { - prev := f.Imports[i-1] - prevPos := fset.Position(prev.Pos()) - if pos.Line-1 == prevPos.Line && IsBlank(prev.Name) { - continue - } - } - - if imp.Doc == nil && imp.Comment == nil && !skip[imp] { - ReportNodef(pass, imp, "a blank import should be only in a main or test package, or have a comment justifying it") - } - } - } - return nil, nil -} - -func CheckIncDec(pass *analysis.Pass) (interface{}, error) { - // TODO(dh): this can be noisy for function bodies that look like this: - // x += 3 - // ... - // x += 2 - // ... - // x += 1 - fn := func(node ast.Node) { - assign := node.(*ast.AssignStmt) - if assign.Tok != token.ADD_ASSIGN && assign.Tok != token.SUB_ASSIGN { - return - } - if (len(assign.Lhs) != 1 || len(assign.Rhs) != 1) || - !IsIntLiteral(assign.Rhs[0], "1") { - return - } - - suffix := "" - switch assign.Tok { - case token.ADD_ASSIGN: - suffix = "++" - case token.SUB_ASSIGN: - suffix = "--" - } - - ReportNodef(pass, assign, "should replace %s with %s%s", Render(pass, assign), Render(pass, assign.Lhs[0]), suffix) - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.AssignStmt)(nil)}, fn) - return nil, nil -} - -func CheckErrorReturn(pass *analysis.Pass) (interface{}, error) { -fnLoop: - for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - sig := fn.Type().(*types.Signature) - rets := sig.Results() - if rets == nil || rets.Len() < 2 { - continue - } - - if rets.At(rets.Len()-1).Type() == types.Universe.Lookup("error").Type() { - // Last return type is error. If the function also returns - // errors in other positions, that's fine. - continue - } - for i := rets.Len() - 2; i >= 0; i-- { - if rets.At(i).Type() == types.Universe.Lookup("error").Type() { - pass.Reportf(rets.At(i).Pos(), "error should be returned as the last argument") - continue fnLoop - } - } - } - return nil, nil -} - -// CheckUnexportedReturn checks that exported functions on exported -// types do not return unexported types. -func CheckUnexportedReturn(pass *analysis.Pass) (interface{}, error) { - for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - if fn.Synthetic != "" || fn.Parent() != nil { - continue - } - if !ast.IsExported(fn.Name()) || IsInMain(pass, fn) || IsInTest(pass, fn) { - continue - } - sig := fn.Type().(*types.Signature) - if sig.Recv() != nil && !ast.IsExported(Dereference(sig.Recv().Type()).(*types.Named).Obj().Name()) { - continue - } - res := sig.Results() - for i := 0; i < res.Len(); i++ { - if named, ok := DereferenceR(res.At(i).Type()).(*types.Named); ok && - !ast.IsExported(named.Obj().Name()) && - named != types.Universe.Lookup("error").Type() { - pass.Reportf(fn.Pos(), "should not return unexported type") - } - } - } - return nil, nil -} - -func CheckReceiverNames(pass *analysis.Pass) (interface{}, error) { - ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).Pkg - for _, m := range ssapkg.Members { - if T, ok := m.Object().(*types.TypeName); ok && !T.IsAlias() { - ms := typeutil.IntuitiveMethodSet(T.Type(), nil) - for _, sel := range ms { - fn := sel.Obj().(*types.Func) - recv := fn.Type().(*types.Signature).Recv() - if Dereference(recv.Type()) != T.Type() { - // skip embedded methods - continue - } - if recv.Name() == "self" || recv.Name() == "this" { - ReportfFG(pass, recv.Pos(), `receiver name should be a reflection of its identity; don't use generic names such as "this" or "self"`) - } - if recv.Name() == "_" { - ReportfFG(pass, recv.Pos(), "receiver name should not be an underscore, omit the name if it is unused") - } - } - } - } - return nil, nil -} - -func CheckReceiverNamesIdentical(pass *analysis.Pass) (interface{}, error) { - ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).Pkg - for _, m := range ssapkg.Members { - names := map[string]int{} - - var firstFn *types.Func - if T, ok := m.Object().(*types.TypeName); ok && !T.IsAlias() { - ms := typeutil.IntuitiveMethodSet(T.Type(), nil) - for _, sel := range ms { - fn := sel.Obj().(*types.Func) - recv := fn.Type().(*types.Signature).Recv() - if Dereference(recv.Type()) != T.Type() { - // skip embedded methods - continue - } - if firstFn == nil { - firstFn = fn - } - if recv.Name() != "" && recv.Name() != "_" { - names[recv.Name()]++ - } - } - } - - if len(names) > 1 { - var seen []string - for name, count := range names { - seen = append(seen, fmt.Sprintf("%dx %q", count, name)) - } - - pass.Reportf(firstFn.Pos(), "methods on the same type should have the same receiver name (seen %s)", strings.Join(seen, ", ")) - } - } - return nil, nil -} - -func CheckContextFirstArg(pass *analysis.Pass) (interface{}, error) { - // TODO(dh): this check doesn't apply to test helpers. Example from the stdlib: - // func helperCommandContext(t *testing.T, ctx context.Context, s ...string) (cmd *exec.Cmd) { -fnLoop: - for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - if fn.Synthetic != "" || fn.Parent() != nil { - continue - } - params := fn.Signature.Params() - if params.Len() < 2 { - continue - } - if types.TypeString(params.At(0).Type(), nil) == "context.Context" { - continue - } - for i := 1; i < params.Len(); i++ { - param := params.At(i) - if types.TypeString(param.Type(), nil) == "context.Context" { - pass.Reportf(param.Pos(), "context.Context should be the first argument of a function") - continue fnLoop - } - } - } - return nil, nil -} - -func CheckErrorStrings(pass *analysis.Pass) (interface{}, error) { - objNames := map[*ssa.Package]map[string]bool{} - ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).Pkg - objNames[ssapkg] = map[string]bool{} - for _, m := range ssapkg.Members { - if typ, ok := m.(*ssa.Type); ok { - objNames[ssapkg][typ.Name()] = true - } - } - for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - objNames[fn.Package()][fn.Name()] = true - } - - for _, fn := range pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA).SrcFuncs { - if IsInTest(pass, fn) { - // We don't care about malformed error messages in tests; - // they're usually for direct human consumption, not part - // of an API - continue - } - for _, block := range fn.Blocks { - instrLoop: - for _, ins := range block.Instrs { - call, ok := ins.(*ssa.Call) - if !ok { - continue - } - if !IsCallTo(call.Common(), "errors.New") && !IsCallTo(call.Common(), "fmt.Errorf") { - continue - } - - k, ok := call.Common().Args[0].(*ssa.Const) - if !ok { - continue - } - - s := constant.StringVal(k.Value) - if len(s) == 0 { - continue - } - switch s[len(s)-1] { - case '.', ':', '!', '\n': - pass.Reportf(call.Pos(), "error strings should not end with punctuation or a newline") - } - idx := strings.IndexByte(s, ' ') - if idx == -1 { - // single word error message, probably not a real - // error but something used in tests or during - // debugging - continue - } - word := s[:idx] - first, n := utf8.DecodeRuneInString(word) - if !unicode.IsUpper(first) { - continue - } - for _, c := range word[n:] { - if unicode.IsUpper(c) { - // Word is probably an initialism or - // multi-word function name - continue instrLoop - } - } - - word = strings.TrimRightFunc(word, func(r rune) bool { return unicode.IsPunct(r) }) - if objNames[fn.Package()][word] { - // Word is probably the name of a function or type in this package - continue - } - // First word in error starts with a capital - // letter, and the word doesn't contain any other - // capitals, making it unlikely to be an - // initialism or multi-word function name. - // - // It could still be a proper noun, though. - - pass.Reportf(call.Pos(), "error strings should not be capitalized") - } - } - } - return nil, nil -} - -func CheckTimeNames(pass *analysis.Pass) (interface{}, error) { - suffixes := []string{ - "Sec", "Secs", "Seconds", - "Msec", "Msecs", - "Milli", "Millis", "Milliseconds", - "Usec", "Usecs", "Microseconds", - "MS", "Ms", - } - fn := func(T types.Type, names []*ast.Ident) { - if !IsType(T, "time.Duration") && !IsType(T, "*time.Duration") { - return - } - for _, name := range names { - for _, suffix := range suffixes { - if strings.HasSuffix(name.Name, suffix) { - ReportNodef(pass, name, "var %s is of type %v; don't use unit-specific suffix %q", name.Name, T, suffix) - break - } - } - } - } - for _, f := range pass.Files { - ast.Inspect(f, func(node ast.Node) bool { - switch node := node.(type) { - case *ast.ValueSpec: - T := pass.TypesInfo.TypeOf(node.Type) - fn(T, node.Names) - case *ast.FieldList: - for _, field := range node.List { - T := pass.TypesInfo.TypeOf(field.Type) - fn(T, field.Names) - } - } - return true - }) - } - return nil, nil -} - -func CheckErrorVarNames(pass *analysis.Pass) (interface{}, error) { - for _, f := range pass.Files { - for _, decl := range f.Decls { - gen, ok := decl.(*ast.GenDecl) - if !ok || gen.Tok != token.VAR { - continue - } - for _, spec := range gen.Specs { - spec := spec.(*ast.ValueSpec) - if len(spec.Names) != len(spec.Values) { - continue - } - - for i, name := range spec.Names { - val := spec.Values[i] - if !IsCallToAST(pass, val, "errors.New") && !IsCallToAST(pass, val, "fmt.Errorf") { - continue - } - - prefix := "err" - if name.IsExported() { - prefix = "Err" - } - if !strings.HasPrefix(name.Name, prefix) { - ReportNodef(pass, name, "error var %s should have name of the form %sFoo", name.Name, prefix) - } - } - } - } - } - return nil, nil -} - -var httpStatusCodes = map[int]string{ - 100: "StatusContinue", - 101: "StatusSwitchingProtocols", - 102: "StatusProcessing", - 200: "StatusOK", - 201: "StatusCreated", - 202: "StatusAccepted", - 203: "StatusNonAuthoritativeInfo", - 204: "StatusNoContent", - 205: "StatusResetContent", - 206: "StatusPartialContent", - 207: "StatusMultiStatus", - 208: "StatusAlreadyReported", - 226: "StatusIMUsed", - 300: "StatusMultipleChoices", - 301: "StatusMovedPermanently", - 302: "StatusFound", - 303: "StatusSeeOther", - 304: "StatusNotModified", - 305: "StatusUseProxy", - 307: "StatusTemporaryRedirect", - 308: "StatusPermanentRedirect", - 400: "StatusBadRequest", - 401: "StatusUnauthorized", - 402: "StatusPaymentRequired", - 403: "StatusForbidden", - 404: "StatusNotFound", - 405: "StatusMethodNotAllowed", - 406: "StatusNotAcceptable", - 407: "StatusProxyAuthRequired", - 408: "StatusRequestTimeout", - 409: "StatusConflict", - 410: "StatusGone", - 411: "StatusLengthRequired", - 412: "StatusPreconditionFailed", - 413: "StatusRequestEntityTooLarge", - 414: "StatusRequestURITooLong", - 415: "StatusUnsupportedMediaType", - 416: "StatusRequestedRangeNotSatisfiable", - 417: "StatusExpectationFailed", - 418: "StatusTeapot", - 422: "StatusUnprocessableEntity", - 423: "StatusLocked", - 424: "StatusFailedDependency", - 426: "StatusUpgradeRequired", - 428: "StatusPreconditionRequired", - 429: "StatusTooManyRequests", - 431: "StatusRequestHeaderFieldsTooLarge", - 451: "StatusUnavailableForLegalReasons", - 500: "StatusInternalServerError", - 501: "StatusNotImplemented", - 502: "StatusBadGateway", - 503: "StatusServiceUnavailable", - 504: "StatusGatewayTimeout", - 505: "StatusHTTPVersionNotSupported", - 506: "StatusVariantAlsoNegotiates", - 507: "StatusInsufficientStorage", - 508: "StatusLoopDetected", - 510: "StatusNotExtended", - 511: "StatusNetworkAuthenticationRequired", -} - -func CheckHTTPStatusCodes(pass *analysis.Pass) (interface{}, error) { - whitelist := map[string]bool{} - for _, code := range config.For(pass).HTTPStatusCodeWhitelist { - whitelist[code] = true - } - fn := func(node ast.Node) bool { - if node == nil { - return true - } - call, ok := node.(*ast.CallExpr) - if !ok { - return true - } - - var arg int - switch CallNameAST(pass, call) { - case "net/http.Error": - arg = 2 - case "net/http.Redirect": - arg = 3 - case "net/http.StatusText": - arg = 0 - case "net/http.RedirectHandler": - arg = 1 - default: - return true - } - lit, ok := call.Args[arg].(*ast.BasicLit) - if !ok { - return true - } - if whitelist[lit.Value] { - return true - } - - n, err := strconv.Atoi(lit.Value) - if err != nil { - return true - } - s, ok := httpStatusCodes[n] - if !ok { - return true - } - ReportNodefFG(pass, lit, "should use constant http.%s instead of numeric literal %d", s, n) - return true - } - // OPT(dh): replace with inspector - for _, f := range pass.Files { - ast.Inspect(f, fn) - } - return nil, nil -} - -func CheckDefaultCaseOrder(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - stmt := node.(*ast.SwitchStmt) - list := stmt.Body.List - for i, c := range list { - if c.(*ast.CaseClause).List == nil && i != 0 && i != len(list)-1 { - ReportNodefFG(pass, c, "default case should be first or last in switch statement") - break - } - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.SwitchStmt)(nil)}, fn) - return nil, nil -} - -func CheckYodaConditions(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - cond := node.(*ast.BinaryExpr) - if cond.Op != token.EQL && cond.Op != token.NEQ { - return - } - if _, ok := cond.X.(*ast.BasicLit); !ok { - return - } - if _, ok := cond.Y.(*ast.BasicLit); ok { - // Don't flag lit == lit conditions, just in case - return - } - ReportNodefFG(pass, cond, "don't use Yoda conditions") - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BinaryExpr)(nil)}, fn) - return nil, nil -} - -func CheckInvisibleCharacters(pass *analysis.Pass) (interface{}, error) { - fn := func(node ast.Node) { - lit := node.(*ast.BasicLit) - if lit.Kind != token.STRING { - return - } - for _, r := range lit.Value { - if unicode.Is(unicode.Cf, r) { - ReportNodef(pass, lit, "string literal contains the Unicode format character %U, consider using the %q escape sequence", r, r) - } else if unicode.Is(unicode.Cc, r) && r != '\n' && r != '\t' && r != '\r' { - ReportNodef(pass, lit, "string literal contains the Unicode control character %U, consider using the %q escape sequence", r, r) - } - } - } - pass.ResultOf[inspect.Analyzer].(*inspector.Inspector).Preorder([]ast.Node{(*ast.BasicLit)(nil)}, fn) - return nil, nil -} diff --git a/vendor/honnef.co/go/tools/stylecheck/names.go b/vendor/honnef.co/go/tools/stylecheck/names.go deleted file mode 100644 index 160f9d7ff71..00000000000 --- a/vendor/honnef.co/go/tools/stylecheck/names.go +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright (c) 2013 The Go Authors. All rights reserved. -// Copyright (c) 2018 Dominik Honnef. All rights reserved. - -package stylecheck - -import ( - "go/ast" - "go/token" - "strings" - "unicode" - - "golang.org/x/tools/go/analysis" - "honnef.co/go/tools/config" - . "honnef.co/go/tools/lint/lintdsl" -) - -// knownNameExceptions is a set of names that are known to be exempt from naming checks. -// This is usually because they are constrained by having to match names in the -// standard library. -var knownNameExceptions = map[string]bool{ - "LastInsertId": true, // must match database/sql - "kWh": true, -} - -func CheckNames(pass *analysis.Pass) (interface{}, error) { - // A large part of this function is copied from - // github.com/golang/lint, Copyright (c) 2013 The Go Authors, - // licensed under the BSD 3-clause license. - - allCaps := func(s string) bool { - for _, r := range s { - if !((r >= 'A' && r <= 'Z') || (r >= '0' && r <= '9') || r == '_') { - return false - } - } - return true - } - - check := func(id *ast.Ident, thing string, initialisms map[string]bool) { - if id.Name == "_" { - return - } - if knownNameExceptions[id.Name] { - return - } - - // Handle two common styles from other languages that don't belong in Go. - if len(id.Name) >= 5 && allCaps(id.Name) && strings.Contains(id.Name, "_") { - ReportfFG(pass, id.Pos(), "should not use ALL_CAPS in Go names; use CamelCase instead") - return - } - - should := lintName(id.Name, initialisms) - if id.Name == should { - return - } - - if len(id.Name) > 2 && strings.Contains(id.Name[1:len(id.Name)-1], "_") { - ReportfFG(pass, id.Pos(), "should not use underscores in Go names; %s %s should be %s", thing, id.Name, should) - return - } - ReportfFG(pass, id.Pos(), "%s %s should be %s", thing, id.Name, should) - } - checkList := func(fl *ast.FieldList, thing string, initialisms map[string]bool) { - if fl == nil { - return - } - for _, f := range fl.List { - for _, id := range f.Names { - check(id, thing, initialisms) - } - } - } - - il := config.For(pass).Initialisms - initialisms := make(map[string]bool, len(il)) - for _, word := range il { - initialisms[word] = true - } - for _, f := range pass.Files { - // Package names need slightly different handling than other names. - if !strings.HasSuffix(f.Name.Name, "_test") && strings.Contains(f.Name.Name, "_") { - ReportfFG(pass, f.Pos(), "should not use underscores in package names") - } - if strings.IndexFunc(f.Name.Name, unicode.IsUpper) != -1 { - ReportfFG(pass, f.Pos(), "should not use MixedCaps in package name; %s should be %s", f.Name.Name, strings.ToLower(f.Name.Name)) - } - - ast.Inspect(f, func(node ast.Node) bool { - switch v := node.(type) { - case *ast.AssignStmt: - if v.Tok != token.DEFINE { - return true - } - for _, exp := range v.Lhs { - if id, ok := exp.(*ast.Ident); ok { - check(id, "var", initialisms) - } - } - case *ast.FuncDecl: - // Functions with no body are defined elsewhere (in - // assembly, or via go:linkname). These are likely to - // be something very low level (such as the runtime), - // where our rules don't apply. - if v.Body == nil { - return true - } - - if IsInTest(pass, v) && (strings.HasPrefix(v.Name.Name, "Example") || strings.HasPrefix(v.Name.Name, "Test") || strings.HasPrefix(v.Name.Name, "Benchmark")) { - return true - } - - thing := "func" - if v.Recv != nil { - thing = "method" - } - - if !isTechnicallyExported(v) { - check(v.Name, thing, initialisms) - } - - checkList(v.Type.Params, thing+" parameter", initialisms) - checkList(v.Type.Results, thing+" result", initialisms) - case *ast.GenDecl: - if v.Tok == token.IMPORT { - return true - } - var thing string - switch v.Tok { - case token.CONST: - thing = "const" - case token.TYPE: - thing = "type" - case token.VAR: - thing = "var" - } - for _, spec := range v.Specs { - switch s := spec.(type) { - case *ast.TypeSpec: - check(s.Name, thing, initialisms) - case *ast.ValueSpec: - for _, id := range s.Names { - check(id, thing, initialisms) - } - } - } - case *ast.InterfaceType: - // Do not check interface method names. - // They are often constrainted by the method names of concrete types. - for _, x := range v.Methods.List { - ft, ok := x.Type.(*ast.FuncType) - if !ok { // might be an embedded interface name - continue - } - checkList(ft.Params, "interface method parameter", initialisms) - checkList(ft.Results, "interface method result", initialisms) - } - case *ast.RangeStmt: - if v.Tok == token.ASSIGN { - return true - } - if id, ok := v.Key.(*ast.Ident); ok { - check(id, "range var", initialisms) - } - if id, ok := v.Value.(*ast.Ident); ok { - check(id, "range var", initialisms) - } - case *ast.StructType: - for _, f := range v.Fields.List { - for _, id := range f.Names { - check(id, "struct field", initialisms) - } - } - } - return true - }) - } - return nil, nil -} - -// lintName returns a different name if it should be different. -func lintName(name string, initialisms map[string]bool) (should string) { - // A large part of this function is copied from - // github.com/golang/lint, Copyright (c) 2013 The Go Authors, - // licensed under the BSD 3-clause license. - - // Fast path for simple cases: "_" and all lowercase. - if name == "_" { - return name - } - if strings.IndexFunc(name, func(r rune) bool { return !unicode.IsLower(r) }) == -1 { - return name - } - - // Split camelCase at any lower->upper transition, and split on underscores. - // Check each word for common initialisms. - runes := []rune(name) - w, i := 0, 0 // index of start of word, scan - for i+1 <= len(runes) { - eow := false // whether we hit the end of a word - if i+1 == len(runes) { - eow = true - } else if runes[i+1] == '_' && i+1 != len(runes)-1 { - // underscore; shift the remainder forward over any run of underscores - eow = true - n := 1 - for i+n+1 < len(runes) && runes[i+n+1] == '_' { - n++ - } - - // Leave at most one underscore if the underscore is between two digits - if i+n+1 < len(runes) && unicode.IsDigit(runes[i]) && unicode.IsDigit(runes[i+n+1]) { - n-- - } - - copy(runes[i+1:], runes[i+n+1:]) - runes = runes[:len(runes)-n] - } else if unicode.IsLower(runes[i]) && !unicode.IsLower(runes[i+1]) { - // lower->non-lower - eow = true - } - i++ - if !eow { - continue - } - - // [w,i) is a word. - word := string(runes[w:i]) - if u := strings.ToUpper(word); initialisms[u] { - // Keep consistent case, which is lowercase only at the start. - if w == 0 && unicode.IsLower(runes[w]) { - u = strings.ToLower(u) - } - // All the common initialisms are ASCII, - // so we can replace the bytes exactly. - // TODO(dh): this won't be true once we allow custom initialisms - copy(runes[w:], []rune(u)) - } else if w > 0 && strings.ToLower(word) == word { - // already all lowercase, and not the first word, so uppercase the first character. - runes[w] = unicode.ToUpper(runes[w]) - } - w = i - } - return string(runes) -} - -func isTechnicallyExported(f *ast.FuncDecl) bool { - if f.Recv != nil || f.Doc == nil { - return false - } - - const export = "//export " - const linkname = "//go:linkname " - for _, c := range f.Doc.List { - if strings.HasPrefix(c.Text, export) && len(c.Text) == len(export)+len(f.Name.Name) && c.Text[len(export):] == f.Name.Name { - return true - } - - if strings.HasPrefix(c.Text, linkname) { - return true - } - } - return false -} diff --git a/vendor/honnef.co/go/tools/unused/BUILD b/vendor/honnef.co/go/tools/unused/BUILD deleted file mode 100644 index 7a6003d407c..00000000000 --- a/vendor/honnef.co/go/tools/unused/BUILD +++ /dev/null @@ -1,36 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "edge.go", - "edgekind_string.go", - "implements.go", - "unused.go", - ], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/unused", - importpath = "honnef.co/go/tools/unused", - visibility = ["//visibility:public"], - deps = [ - "//vendor/golang.org/x/tools/go/analysis:go_default_library", - "//vendor/honnef.co/go/tools/go/types/typeutil:go_default_library", - "//vendor/honnef.co/go/tools/internal/passes/buildssa:go_default_library", - "//vendor/honnef.co/go/tools/lint:go_default_library", - "//vendor/honnef.co/go/tools/lint/lintdsl:go_default_library", - "//vendor/honnef.co/go/tools/ssa:go_default_library", - ], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/unused/edge.go b/vendor/honnef.co/go/tools/unused/edge.go deleted file mode 100644 index 02e0d09cf2a..00000000000 --- a/vendor/honnef.co/go/tools/unused/edge.go +++ /dev/null @@ -1,54 +0,0 @@ -package unused - -//go:generate stringer -type edgeKind -type edgeKind uint64 - -func (e edgeKind) is(o edgeKind) bool { - return e&o != 0 -} - -const ( - edgeAlias edgeKind = 1 << iota - edgeBlankField - edgeAnonymousStruct - edgeCgoExported - edgeConstGroup - edgeElementType - edgeEmbeddedInterface - edgeExportedConstant - edgeExportedField - edgeExportedFunction - edgeExportedMethod - edgeExportedType - edgeExportedVariable - edgeExtendsExportedFields - edgeExtendsExportedMethodSet - edgeFieldAccess - edgeFunctionArgument - edgeFunctionResult - edgeFunctionSignature - edgeImplements - edgeInstructionOperand - edgeInterfaceCall - edgeInterfaceMethod - edgeKeyType - edgeLinkname - edgeMainFunction - edgeNamedType - edgeNetRPCRegister - edgeNoCopySentinel - edgeProvidesMethod - edgeReceiver - edgeRuntimeFunction - edgeSignature - edgeStructConversion - edgeTestSink - edgeTupleElement - edgeType - edgeTypeName - edgeUnderlyingType - edgePointerType - edgeUnsafeConversion - edgeUsedConstant - edgeVarDecl -) diff --git a/vendor/honnef.co/go/tools/unused/edgekind_string.go b/vendor/honnef.co/go/tools/unused/edgekind_string.go deleted file mode 100644 index 7629636cf13..00000000000 --- a/vendor/honnef.co/go/tools/unused/edgekind_string.go +++ /dev/null @@ -1,109 +0,0 @@ -// Code generated by "stringer -type edgeKind"; DO NOT EDIT. - -package unused - -import "strconv" - -func _() { - // An "invalid array index" compiler error signifies that the constant values have changed. - // Re-run the stringer command to generate them again. - var x [1]struct{} - _ = x[edgeAlias-1] - _ = x[edgeBlankField-2] - _ = x[edgeAnonymousStruct-4] - _ = x[edgeCgoExported-8] - _ = x[edgeConstGroup-16] - _ = x[edgeElementType-32] - _ = x[edgeEmbeddedInterface-64] - _ = x[edgeExportedConstant-128] - _ = x[edgeExportedField-256] - _ = x[edgeExportedFunction-512] - _ = x[edgeExportedMethod-1024] - _ = x[edgeExportedType-2048] - _ = x[edgeExportedVariable-4096] - _ = x[edgeExtendsExportedFields-8192] - _ = x[edgeExtendsExportedMethodSet-16384] - _ = x[edgeFieldAccess-32768] - _ = x[edgeFunctionArgument-65536] - _ = x[edgeFunctionResult-131072] - _ = x[edgeFunctionSignature-262144] - _ = x[edgeImplements-524288] - _ = x[edgeInstructionOperand-1048576] - _ = x[edgeInterfaceCall-2097152] - _ = x[edgeInterfaceMethod-4194304] - _ = x[edgeKeyType-8388608] - _ = x[edgeLinkname-16777216] - _ = x[edgeMainFunction-33554432] - _ = x[edgeNamedType-67108864] - _ = x[edgeNetRPCRegister-134217728] - _ = x[edgeNoCopySentinel-268435456] - _ = x[edgeProvidesMethod-536870912] - _ = x[edgeReceiver-1073741824] - _ = x[edgeRuntimeFunction-2147483648] - _ = x[edgeSignature-4294967296] - _ = x[edgeStructConversion-8589934592] - _ = x[edgeTestSink-17179869184] - _ = x[edgeTupleElement-34359738368] - _ = x[edgeType-68719476736] - _ = x[edgeTypeName-137438953472] - _ = x[edgeUnderlyingType-274877906944] - _ = x[edgePointerType-549755813888] - _ = x[edgeUnsafeConversion-1099511627776] - _ = x[edgeUsedConstant-2199023255552] - _ = x[edgeVarDecl-4398046511104] -} - -const _edgeKind_name = "edgeAliasedgeBlankFieldedgeAnonymousStructedgeCgoExportededgeConstGroupedgeElementTypeedgeEmbeddedInterfaceedgeExportedConstantedgeExportedFieldedgeExportedFunctionedgeExportedMethodedgeExportedTypeedgeExportedVariableedgeExtendsExportedFieldsedgeExtendsExportedMethodSetedgeFieldAccessedgeFunctionArgumentedgeFunctionResultedgeFunctionSignatureedgeImplementsedgeInstructionOperandedgeInterfaceCalledgeInterfaceMethodedgeKeyTypeedgeLinknameedgeMainFunctionedgeNamedTypeedgeNetRPCRegisteredgeNoCopySentineledgeProvidesMethodedgeReceiveredgeRuntimeFunctionedgeSignatureedgeStructConversionedgeTestSinkedgeTupleElementedgeTypeedgeTypeNameedgeUnderlyingTypeedgePointerTypeedgeUnsafeConversionedgeUsedConstantedgeVarDecl" - -var _edgeKind_map = map[edgeKind]string{ - 1: _edgeKind_name[0:9], - 2: _edgeKind_name[9:23], - 4: _edgeKind_name[23:42], - 8: _edgeKind_name[42:57], - 16: _edgeKind_name[57:71], - 32: _edgeKind_name[71:86], - 64: _edgeKind_name[86:107], - 128: _edgeKind_name[107:127], - 256: _edgeKind_name[127:144], - 512: _edgeKind_name[144:164], - 1024: _edgeKind_name[164:182], - 2048: _edgeKind_name[182:198], - 4096: _edgeKind_name[198:218], - 8192: _edgeKind_name[218:243], - 16384: _edgeKind_name[243:271], - 32768: _edgeKind_name[271:286], - 65536: _edgeKind_name[286:306], - 131072: _edgeKind_name[306:324], - 262144: _edgeKind_name[324:345], - 524288: _edgeKind_name[345:359], - 1048576: _edgeKind_name[359:381], - 2097152: _edgeKind_name[381:398], - 4194304: _edgeKind_name[398:417], - 8388608: _edgeKind_name[417:428], - 16777216: _edgeKind_name[428:440], - 33554432: _edgeKind_name[440:456], - 67108864: _edgeKind_name[456:469], - 134217728: _edgeKind_name[469:487], - 268435456: _edgeKind_name[487:505], - 536870912: _edgeKind_name[505:523], - 1073741824: _edgeKind_name[523:535], - 2147483648: _edgeKind_name[535:554], - 4294967296: _edgeKind_name[554:567], - 8589934592: _edgeKind_name[567:587], - 17179869184: _edgeKind_name[587:599], - 34359738368: _edgeKind_name[599:615], - 68719476736: _edgeKind_name[615:623], - 137438953472: _edgeKind_name[623:635], - 274877906944: _edgeKind_name[635:653], - 549755813888: _edgeKind_name[653:668], - 1099511627776: _edgeKind_name[668:688], - 2199023255552: _edgeKind_name[688:704], - 4398046511104: _edgeKind_name[704:715], -} - -func (i edgeKind) String() string { - if str, ok := _edgeKind_map[i]; ok { - return str - } - return "edgeKind(" + strconv.FormatInt(int64(i), 10) + ")" -} diff --git a/vendor/honnef.co/go/tools/unused/implements.go b/vendor/honnef.co/go/tools/unused/implements.go deleted file mode 100644 index 835baac6925..00000000000 --- a/vendor/honnef.co/go/tools/unused/implements.go +++ /dev/null @@ -1,82 +0,0 @@ -package unused - -import "go/types" - -// lookupMethod returns the index of and method with matching package and name, or (-1, nil). -func lookupMethod(T *types.Interface, pkg *types.Package, name string) (int, *types.Func) { - if name != "_" { - for i := 0; i < T.NumMethods(); i++ { - m := T.Method(i) - if sameId(m, pkg, name) { - return i, m - } - } - } - return -1, nil -} - -func sameId(obj types.Object, pkg *types.Package, name string) bool { - // spec: - // "Two identifiers are different if they are spelled differently, - // or if they appear in different packages and are not exported. - // Otherwise, they are the same." - if name != obj.Name() { - return false - } - // obj.Name == name - if obj.Exported() { - return true - } - // not exported, so packages must be the same (pkg == nil for - // fields in Universe scope; this can only happen for types - // introduced via Eval) - if pkg == nil || obj.Pkg() == nil { - return pkg == obj.Pkg() - } - // pkg != nil && obj.pkg != nil - return pkg.Path() == obj.Pkg().Path() -} - -func (g *Graph) implements(V types.Type, T *types.Interface, msV *types.MethodSet) ([]*types.Selection, bool) { - // fast path for common case - if T.Empty() { - return nil, true - } - - if ityp, _ := V.Underlying().(*types.Interface); ityp != nil { - // TODO(dh): is this code reachable? - for i := 0; i < T.NumMethods(); i++ { - m := T.Method(i) - _, obj := lookupMethod(ityp, m.Pkg(), m.Name()) - switch { - case obj == nil: - return nil, false - case !types.Identical(obj.Type(), m.Type()): - return nil, false - } - } - return nil, true - } - - // A concrete type implements T if it implements all methods of T. - var sels []*types.Selection - for i := 0; i < T.NumMethods(); i++ { - m := T.Method(i) - sel := msV.Lookup(m.Pkg(), m.Name()) - if sel == nil { - return nil, false - } - - f, _ := sel.Obj().(*types.Func) - if f == nil { - return nil, false - } - - if !types.Identical(f.Type(), m.Type()) { - return nil, false - } - - sels = append(sels, sel) - } - return sels, true -} diff --git a/vendor/honnef.co/go/tools/unused/unused.go b/vendor/honnef.co/go/tools/unused/unused.go deleted file mode 100644 index 152d3692dd8..00000000000 --- a/vendor/honnef.co/go/tools/unused/unused.go +++ /dev/null @@ -1,1964 +0,0 @@ -package unused - -import ( - "fmt" - "go/ast" - "go/token" - "go/types" - "io" - "strings" - "sync" - "sync/atomic" - - "golang.org/x/tools/go/analysis" - "honnef.co/go/tools/go/types/typeutil" - "honnef.co/go/tools/internal/passes/buildssa" - "honnef.co/go/tools/lint" - "honnef.co/go/tools/lint/lintdsl" - "honnef.co/go/tools/ssa" -) - -// The graph we construct omits nodes along a path that do not -// contribute any new information to the solution. For example, the -// full graph for a function with a receiver would be Func -> -// Signature -> Var -> Type. However, since signatures cannot be -// unused, and receivers are always considered used, we can compact -// the graph down to Func -> Type. This makes the graph smaller, but -// harder to debug. - -// TODO(dh): conversions between structs mark fields as used, but the -// conversion itself isn't part of that subgraph. even if the function -// containing the conversion is unused, the fields will be marked as -// used. - -// TODO(dh): we cannot observe function calls in assembly files. - -/* - -- packages use: - - (1.1) exported named types (unless in package main) - - (1.2) exported functions (unless in package main) - - (1.3) exported variables (unless in package main) - - (1.4) exported constants (unless in package main) - - (1.5) init functions - - (1.6) functions exported to cgo - - (1.7) the main function iff in the main package - - (1.8) symbols linked via go:linkname - -- named types use: - - (2.1) exported methods - - (2.2) the type they're based on - - (2.3) all their aliases. we can't easily track uses of aliases - because go/types turns them into uses of the aliased types. assume - that if a type is used, so are all of its aliases. - - (2.4) the pointer type. this aids with eagerly implementing - interfaces. if a method that implements an interface is defined on - a pointer receiver, and the pointer type is never used, but the - named type is, then we still want to mark the method as used. - -- variables and constants use: - - their types - -- functions use: - - (4.1) all their arguments, return parameters and receivers - - (4.2) anonymous functions defined beneath them - - (4.3) closures and bound methods. - this implements a simplified model where a function is used merely by being referenced, even if it is never called. - that way we don't have to keep track of closures escaping functions. - - (4.4) functions they return. we assume that someone else will call the returned function - - (4.5) functions/interface methods they call - - types they instantiate or convert to - - (4.7) fields they access - - (4.8) types of all instructions - - (4.9) package-level variables they assign to iff in tests (sinks for benchmarks) - -- conversions use: - - (5.1) when converting between two equivalent structs, the fields in - either struct use each other. the fields are relevant for the - conversion, but only if the fields are also accessed outside the - conversion. - - (5.2) when converting to or from unsafe.Pointer, mark all fields as used. - -- structs use: - - (6.1) fields of type NoCopy sentinel - - (6.2) exported fields - - (6.3) embedded fields that help implement interfaces (either fully implements it, or contributes required methods) (recursively) - - (6.4) embedded fields that have exported methods (recursively) - - (6.5) embedded structs that have exported fields (recursively) - -- (7.1) field accesses use fields -- (7.2) fields use their types - -- (8.0) How we handle interfaces: - - (8.1) We do not technically care about interfaces that only consist of - exported methods. Exported methods on concrete types are always - marked as used. - - Any concrete type implements all known interfaces. Even if it isn't - assigned to any interfaces in our code, the user may receive a value - of the type and expect to pass it back to us through an interface. - - Concrete types use their methods that implement interfaces. If the - type is used, it uses those methods. Otherwise, it doesn't. This - way, types aren't incorrectly marked reachable through the edge - from method to type. - - - (8.3) All interface methods are marked as used, even if they never get - called. This is to accomodate sum types (unexported interface - method that must exist but never gets called.) - - - (8.4) All embedded interfaces are marked as used. This is an - extension of 8.3, but we have to explicitly track embedded - interfaces because in a chain C->B->A, B wouldn't be marked as - used by 8.3 just because it contributes A's methods to C. - -- Inherent uses: - - thunks and other generated wrappers call the real function - - (9.2) variables use their types - - (9.3) types use their underlying and element types - - (9.4) conversions use the type they convert to - - (9.5) instructions use their operands - - (9.6) instructions use their operands' types - - (9.7) variable _reads_ use variables, writes do not, except in tests - - (9.8) runtime functions that may be called from user code via the compiler - - -- const groups: - (10.1) if one constant out of a block of constants is used, mark all - of them used. a lot of the time, unused constants exist for the sake - of completeness. See also - https://github.com/dominikh/go-tools/issues/365 - - -- (11.1) anonymous struct types use all their fields. we cannot - deduplicate struct types, as that leads to order-dependent - reportings. we can't not deduplicate struct types while still - tracking fields, because then each instance of the unnamed type in - the data flow chain will get its own fields, causing false - positives. Thus, we only accurately track fields of named struct - types, and assume that unnamed struct types use all their fields. - - -- Differences in whole program mode: - - (e2) types aim to implement all exported interfaces from all packages - - (e3) exported identifiers aren't automatically used. for fields and - methods this poses extra issues due to reflection. We assume - that all exported fields are used. We also maintain a list of - known reflection-based method callers. - -*/ - -func assert(b bool) { - if !b { - panic("failed assertion") - } -} - -func typString(obj types.Object) string { - switch obj := obj.(type) { - case *types.Func: - return "func" - case *types.Var: - if obj.IsField() { - return "field" - } - return "var" - case *types.Const: - return "const" - case *types.TypeName: - return "type" - default: - return "identifier" - } -} - -// /usr/lib/go/src/runtime/proc.go:433:6: func badmorestackg0 is unused (U1000) - -// Functions defined in the Go runtime that may be called through -// compiler magic or via assembly. -var runtimeFuncs = map[string]bool{ - // The first part of the list is copied from - // cmd/compile/internal/gc/builtin.go, var runtimeDecls - "newobject": true, - "panicindex": true, - "panicslice": true, - "panicdivide": true, - "panicmakeslicelen": true, - "throwinit": true, - "panicwrap": true, - "gopanic": true, - "gorecover": true, - "goschedguarded": true, - "printbool": true, - "printfloat": true, - "printint": true, - "printhex": true, - "printuint": true, - "printcomplex": true, - "printstring": true, - "printpointer": true, - "printiface": true, - "printeface": true, - "printslice": true, - "printnl": true, - "printsp": true, - "printlock": true, - "printunlock": true, - "concatstring2": true, - "concatstring3": true, - "concatstring4": true, - "concatstring5": true, - "concatstrings": true, - "cmpstring": true, - "intstring": true, - "slicebytetostring": true, - "slicebytetostringtmp": true, - "slicerunetostring": true, - "stringtoslicebyte": true, - "stringtoslicerune": true, - "slicecopy": true, - "slicestringcopy": true, - "decoderune": true, - "countrunes": true, - "convI2I": true, - "convT16": true, - "convT32": true, - "convT64": true, - "convTstring": true, - "convTslice": true, - "convT2E": true, - "convT2Enoptr": true, - "convT2I": true, - "convT2Inoptr": true, - "assertE2I": true, - "assertE2I2": true, - "assertI2I": true, - "assertI2I2": true, - "panicdottypeE": true, - "panicdottypeI": true, - "panicnildottype": true, - "ifaceeq": true, - "efaceeq": true, - "fastrand": true, - "makemap64": true, - "makemap": true, - "makemap_small": true, - "mapaccess1": true, - "mapaccess1_fast32": true, - "mapaccess1_fast64": true, - "mapaccess1_faststr": true, - "mapaccess1_fat": true, - "mapaccess2": true, - "mapaccess2_fast32": true, - "mapaccess2_fast64": true, - "mapaccess2_faststr": true, - "mapaccess2_fat": true, - "mapassign": true, - "mapassign_fast32": true, - "mapassign_fast32ptr": true, - "mapassign_fast64": true, - "mapassign_fast64ptr": true, - "mapassign_faststr": true, - "mapiterinit": true, - "mapdelete": true, - "mapdelete_fast32": true, - "mapdelete_fast64": true, - "mapdelete_faststr": true, - "mapiternext": true, - "mapclear": true, - "makechan64": true, - "makechan": true, - "chanrecv1": true, - "chanrecv2": true, - "chansend1": true, - "closechan": true, - "writeBarrier": true, - "typedmemmove": true, - "typedmemclr": true, - "typedslicecopy": true, - "selectnbsend": true, - "selectnbrecv": true, - "selectnbrecv2": true, - "selectsetpc": true, - "selectgo": true, - "block": true, - "makeslice": true, - "makeslice64": true, - "growslice": true, - "memmove": true, - "memclrNoHeapPointers": true, - "memclrHasPointers": true, - "memequal": true, - "memequal8": true, - "memequal16": true, - "memequal32": true, - "memequal64": true, - "memequal128": true, - "int64div": true, - "uint64div": true, - "int64mod": true, - "uint64mod": true, - "float64toint64": true, - "float64touint64": true, - "float64touint32": true, - "int64tofloat64": true, - "uint64tofloat64": true, - "uint32tofloat64": true, - "complex128div": true, - "racefuncenter": true, - "racefuncenterfp": true, - "racefuncexit": true, - "raceread": true, - "racewrite": true, - "racereadrange": true, - "racewriterange": true, - "msanread": true, - "msanwrite": true, - "x86HasPOPCNT": true, - "x86HasSSE41": true, - "arm64HasATOMICS": true, - - // The second part of the list is extracted from assembly code in - // the standard library, with the exception of the runtime package itself - "abort": true, - "aeshashbody": true, - "args": true, - "asminit": true, - "badctxt": true, - "badmcall2": true, - "badmcall": true, - "badmorestackg0": true, - "badmorestackgsignal": true, - "badsignal2": true, - "callbackasm1": true, - "callCfunction": true, - "cgocallback_gofunc": true, - "cgocallbackg": true, - "checkgoarm": true, - "check": true, - "debugCallCheck": true, - "debugCallWrap": true, - "emptyfunc": true, - "entersyscall": true, - "exit": true, - "exits": true, - "exitsyscall": true, - "externalthreadhandler": true, - "findnull": true, - "goexit1": true, - "gostring": true, - "i386_set_ldt": true, - "_initcgo": true, - "init_thread_tls": true, - "ldt0setup": true, - "libpreinit": true, - "load_g": true, - "morestack": true, - "mstart": true, - "nacl_sysinfo": true, - "nanotimeQPC": true, - "nanotime": true, - "newosproc0": true, - "newproc": true, - "newstack": true, - "noted": true, - "nowQPC": true, - "osinit": true, - "printf": true, - "racecallback": true, - "reflectcallmove": true, - "reginit": true, - "rt0_go": true, - "save_g": true, - "schedinit": true, - "setldt": true, - "settls": true, - "sighandler": true, - "sigprofNonGo": true, - "sigtrampgo": true, - "_sigtramp": true, - "sigtramp": true, - "stackcheck": true, - "syscall_chdir": true, - "syscall_chroot": true, - "syscall_close": true, - "syscall_dup2": true, - "syscall_execve": true, - "syscall_exit": true, - "syscall_fcntl": true, - "syscall_forkx": true, - "syscall_gethostname": true, - "syscall_getpid": true, - "syscall_ioctl": true, - "syscall_pipe": true, - "syscall_rawsyscall6": true, - "syscall_rawSyscall6": true, - "syscall_rawsyscall": true, - "syscall_RawSyscall": true, - "syscall_rawsysvicall6": true, - "syscall_setgid": true, - "syscall_setgroups": true, - "syscall_setpgid": true, - "syscall_setsid": true, - "syscall_setuid": true, - "syscall_syscall6": true, - "syscall_syscall": true, - "syscall_Syscall": true, - "syscall_sysvicall6": true, - "syscall_wait4": true, - "syscall_write": true, - "traceback": true, - "tstart": true, - "usplitR0": true, - "wbBufFlush": true, - "write": true, -} - -type pkg struct { - Fset *token.FileSet - Files []*ast.File - Pkg *types.Package - TypesInfo *types.Info - TypesSizes types.Sizes - SSA *ssa.Package - SrcFuncs []*ssa.Function -} - -type Checker struct { - WholeProgram bool - Debug io.Writer - - mu sync.Mutex - initialPackages map[*types.Package]struct{} - allPackages map[*types.Package]struct{} - graph *Graph -} - -func NewChecker(wholeProgram bool) *Checker { - return &Checker{ - initialPackages: map[*types.Package]struct{}{}, - allPackages: map[*types.Package]struct{}{}, - WholeProgram: wholeProgram, - } -} - -func (c *Checker) Analyzer() *analysis.Analyzer { - name := "U1000" - if c.WholeProgram { - name = "U1001" - } - return &analysis.Analyzer{ - Name: name, - Doc: "Unused code", - Run: c.Run, - Requires: []*analysis.Analyzer{buildssa.Analyzer}, - } -} - -func (c *Checker) Run(pass *analysis.Pass) (interface{}, error) { - c.mu.Lock() - if c.graph == nil { - c.graph = NewGraph() - c.graph.wholeProgram = c.WholeProgram - c.graph.fset = pass.Fset - } - - var visit func(pkg *types.Package) - visit = func(pkg *types.Package) { - if _, ok := c.allPackages[pkg]; ok { - return - } - c.allPackages[pkg] = struct{}{} - for _, imp := range pkg.Imports() { - visit(imp) - } - } - visit(pass.Pkg) - - c.initialPackages[pass.Pkg] = struct{}{} - c.mu.Unlock() - - ssapkg := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA) - pkg := &pkg{ - Fset: pass.Fset, - Files: pass.Files, - Pkg: pass.Pkg, - TypesInfo: pass.TypesInfo, - TypesSizes: pass.TypesSizes, - SSA: ssapkg.Pkg, - SrcFuncs: ssapkg.SrcFuncs, - } - - c.processPkg(c.graph, pkg) - - return nil, nil -} - -func (c *Checker) ProblemObject(fset *token.FileSet, obj types.Object) lint.Problem { - name := obj.Name() - if sig, ok := obj.Type().(*types.Signature); ok && sig.Recv() != nil { - switch sig.Recv().Type().(type) { - case *types.Named, *types.Pointer: - typ := types.TypeString(sig.Recv().Type(), func(*types.Package) string { return "" }) - if len(typ) > 0 && typ[0] == '*' { - name = fmt.Sprintf("(%s).%s", typ, obj.Name()) - } else if len(typ) > 0 { - name = fmt.Sprintf("%s.%s", typ, obj.Name()) - } - } - } - - checkName := "U1000" - if c.WholeProgram { - checkName = "U1001" - } - return lint.Problem{ - Pos: lint.DisplayPosition(fset, obj.Pos()), - Message: fmt.Sprintf("%s %s is unused", typString(obj), name), - Check: checkName, - } -} - -func (c *Checker) Result() []types.Object { - out := c.results() - - out2 := make([]types.Object, 0, len(out)) - for _, v := range out { - if _, ok := c.initialPackages[v.Pkg()]; !ok { - continue - } - out2 = append(out2, v) - } - - return out2 -} - -func (c *Checker) debugf(f string, v ...interface{}) { - if c.Debug != nil { - fmt.Fprintf(c.Debug, f, v...) - } -} - -func (graph *Graph) quieten(node *Node) { - if node.seen { - return - } - switch obj := node.obj.(type) { - case *types.Named: - for i := 0; i < obj.NumMethods(); i++ { - m := obj.Method(i) - if node, ok := graph.nodeMaybe(m); ok { - node.quiet = true - } - } - case *types.Struct: - for i := 0; i < obj.NumFields(); i++ { - if node, ok := graph.nodeMaybe(obj.Field(i)); ok { - node.quiet = true - } - } - case *types.Interface: - for i := 0; i < obj.NumExplicitMethods(); i++ { - m := obj.ExplicitMethod(i) - if node, ok := graph.nodeMaybe(m); ok { - node.quiet = true - } - } - } -} - -func (c *Checker) results() []types.Object { - if c.graph == nil { - // We never analyzed any packages - return nil - } - - var out []types.Object - - if c.WholeProgram { - var ifaces []*types.Interface - var notIfaces []types.Type - - // implement as many interfaces as possible - c.graph.seenTypes.Iterate(func(t types.Type, _ interface{}) { - switch t := t.(type) { - case *types.Interface: - if t.NumMethods() > 0 { - ifaces = append(ifaces, t) - } - default: - if _, ok := t.Underlying().(*types.Interface); !ok { - notIfaces = append(notIfaces, t) - } - } - }) - - for pkg := range c.allPackages { - for _, iface := range interfacesFromExportData(pkg) { - if iface.NumMethods() > 0 { - ifaces = append(ifaces, iface) - } - } - } - - ctx := &context{ - g: c.graph, - seenTypes: &c.graph.seenTypes, - } - // (8.0) handle interfaces - // (e2) types aim to implement all exported interfaces from all packages - for _, t := range notIfaces { - // OPT(dh): it is unfortunate that we do not have access - // to a populated method set at this point. - ms := types.NewMethodSet(t) - for _, iface := range ifaces { - if sels, ok := c.graph.implements(t, iface, ms); ok { - for _, sel := range sels { - c.graph.useMethod(ctx, t, sel, t, edgeImplements) - } - } - } - } - } - - if c.Debug != nil { - debugNode := func(node *Node) { - if node.obj == nil { - c.debugf("n%d [label=\"Root\"];\n", node.id) - } else { - c.debugf("n%d [label=%q];\n", node.id, fmt.Sprintf("(%T) %s", node.obj, node.obj)) - } - for _, e := range node.used { - for i := edgeKind(1); i < 64; i++ { - if e.kind.is(1 << i) { - c.debugf("n%d -> n%d [label=%q];\n", node.id, e.node.id, edgeKind(1< 1 { - cg := &ConstGroup{} - ctx.see(cg) - for _, spec := range specs { - for _, name := range spec.(*ast.ValueSpec).Names { - obj := pkg.TypesInfo.ObjectOf(name) - // (10.1) const groups - ctx.seeAndUse(obj, cg, edgeConstGroup) - ctx.use(cg, obj, edgeConstGroup) - } - } - } - } - case token.VAR: - for _, spec := range n.Specs { - v := spec.(*ast.ValueSpec) - for _, name := range v.Names { - T := pkg.TypesInfo.TypeOf(name) - if fn != nil { - ctx.seeAndUse(T, fn, edgeVarDecl) - } else { - // TODO(dh): we likely want to make - // the type used by the variable, not - // the package containing the - // variable. But then we have to take - // special care of blank identifiers. - ctx.seeAndUse(T, nil, edgeVarDecl) - } - g.typ(ctx, T, nil) - } - } - case token.TYPE: - for _, spec := range n.Specs { - // go/types doesn't provide a way to go from a - // types.Named to the named type it was based on - // (the t1 in type t2 t1). Therefore we walk the - // AST and process GenDecls. - // - // (2.2) named types use the type they're based on - v := spec.(*ast.TypeSpec) - T := pkg.TypesInfo.TypeOf(v.Type) - obj := pkg.TypesInfo.ObjectOf(v.Name) - ctx.see(obj) - ctx.see(T) - ctx.use(T, obj, edgeType) - g.typ(ctx, obj.Type(), nil) - g.typ(ctx, T, nil) - - if v.Assign != 0 { - aliasFor := obj.(*types.TypeName).Type() - // (2.3) named types use all their aliases. we can't easily track uses of aliases - if isIrrelevant(aliasFor) { - // We do not track the type this is an - // alias for (for example builtins), so - // just mark the alias used. - // - // FIXME(dh): what about aliases declared inside functions? - ctx.use(obj, nil, edgeAlias) - } else { - ctx.see(aliasFor) - ctx.seeAndUse(obj, aliasFor, edgeAlias) - } - } - } - } - } - return true - }) - } - - for _, m := range pkg.SSA.Members { - switch m := m.(type) { - case *ssa.NamedConst: - // nothing to do, we collect all constants from Defs - case *ssa.Global: - if m.Object() != nil { - ctx.see(m.Object()) - if g.trackExportedIdentifier(ctx, m.Object()) { - // (1.3) packages use exported variables (unless in package main) - ctx.use(m.Object(), nil, edgeExportedVariable) - } - } - case *ssa.Function: - mObj := owningObject(m) - if mObj != nil { - ctx.see(mObj) - } - //lint:ignore SA9003 handled implicitly - if m.Name() == "init" { - // (1.5) packages use init functions - // - // This is handled implicitly. The generated init - // function has no object, thus everything in it will - // be owned by the package. - } - // This branch catches top-level functions, not methods. - if m.Object() != nil && g.trackExportedIdentifier(ctx, m.Object()) { - // (1.2) packages use exported functions (unless in package main) - ctx.use(mObj, nil, edgeExportedFunction) - } - if m.Name() == "main" && pkg.Pkg.Name() == "main" { - // (1.7) packages use the main function iff in the main package - ctx.use(mObj, nil, edgeMainFunction) - } - if pkg.Pkg.Path() == "runtime" && runtimeFuncs[m.Name()] { - // (9.8) runtime functions that may be called from user code via the compiler - ctx.use(mObj, nil, edgeRuntimeFunction) - } - if m.Syntax() != nil { - doc := m.Syntax().(*ast.FuncDecl).Doc - if doc != nil { - for _, cmt := range doc.List { - if strings.HasPrefix(cmt.Text, "//go:cgo_export_") { - // (1.6) packages use functions exported to cgo - ctx.use(mObj, nil, edgeCgoExported) - } - } - } - } - g.function(ctx, m) - case *ssa.Type: - if m.Object() != nil { - ctx.see(m.Object()) - if g.trackExportedIdentifier(ctx, m.Object()) { - // (1.1) packages use exported named types (unless in package main) - ctx.use(m.Object(), nil, edgeExportedType) - } - } - g.typ(ctx, m.Type(), nil) - default: - panic(fmt.Sprintf("unreachable: %T", m)) - } - } - - if !g.wholeProgram { - // When not in whole program mode we reset seenTypes after each package, - // which means g.seenTypes only contains types of - // interest to us. In whole program mode, we're better off - // processing all interfaces at once, globally, both for - // performance reasons and because in whole program mode we - // actually care about all interfaces, not just the subset - // that has unexported methods. - - var ifaces []*types.Interface - var notIfaces []types.Type - - ctx.seenTypes.Iterate(func(t types.Type, _ interface{}) { - switch t := t.(type) { - case *types.Interface: - // OPT(dh): (8.1) we only need interfaces that have unexported methods - ifaces = append(ifaces, t) - default: - if _, ok := t.Underlying().(*types.Interface); !ok { - notIfaces = append(notIfaces, t) - } - } - }) - - // (8.0) handle interfaces - for _, t := range notIfaces { - ms := pkg.SSA.Prog.MethodSets.MethodSet(t) - for _, iface := range ifaces { - if sels, ok := g.implements(t, iface, ms); ok { - for _, sel := range sels { - g.useMethod(ctx, t, sel, t, edgeImplements) - } - } - } - } - } -} - -func (g *Graph) useMethod(ctx *context, t types.Type, sel *types.Selection, by interface{}, kind edgeKind) { - obj := sel.Obj() - path := sel.Index() - assert(obj != nil) - if len(path) > 1 { - base := lintdsl.Dereference(t).Underlying().(*types.Struct) - for _, idx := range path[:len(path)-1] { - next := base.Field(idx) - // (6.3) structs use embedded fields that help implement interfaces - ctx.see(base) - ctx.seeAndUse(next, base, edgeProvidesMethod) - base, _ = lintdsl.Dereference(next.Type()).Underlying().(*types.Struct) - } - } - ctx.seeAndUse(obj, by, kind) -} - -func owningObject(fn *ssa.Function) types.Object { - if fn.Object() != nil { - return fn.Object() - } - if fn.Parent() != nil { - return owningObject(fn.Parent()) - } - return nil -} - -func (g *Graph) function(ctx *context, fn *ssa.Function) { - if fn.Package() != nil && fn.Package() != ctx.pkg.SSA { - return - } - - name := fn.RelString(nil) - if _, ok := ctx.seenFns[name]; ok { - return - } - ctx.seenFns[name] = struct{}{} - - // (4.1) functions use all their arguments, return parameters and receivers - g.signature(ctx, fn.Signature, owningObject(fn)) - g.instructions(ctx, fn) - for _, anon := range fn.AnonFuncs { - // (4.2) functions use anonymous functions defined beneath them - // - // This fact is expressed implicitly. Anonymous functions have - // no types.Object, so their owner is the surrounding - // function. - g.function(ctx, anon) - } -} - -func (g *Graph) typ(ctx *context, t types.Type, parent types.Type) { - if g.wholeProgram { - g.mu.Lock() - } - if ctx.seenTypes.At(t) != nil { - if g.wholeProgram { - g.mu.Unlock() - } - return - } - if g.wholeProgram { - g.mu.Unlock() - } - if t, ok := t.(*types.Named); ok && t.Obj().Pkg() != nil { - if t.Obj().Pkg() != ctx.pkg.Pkg { - return - } - } - - if g.wholeProgram { - g.mu.Lock() - } - ctx.seenTypes.Set(t, struct{}{}) - if g.wholeProgram { - g.mu.Unlock() - } - if isIrrelevant(t) { - return - } - - ctx.see(t) - switch t := t.(type) { - case *types.Struct: - for i := 0; i < t.NumFields(); i++ { - ctx.see(t.Field(i)) - if t.Field(i).Exported() { - // (6.2) structs use exported fields - ctx.use(t.Field(i), t, edgeExportedField) - } else if t.Field(i).Name() == "_" { - ctx.use(t.Field(i), t, edgeBlankField) - } else if isNoCopyType(t.Field(i).Type()) { - // (6.1) structs use fields of type NoCopy sentinel - ctx.use(t.Field(i), t, edgeNoCopySentinel) - } else if parent == nil { - // (11.1) anonymous struct types use all their fields. - ctx.use(t.Field(i), t, edgeAnonymousStruct) - } - if t.Field(i).Anonymous() { - // (e3) exported identifiers aren't automatically used. - if !g.wholeProgram { - // does the embedded field contribute exported methods to the method set? - T := t.Field(i).Type() - if _, ok := T.Underlying().(*types.Pointer); !ok { - // An embedded field is addressable, so check - // the pointer type to get the full method set - T = types.NewPointer(T) - } - ms := ctx.pkg.SSA.Prog.MethodSets.MethodSet(T) - for j := 0; j < ms.Len(); j++ { - if ms.At(j).Obj().Exported() { - // (6.4) structs use embedded fields that have exported methods (recursively) - ctx.use(t.Field(i), t, edgeExtendsExportedMethodSet) - break - } - } - } - - seen := map[*types.Struct]struct{}{} - var hasExportedField func(t types.Type) bool - hasExportedField = func(T types.Type) bool { - t, ok := lintdsl.Dereference(T).Underlying().(*types.Struct) - if !ok { - return false - } - if _, ok := seen[t]; ok { - return false - } - seen[t] = struct{}{} - for i := 0; i < t.NumFields(); i++ { - field := t.Field(i) - if field.Exported() { - return true - } - if field.Embedded() && hasExportedField(field.Type()) { - return true - } - } - return false - } - // does the embedded field contribute exported fields? - if hasExportedField(t.Field(i).Type()) { - // (6.5) structs use embedded structs that have exported fields (recursively) - ctx.use(t.Field(i), t, edgeExtendsExportedFields) - } - - } - g.variable(ctx, t.Field(i)) - } - case *types.Basic: - // Nothing to do - case *types.Named: - // (9.3) types use their underlying and element types - ctx.seeAndUse(t.Underlying(), t, edgeUnderlyingType) - ctx.seeAndUse(t.Obj(), t, edgeTypeName) - ctx.seeAndUse(t, t.Obj(), edgeNamedType) - - // (2.4) named types use the pointer type - if _, ok := t.Underlying().(*types.Interface); !ok && t.NumMethods() > 0 { - ctx.seeAndUse(types.NewPointer(t), t, edgePointerType) - } - - for i := 0; i < t.NumMethods(); i++ { - ctx.see(t.Method(i)) - // don't use trackExportedIdentifier here, we care about - // all exported methods, even in package main or in tests. - if t.Method(i).Exported() && !g.wholeProgram { - // (2.1) named types use exported methods - ctx.use(t.Method(i), t, edgeExportedMethod) - } - g.function(ctx, ctx.pkg.SSA.Prog.FuncValue(t.Method(i))) - } - - g.typ(ctx, t.Underlying(), t) - case *types.Slice: - // (9.3) types use their underlying and element types - ctx.seeAndUse(t.Elem(), t, edgeElementType) - g.typ(ctx, t.Elem(), nil) - case *types.Map: - // (9.3) types use their underlying and element types - ctx.seeAndUse(t.Elem(), t, edgeElementType) - // (9.3) types use their underlying and element types - ctx.seeAndUse(t.Key(), t, edgeKeyType) - g.typ(ctx, t.Elem(), nil) - g.typ(ctx, t.Key(), nil) - case *types.Signature: - g.signature(ctx, t, nil) - case *types.Interface: - for i := 0; i < t.NumMethods(); i++ { - m := t.Method(i) - // (8.3) All interface methods are marked as used - ctx.seeAndUse(m, t, edgeInterfaceMethod) - ctx.seeAndUse(m.Type().(*types.Signature), m, edgeSignature) - g.signature(ctx, m.Type().(*types.Signature), nil) - } - for i := 0; i < t.NumEmbeddeds(); i++ { - tt := t.EmbeddedType(i) - // (8.4) All embedded interfaces are marked as used - ctx.seeAndUse(tt, t, edgeEmbeddedInterface) - } - case *types.Array: - // (9.3) types use their underlying and element types - ctx.seeAndUse(t.Elem(), t, edgeElementType) - g.typ(ctx, t.Elem(), nil) - case *types.Pointer: - // (9.3) types use their underlying and element types - ctx.seeAndUse(t.Elem(), t, edgeElementType) - g.typ(ctx, t.Elem(), nil) - case *types.Chan: - // (9.3) types use their underlying and element types - ctx.seeAndUse(t.Elem(), t, edgeElementType) - g.typ(ctx, t.Elem(), nil) - case *types.Tuple: - for i := 0; i < t.Len(); i++ { - // (9.3) types use their underlying and element types - ctx.seeAndUse(t.At(i).Type(), t, edgeTupleElement|edgeType) - g.typ(ctx, t.At(i).Type(), nil) - } - default: - panic(fmt.Sprintf("unreachable: %T", t)) - } -} - -func (g *Graph) variable(ctx *context, v *types.Var) { - // (9.2) variables use their types - ctx.seeAndUse(v.Type(), v, edgeType) - g.typ(ctx, v.Type(), nil) -} - -func (g *Graph) signature(ctx *context, sig *types.Signature, fn types.Object) { - var user interface{} = fn - if fn == nil { - user = sig - ctx.see(sig) - } - if sig.Recv() != nil { - ctx.seeAndUse(sig.Recv().Type(), user, edgeReceiver|edgeType) - g.typ(ctx, sig.Recv().Type(), nil) - } - for i := 0; i < sig.Params().Len(); i++ { - param := sig.Params().At(i) - ctx.seeAndUse(param.Type(), user, edgeFunctionArgument|edgeType) - g.typ(ctx, param.Type(), nil) - } - for i := 0; i < sig.Results().Len(); i++ { - param := sig.Results().At(i) - ctx.seeAndUse(param.Type(), user, edgeFunctionResult|edgeType) - g.typ(ctx, param.Type(), nil) - } -} - -func (g *Graph) instructions(ctx *context, fn *ssa.Function) { - fnObj := owningObject(fn) - for _, b := range fn.Blocks { - for _, instr := range b.Instrs { - ops := instr.Operands(nil) - switch instr.(type) { - case *ssa.Store: - // (9.7) variable _reads_ use variables, writes do not - ops = ops[1:] - case *ssa.DebugRef: - ops = nil - } - for _, arg := range ops { - walkPhi(*arg, func(v ssa.Value) { - switch v := v.(type) { - case *ssa.Function: - // (4.3) functions use closures and bound methods. - // (4.5) functions use functions they call - // (9.5) instructions use their operands - // (4.4) functions use functions they return. we assume that someone else will call the returned function - if owningObject(v) != nil { - ctx.seeAndUse(owningObject(v), fnObj, edgeInstructionOperand) - } - g.function(ctx, v) - case *ssa.Const: - // (9.6) instructions use their operands' types - ctx.seeAndUse(v.Type(), fnObj, edgeType) - g.typ(ctx, v.Type(), nil) - case *ssa.Global: - if v.Object() != nil { - // (9.5) instructions use their operands - ctx.seeAndUse(v.Object(), fnObj, edgeInstructionOperand) - } - } - }) - } - if v, ok := instr.(ssa.Value); ok { - if _, ok := v.(*ssa.Range); !ok { - // See https://github.com/golang/go/issues/19670 - - // (4.8) instructions use their types - // (9.4) conversions use the type they convert to - ctx.seeAndUse(v.Type(), fnObj, edgeType) - g.typ(ctx, v.Type(), nil) - } - } - switch instr := instr.(type) { - case *ssa.Field: - st := instr.X.Type().Underlying().(*types.Struct) - field := st.Field(instr.Field) - // (4.7) functions use fields they access - ctx.seeAndUse(field, fnObj, edgeFieldAccess) - case *ssa.FieldAddr: - st := lintdsl.Dereference(instr.X.Type()).Underlying().(*types.Struct) - field := st.Field(instr.Field) - // (4.7) functions use fields they access - ctx.seeAndUse(field, fnObj, edgeFieldAccess) - case *ssa.Store: - // nothing to do, handled generically by operands - case *ssa.Call: - c := instr.Common() - if !c.IsInvoke() { - // handled generically as an instruction operand - - if g.wholeProgram { - // (e3) special case known reflection-based method callers - switch lintdsl.CallName(c) { - case "net/rpc.Register", "net/rpc.RegisterName", "(*net/rpc.Server).Register", "(*net/rpc.Server).RegisterName": - var arg ssa.Value - switch lintdsl.CallName(c) { - case "net/rpc.Register": - arg = c.Args[0] - case "net/rpc.RegisterName": - arg = c.Args[1] - case "(*net/rpc.Server).Register": - arg = c.Args[1] - case "(*net/rpc.Server).RegisterName": - arg = c.Args[2] - } - walkPhi(arg, func(v ssa.Value) { - if v, ok := v.(*ssa.MakeInterface); ok { - walkPhi(v.X, func(vv ssa.Value) { - ms := ctx.pkg.SSA.Prog.MethodSets.MethodSet(vv.Type()) - for i := 0; i < ms.Len(); i++ { - if ms.At(i).Obj().Exported() { - g.useMethod(ctx, vv.Type(), ms.At(i), fnObj, edgeNetRPCRegister) - } - } - }) - } - }) - } - } - } else { - // (4.5) functions use functions/interface methods they call - ctx.seeAndUse(c.Method, fnObj, edgeInterfaceCall) - } - case *ssa.Return: - // nothing to do, handled generically by operands - case *ssa.ChangeType: - // conversion type handled generically - - s1, ok1 := lintdsl.Dereference(instr.Type()).Underlying().(*types.Struct) - s2, ok2 := lintdsl.Dereference(instr.X.Type()).Underlying().(*types.Struct) - if ok1 && ok2 { - // Converting between two structs. The fields are - // relevant for the conversion, but only if the - // fields are also used outside of the conversion. - // Mark fields as used by each other. - - assert(s1.NumFields() == s2.NumFields()) - for i := 0; i < s1.NumFields(); i++ { - ctx.see(s1.Field(i)) - ctx.see(s2.Field(i)) - // (5.1) when converting between two equivalent structs, the fields in - // either struct use each other. the fields are relevant for the - // conversion, but only if the fields are also accessed outside the - // conversion. - ctx.seeAndUse(s1.Field(i), s2.Field(i), edgeStructConversion) - ctx.seeAndUse(s2.Field(i), s1.Field(i), edgeStructConversion) - } - } - case *ssa.MakeInterface: - // nothing to do, handled generically by operands - case *ssa.Slice: - // nothing to do, handled generically by operands - case *ssa.RunDefers: - // nothing to do, the deferred functions are already marked use by defering them. - case *ssa.Convert: - // to unsafe.Pointer - if typ, ok := instr.Type().(*types.Basic); ok && typ.Kind() == types.UnsafePointer { - if ptr, ok := instr.X.Type().Underlying().(*types.Pointer); ok { - if st, ok := ptr.Elem().Underlying().(*types.Struct); ok { - for i := 0; i < st.NumFields(); i++ { - // (5.2) when converting to or from unsafe.Pointer, mark all fields as used. - ctx.seeAndUse(st.Field(i), fnObj, edgeUnsafeConversion) - } - } - } - } - // from unsafe.Pointer - if typ, ok := instr.X.Type().(*types.Basic); ok && typ.Kind() == types.UnsafePointer { - if ptr, ok := instr.Type().Underlying().(*types.Pointer); ok { - if st, ok := ptr.Elem().Underlying().(*types.Struct); ok { - for i := 0; i < st.NumFields(); i++ { - // (5.2) when converting to or from unsafe.Pointer, mark all fields as used. - ctx.seeAndUse(st.Field(i), fnObj, edgeUnsafeConversion) - } - } - } - } - case *ssa.TypeAssert: - // nothing to do, handled generically by instruction - // type (possibly a tuple, which contains the asserted - // to type). redundantly handled by the type of - // ssa.Extract, too - case *ssa.MakeClosure: - // nothing to do, handled generically by operands - case *ssa.Alloc: - // nothing to do - case *ssa.UnOp: - // nothing to do - case *ssa.BinOp: - // nothing to do - case *ssa.If: - // nothing to do - case *ssa.Jump: - // nothing to do - case *ssa.IndexAddr: - // nothing to do - case *ssa.Extract: - // nothing to do - case *ssa.Panic: - // nothing to do - case *ssa.DebugRef: - // nothing to do - case *ssa.BlankStore: - // nothing to do - case *ssa.Phi: - // nothing to do - case *ssa.MakeMap: - // nothing to do - case *ssa.MapUpdate: - // nothing to do - case *ssa.Lookup: - // nothing to do - case *ssa.MakeSlice: - // nothing to do - case *ssa.Send: - // nothing to do - case *ssa.MakeChan: - // nothing to do - case *ssa.Range: - // nothing to do - case *ssa.Next: - // nothing to do - case *ssa.Index: - // nothing to do - case *ssa.Select: - // nothing to do - case *ssa.ChangeInterface: - // nothing to do - case *ssa.Go: - // nothing to do, handled generically by operands - case *ssa.Defer: - // nothing to do, handled generically by operands - default: - panic(fmt.Sprintf("unreachable: %T", instr)) - } - } - } -} - -// isNoCopyType reports whether a type represents the NoCopy sentinel -// type. The NoCopy type is a named struct with no fields and exactly -// one method `func Lock()` that is empty. -// -// FIXME(dh): currently we're not checking that the function body is -// empty. -func isNoCopyType(typ types.Type) bool { - st, ok := typ.Underlying().(*types.Struct) - if !ok { - return false - } - if st.NumFields() != 0 { - return false - } - - named, ok := typ.(*types.Named) - if !ok { - return false - } - if named.NumMethods() != 1 { - return false - } - meth := named.Method(0) - if meth.Name() != "Lock" { - return false - } - sig := meth.Type().(*types.Signature) - if sig.Params().Len() != 0 || sig.Results().Len() != 0 { - return false - } - return true -} - -func walkPhi(v ssa.Value, fn func(v ssa.Value)) { - phi, ok := v.(*ssa.Phi) - if !ok { - fn(v) - return - } - - seen := map[ssa.Value]struct{}{} - var impl func(v *ssa.Phi) - impl = func(v *ssa.Phi) { - if _, ok := seen[v]; ok { - return - } - seen[v] = struct{}{} - for _, e := range v.Edges { - if ev, ok := e.(*ssa.Phi); ok { - impl(ev) - } else { - fn(e) - } - } - } - impl(phi) -} - -func interfacesFromExportData(pkg *types.Package) []*types.Interface { - var out []*types.Interface - scope := pkg.Scope() - for _, name := range scope.Names() { - obj := scope.Lookup(name) - out = append(out, interfacesFromObject(obj)...) - } - return out -} - -func interfacesFromObject(obj types.Object) []*types.Interface { - var out []*types.Interface - switch obj := obj.(type) { - case *types.Func: - sig := obj.Type().(*types.Signature) - for i := 0; i < sig.Results().Len(); i++ { - out = append(out, interfacesFromObject(sig.Results().At(i))...) - } - for i := 0; i < sig.Params().Len(); i++ { - out = append(out, interfacesFromObject(sig.Params().At(i))...) - } - case *types.TypeName: - if named, ok := obj.Type().(*types.Named); ok { - for i := 0; i < named.NumMethods(); i++ { - out = append(out, interfacesFromObject(named.Method(i))...) - } - - if iface, ok := named.Underlying().(*types.Interface); ok { - out = append(out, iface) - } - } - case *types.Var: - // No call to Underlying here. We want unnamed interfaces - // only. Named interfaces are gotten directly from the - // package's scope. - if iface, ok := obj.Type().(*types.Interface); ok { - out = append(out, iface) - } - case *types.Const: - case *types.Builtin: - default: - panic(fmt.Sprintf("unhandled type: %T", obj)) - } - return out -} diff --git a/vendor/honnef.co/go/tools/version/BUILD b/vendor/honnef.co/go/tools/version/BUILD deleted file mode 100644 index 134201e184b..00000000000 --- a/vendor/honnef.co/go/tools/version/BUILD +++ /dev/null @@ -1,27 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "buildinfo.go", - "buildinfo111.go", - "version.go", - ], - importmap = "k8s.io/kubernetes/vendor/honnef.co/go/tools/version", - importpath = "honnef.co/go/tools/version", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/honnef.co/go/tools/version/buildinfo.go b/vendor/honnef.co/go/tools/version/buildinfo.go deleted file mode 100644 index b6034bb7dcd..00000000000 --- a/vendor/honnef.co/go/tools/version/buildinfo.go +++ /dev/null @@ -1,46 +0,0 @@ -// +build go1.12 - -package version - -import ( - "fmt" - "runtime/debug" -) - -func printBuildInfo() { - if info, ok := debug.ReadBuildInfo(); ok { - fmt.Println("Main module:") - printModule(&info.Main) - fmt.Println("Dependencies:") - for _, dep := range info.Deps { - printModule(dep) - } - } else { - fmt.Println("Built without Go modules") - } -} - -func buildInfoVersion() (string, bool) { - info, ok := debug.ReadBuildInfo() - if !ok { - return "", false - } - if info.Main.Version == "(devel)" { - return "", false - } - return info.Main.Version, true -} - -func printModule(m *debug.Module) { - fmt.Printf("\t%s", m.Path) - if m.Version != "(devel)" { - fmt.Printf("@%s", m.Version) - } - if m.Sum != "" { - fmt.Printf(" (sum: %s)", m.Sum) - } - if m.Replace != nil { - fmt.Printf(" (replace: %s)", m.Replace.Path) - } - fmt.Println() -} diff --git a/vendor/honnef.co/go/tools/version/buildinfo111.go b/vendor/honnef.co/go/tools/version/buildinfo111.go deleted file mode 100644 index 06aae1e65bb..00000000000 --- a/vendor/honnef.co/go/tools/version/buildinfo111.go +++ /dev/null @@ -1,6 +0,0 @@ -// +build !go1.12 - -package version - -func printBuildInfo() {} -func buildInfoVersion() (string, bool) { return "", false } diff --git a/vendor/honnef.co/go/tools/version/version.go b/vendor/honnef.co/go/tools/version/version.go deleted file mode 100644 index c69e97e8a0d..00000000000 --- a/vendor/honnef.co/go/tools/version/version.go +++ /dev/null @@ -1,42 +0,0 @@ -package version - -import ( - "fmt" - "os" - "path/filepath" - "runtime" -) - -const Version = "2019.2.2" - -// version returns a version descriptor and reports whether the -// version is a known release. -func version() (string, bool) { - if Version != "devel" { - return Version, true - } - v, ok := buildInfoVersion() - if ok { - return v, false - } - return "devel", false -} - -func Print() { - v, release := version() - - if release { - fmt.Printf("%s %s\n", filepath.Base(os.Args[0]), v) - } else if v == "devel" { - fmt.Printf("%s (no version)\n", filepath.Base(os.Args[0])) - } else { - fmt.Printf("%s (devel, %s)\n", filepath.Base(os.Args[0]), v) - } -} - -func Verbose() { - Print() - fmt.Println() - fmt.Println("Compiled with Go version:", runtime.Version()) - printBuildInfo() -} diff --git a/vendor/k8s.io/repo-infra/LICENSE b/vendor/k8s.io/repo-infra/LICENSE deleted file mode 100644 index 8dada3edaf5..00000000000 --- a/vendor/k8s.io/repo-infra/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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. diff --git a/vendor/k8s.io/repo-infra/cmd/kazel/BUILD b/vendor/k8s.io/repo-infra/cmd/kazel/BUILD deleted file mode 100644 index 8f559f39384..00000000000 --- a/vendor/k8s.io/repo-infra/cmd/kazel/BUILD +++ /dev/null @@ -1,40 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "config.go", - "diff.go", - "generator.go", - "kazel.go", - "sourcerer.go", - ], - importmap = "k8s.io/kubernetes/vendor/k8s.io/repo-infra/cmd/kazel", - importpath = "k8s.io/repo-infra/cmd/kazel", - visibility = ["//visibility:private"], - deps = [ - "//vendor/github.com/bazelbuild/buildtools/build:go_default_library", - "//vendor/k8s.io/klog:go_default_library", - ], -) - -go_binary( - name = "kazel", - embed = [":go_default_library"], - tags = ["manual"], - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/k8s.io/repo-infra/cmd/kazel/README.rst b/vendor/k8s.io/repo-infra/cmd/kazel/README.rst deleted file mode 100644 index 2cc96aee7cd..00000000000 --- a/vendor/k8s.io/repo-infra/cmd/kazel/README.rst +++ /dev/null @@ -1,90 +0,0 @@ -kazel - a BUILD file generator for go and bazel -=============================================== - -Requirements: -############# - -* Your project must be somewhat compatible with go tool because - kazel uses go tool to parse your import tree. -* You must have a **GOPATH** and **GOROOT** setup and your project must - be in the correct location in your **GOPATH**. -* Your ``./vendor`` directory may not contain ``BUILD`` files. - -Usage: -###### - -1. Get kazel by running ``go get k8s.io/repo-infra/kazel``. - -2. Create a ``.kazelcfg.json`` in the root of the repository. For the - kazel repository, the ``.kazelcfg.json`` would look like: - - .. code-block:: json - - { - "GoPrefix": "k8s.io/repo-infra", - "SrcDirs": [ - "./kazel" - ], - "SkippedPaths": [ - ".*foobar(baz)?.*$" - ] - } - -3. Run kazel: - - .. code-block:: bash - - $ kazel -root=$GOPATH/src/k8s.io/repo-infra - -Defaults: -######### - -* **SrcDirs** in ``.kazelcfg.json`` defaults to ``["./"]`` -* ``-root`` option defaults to the current working directory - -Automanagement: -############### - -kazel reconciles rules that have the "**automanaged**" tag. If -you no longer want kazel to manage a rule, you can remove the -**automanaged** tag and kazel will no longer manage that rule. - -kazel only manages srcs, deps, and library attributes of a -rule after initial creation so you can add and managed other -attributes like data and copts and kazel will respect your -changes. - -kazel automatically formats all ``BUILD`` files in your repository -except for those matching **SkippedPaths**. - -Adding "sources" rules: -####################### - -If you set "**AddSourcesRules**": ``true`` in your ``.kazelcfg.json``, -kazel will create "**package-srcs**" and "**all-srcs**" rules in every -package. - -The "**package-srcs**" rule is a glob matching all files in the -package recursively, but not any files owned by packages in -subdirectories. - -The "**all-srcs**" rule includes both the "**package-srcs**" rule and -the "**all-srcs**" rules of all subpackages; i.e. **//:all-srcs** will -include all files in your repository. - -The "**package-srcs**" rule defaults to private visibility, -since it is safer to depend on the "**all-srcs**" rule: if a -subpackage is added, the "**package-srcs**" rule will no longer -include those files. - -You can remove the "**automanaged**" tag from the "**package-srcs**" -rule if you need to modify the glob (such as adding excludes). -It's recommended that you leave the "**all-srcs**" rule -automanaged. - -Validating BUILD files in CI: -############################# - -If you run kazel with ``--validate``, it will not update any ``BUILD`` files, but it -will exit nonzero if any ``BUILD`` files are out-of-date. You can add ``--print-diff`` -to print out the changes needed. diff --git a/vendor/k8s.io/repo-infra/cmd/kazel/config.go b/vendor/k8s.io/repo-infra/cmd/kazel/config.go deleted file mode 100644 index 3d2363196ce..00000000000 --- a/vendor/k8s.io/repo-infra/cmd/kazel/config.go +++ /dev/null @@ -1,70 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 main - -import ( - "encoding/json" - "io/ioutil" -) - -// Cfg defines the configuration options for kazel. -type Cfg struct { - GoPrefix string - // evaluated recursively, defaults to ["."] - SrcDirs []string - // regexps that match packages to skip - SkippedPaths []string - // regexps that match packages to skip for k8s codegen. - // note that this skips anything matched by SkippedPaths as well. - SkippedK8sCodegenPaths []string - // whether to add "pkg-srcs" and "all-srcs" filegroups - // note that this operates on the entire tree (not just SrcsDirs) but skips anything matching SkippedPaths - AddSourcesRules bool - // whether to have multiple build files in vendor/ or just one. - VendorMultipleBuildFiles bool - // Whether to manage the upstream Go rules provided by bazelbuild/rules_go. - // If using gazelle, set this to false (or omit). - ManageGoRules bool - // If defined, metadata parsed from "+k8s:" codegen build tags will be saved into this file. - K8sCodegenBzlFile string - // If defined, contains the boilerplate text to be included in the header of the generated bzl file. - K8sCodegenBoilerplateFile string - // Which tags to include in the codegen bzl file. - // Include only the name of the tag. - // For example, to include +k8s:foo=bar, list "foo" here. - K8sCodegenTags []string -} - -// ReadCfg reads and unmarshals the specified json file into a Cfg struct. -func ReadCfg(cfgPath string) (*Cfg, error) { - b, err := ioutil.ReadFile(cfgPath) - if err != nil { - return nil, err - } - var cfg Cfg - if err := json.Unmarshal(b, &cfg); err != nil { - return nil, err - } - defaultCfg(&cfg) - return &cfg, nil -} - -func defaultCfg(c *Cfg) { - if len(c.SrcDirs) == 0 { - c.SrcDirs = []string{"."} - } -} diff --git a/vendor/k8s.io/repo-infra/cmd/kazel/diff.go b/vendor/k8s.io/repo-infra/cmd/kazel/diff.go deleted file mode 100644 index 37bed9381cd..00000000000 --- a/vendor/k8s.io/repo-infra/cmd/kazel/diff.go +++ /dev/null @@ -1,60 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 main - -import ( - "io/ioutil" - "os" - "os/exec" -) - -// Diff prints the unified diff of the two provided byte slices -// using the unix diff command. -func Diff(left, right []byte) error { - lf, err := ioutil.TempFile("/tmp", "actual-file-") - if err != nil { - return err - } - defer lf.Close() - defer os.Remove(lf.Name()) - - rf, err := ioutil.TempFile("/tmp", "expected-file-") - if err != nil { - return err - } - defer rf.Close() - defer os.Remove(rf.Name()) - - _, err = lf.Write(left) - if err != nil { - return err - } - lf.Close() - - _, err = rf.Write(right) - if err != nil { - return err - } - rf.Close() - - cmd := exec.Command("/usr/bin/diff", "-u", lf.Name(), rf.Name()) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - cmd.Run() - - return nil -} diff --git a/vendor/k8s.io/repo-infra/cmd/kazel/generator.go b/vendor/k8s.io/repo-infra/cmd/kazel/generator.go deleted file mode 100644 index 2cb8c0fc7e9..00000000000 --- a/vendor/k8s.io/repo-infra/cmd/kazel/generator.go +++ /dev/null @@ -1,178 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 main - -import ( - "io/ioutil" - "os" - "path/filepath" - "regexp" - "sort" - "strings" - - "github.com/bazelbuild/buildtools/build" -) - -var ( - // Generator tags are specified using the format "// +k8s:name=value" - genTagRe = regexp.MustCompile(`//\s*\+k8s:([^\s=]+)(?:=(\S+))\s*\n`) -) - -// {tagName: {value: {pkgs}}} or {tagName: {pkg: {values}}} -type generatorTagsMap map[string]map[string]map[string]bool - -// extractTags finds k8s codegen tags found in b listed in requestedTags. -// It returns a map of {tag name: slice of values for that tag}. -func extractTags(b []byte, requestedTags map[string]bool) map[string][]string { - tags := make(map[string][]string) - matches := genTagRe.FindAllSubmatch(b, -1) - for _, m := range matches { - if len(m) >= 3 { - tag, values := string(m[1]), string(m[2]) - if _, requested := requestedTags[tag]; !requested { - continue - } - tags[tag] = append(tags[tag], strings.Split(values, ",")...) - } - } - return tags -} - -// findGeneratorTags searches for all packages under root that include a kubernetes generator -// tag comment. It does not follow symlinks, and any path in the configured skippedPaths -// or codegen skipped paths is skipped. -func (v *Vendorer) findGeneratorTags(root string, requestedTags map[string]bool) (tagsValuesPkgs, tagsPkgsValues generatorTagsMap, err error) { - tagsValuesPkgs = make(generatorTagsMap) - tagsPkgsValues = make(generatorTagsMap) - - err = filepath.Walk(root, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - pkg := filepath.Dir(path) - - for _, r := range v.skippedK8sCodegenPaths { - if r.MatchString(pkg) { - return filepath.SkipDir - } - } - - if !strings.HasSuffix(path, ".go") || strings.HasSuffix(path, "_test.go") { - return nil - } - - b, err := ioutil.ReadFile(path) - if err != nil { - return err - } - - for tag, values := range extractTags(b, requestedTags) { - if _, present := tagsValuesPkgs[tag]; !present { - tagsValuesPkgs[tag] = make(map[string]map[string]bool) - } - if _, present := tagsPkgsValues[tag]; !present { - tagsPkgsValues[tag] = make(map[string]map[string]bool) - } - if _, present := tagsPkgsValues[tag][pkg]; !present { - tagsPkgsValues[tag][pkg] = make(map[string]bool) - } - for _, v := range values { - if _, present := tagsValuesPkgs[tag][v]; !present { - tagsValuesPkgs[tag][v] = make(map[string]bool) - } - // Since multiple files in the same package may list a given tag/value, use a set to deduplicate. - tagsValuesPkgs[tag][v][pkg] = true - tagsPkgsValues[tag][pkg][v] = true - } - } - - return nil - }) - - if err != nil { - return nil, nil, err - } - - return -} - -// flattened returns a copy of the map with the final stringSet flattened into a sorted slice. -func flattened(m generatorTagsMap) map[string]map[string][]string { - flattened := make(map[string]map[string][]string) - for tag, subMap := range m { - flattened[tag] = make(map[string][]string) - for k, subSet := range subMap { - for v := range subSet { - flattened[tag][k] = append(flattened[tag][k], v) - } - sort.Strings(flattened[tag][k]) - } - } - return flattened -} - -// walkGenerated generates a k8s codegen bzl file that can be parsed by Starlark -// rules and macros to find packages needed k8s code generation. -// This involves reading all non-test go sources in the tree and looking for -// "+k8s:name=value" tags. Only those tags listed in K8sCodegenTags will be -// included. -// If a K8sCodegenBoilerplateFile was configured, the contents of this file -// will be included as the header of the generated bzl file. -// Returns true if there are diffs against the existing generated bzl file. -func (v *Vendorer) walkGenerated() (bool, error) { - if v.cfg.K8sCodegenBzlFile == "" { - return false, nil - } - // only include the specified tags - requestedTags := make(map[string]bool) - for _, tag := range v.cfg.K8sCodegenTags { - requestedTags[tag] = true - } - tagsValuesPkgs, tagsPkgsValues, err := v.findGeneratorTags(".", requestedTags) - if err != nil { - return false, err - } - - f := &build.File{ - Path: v.cfg.K8sCodegenBzlFile, - } - addCommentBefore(f, "#################################################") - addCommentBefore(f, "# # # # # # # # # # # # # # # # # # # # # # # # #") - addCommentBefore(f, "This file is autogenerated by kazel. DO NOT EDIT.") - addCommentBefore(f, "# # # # # # # # # # # # # # # # # # # # # # # # #") - addCommentBefore(f, "#################################################") - addCommentBefore(f, "") - - f.Stmt = append(f.Stmt, varExpr("go_prefix", "The go prefix passed to kazel", v.cfg.GoPrefix)) - f.Stmt = append(f.Stmt, varExpr("kazel_configured_tags", "The list of codegen tags kazel is configured to find", v.cfg.K8sCodegenTags)) - f.Stmt = append(f.Stmt, varExpr("tags_values_pkgs", "tags_values_pkgs is a dictionary mapping {k8s build tag: {tag value: [pkgs including that tag:value]}}", flattened(tagsValuesPkgs))) - f.Stmt = append(f.Stmt, varExpr("tags_pkgs_values", "tags_pkgs_values is a dictionary mapping {k8s build tag: {pkg: [tag values in pkg]}}", flattened(tagsPkgsValues))) - - var boilerplate []byte - if v.cfg.K8sCodegenBoilerplateFile != "" { - boilerplate, err = ioutil.ReadFile(v.cfg.K8sCodegenBoilerplateFile) - if err != nil { - return false, err - } - } - // Open existing file to use in diff mode. - _, err = os.Stat(f.Path) - if err != nil && !os.IsNotExist(err) { - return false, err - } - return writeFile(f.Path, f, boilerplate, !os.IsNotExist(err), v.dryRun) -} diff --git a/vendor/k8s.io/repo-infra/cmd/kazel/kazel.go b/vendor/k8s.io/repo-infra/cmd/kazel/kazel.go deleted file mode 100644 index ae04aeb535f..00000000000 --- a/vendor/k8s.io/repo-infra/cmd/kazel/kazel.go +++ /dev/null @@ -1,402 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 main - -import ( - "bytes" - "flag" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "reflect" - "regexp" - "sort" - - "github.com/bazelbuild/buildtools/build" - - "k8s.io/klog" -) - -const ( - automanagedTag = "automanaged" -) - -var ( - root = flag.String("root", ".", "root of go source") - dryRun = flag.Bool("dry-run", false, "run in dry mode") - printDiff = flag.Bool("print-diff", false, "print diff to stdout") - validate = flag.Bool("validate", false, "run in dry mode and exit nonzero if any BUILD files need to be updated") - cfgPath = flag.String("cfg-path", ".kazelcfg.json", "path to kazel config (relative paths interpreted relative to -repo.") -) - -func main() { - flag.Parse() - flag.Set("alsologtostderr", "true") - if *root == "" { - klog.Fatalf("-root argument is required") - } - if *validate { - *dryRun = true - } - v, err := newVendorer(*root, *cfgPath, *dryRun) - if err != nil { - klog.Fatalf("unable to build vendorer: %v", err) - } - if err = os.Chdir(v.root); err != nil { - klog.Fatalf("cannot chdir into root %q: %v", v.root, err) - } - if v.cfg.ManageGoRules { - klog.Fatalf("kazel no longer supports managing Go rules") - } - - wroteGenerated := false - if wroteGenerated, err = v.walkGenerated(); err != nil { - klog.Fatalf("err walking generated: %v", err) - } - if _, err = v.walkSource("."); err != nil { - klog.Fatalf("err walking source: %v", err) - } - written := 0 - if written, err = v.reconcileAllRules(); err != nil { - klog.Fatalf("err reconciling rules: %v", err) - } - if wroteGenerated { - written++ - } - if *validate && written > 0 { - fmt.Fprintf(os.Stderr, "\n%d BUILD files not up-to-date.\n", written) - os.Exit(1) - } -} - -// Vendorer collects context, configuration, and cache while walking the tree. -type Vendorer struct { - skippedPaths []*regexp.Regexp - skippedK8sCodegenPaths []*regexp.Regexp - dryRun bool - root string - cfg *Cfg - newRules map[string][]*build.Rule // package path -> list of rules to add or update - managedAttrs []string // which rule attributes kazel will overwrite -} - -func newVendorer(root, cfgPath string, dryRun bool) (*Vendorer, error) { - absRoot, err := filepath.Abs(root) - if err != nil { - return nil, fmt.Errorf("could not get absolute path: %v", err) - } - if !filepath.IsAbs(cfgPath) { - cfgPath = filepath.Join(absRoot, cfgPath) - } - cfg, err := ReadCfg(cfgPath) - if err != nil { - return nil, err - } - - v := Vendorer{ - dryRun: dryRun, - root: absRoot, - cfg: cfg, - newRules: make(map[string][]*build.Rule), - managedAttrs: []string{"srcs"}, - } - - builtIn, err := compileSkippedPaths([]string{"^\\.git", "^bazel-*"}) - if err != nil { - return nil, err - } - - sp, err := compileSkippedPaths(cfg.SkippedPaths) - if err != nil { - return nil, err - } - sp = append(builtIn, sp...) - v.skippedPaths = sp - - sop, err := compileSkippedPaths(cfg.SkippedK8sCodegenPaths) - if err != nil { - return nil, err - } - v.skippedK8sCodegenPaths = append(sop, sp...) - - return &v, nil - -} - -func writeRules(file *build.File, rules []*build.Rule) { - for _, rule := range rules { - file.Stmt = append(file.Stmt, rule.Call) - } -} - -func (v *Vendorer) addRules(pkgPath string, rules []*build.Rule) { - cleanPath := filepath.Clean(pkgPath) - v.newRules[cleanPath] = append(v.newRules[cleanPath], rules...) -} - -func (v *Vendorer) reconcileAllRules() (int, error) { - var paths []string - for path := range v.newRules { - paths = append(paths, path) - } - sort.Strings(paths) - written := 0 - for _, path := range paths { - w, err := ReconcileRules(path, v.newRules[path], v.managedAttrs, v.dryRun) - if w { - written++ - } - if err != nil { - return written, err - } - } - return written, nil -} - -// addCommentBefore adds a whole-line comment before the provided Expr. -func addCommentBefore(e build.Expr, comment string) { - c := e.Comment() - c.Before = append(c.Before, build.Comment{Token: fmt.Sprintf("# %s", comment)}) -} - -// varExpr creates a variable expression of the form "name = expr". -// v will be converted into an appropriate Expr using asExpr. -// The optional description will be included as a comment before the expression. -func varExpr(name, desc string, v interface{}) build.Expr { - e := &build.BinaryExpr{ - X: &build.LiteralExpr{Token: name}, - Op: "=", - Y: asExpr(v), - } - if desc != "" { - addCommentBefore(e, desc) - } - return e -} - -// rvSliceLessFunc returns a function that can be used with sort.Slice() or sort.SliceStable() -// to sort a slice of reflect.Values. -// It sorts ints and floats as their native kinds, and everything else as a string. -func rvSliceLessFunc(k reflect.Kind, vs []reflect.Value) func(int, int) bool { - switch k { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return func(i, j int) bool { return vs[i].Int() < vs[j].Int() } - case reflect.Float32, reflect.Float64: - return func(i, j int) bool { return vs[i].Float() < vs[j].Float() } - default: - return func(i, j int) bool { - return fmt.Sprintf("%v", vs[i]) < fmt.Sprintf("%v", vs[j]) - } - } -} - -// asExpr converts a native Go type into the equivalent Starlark expression using reflection. -// The keys of maps will be sorted for reproducibility. -func asExpr(e interface{}) build.Expr { - rv := reflect.ValueOf(e) - switch rv.Kind() { - case reflect.Bool: - return &build.LiteralExpr{Token: fmt.Sprintf("%t", e)} - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - return &build.LiteralExpr{Token: fmt.Sprintf("%d", e)} - case reflect.Float32, reflect.Float64: - return &build.LiteralExpr{Token: fmt.Sprintf("%g", e)} - case reflect.String: - return &build.StringExpr{Value: e.(string)} - case reflect.Slice, reflect.Array: - var list []build.Expr - for i := 0; i < rv.Len(); i++ { - list = append(list, asExpr(rv.Index(i).Interface())) - } - return &build.ListExpr{List: list} - case reflect.Map: - var list []build.Expr - keys := rv.MapKeys() - sort.SliceStable(keys, rvSliceLessFunc(rv.Type().Key().Kind(), keys)) - for _, key := range keys { - list = append(list, &build.KeyValueExpr{ - Key: asExpr(key.Interface()), - Value: asExpr(rv.MapIndex(key).Interface()), - }) - } - return &build.DictExpr{List: list} - default: - klog.Fatalf("unhandled kind: %q for value: %q", rv.Kind(), rv) - return nil - } -} - -func newRule(rt, name string, attrs map[string]build.Expr) *build.Rule { - rule := &build.Rule{ - Call: &build.CallExpr{ - X: &build.LiteralExpr{Token: rt}, - }, - } - rule.SetAttr("name", asExpr(name)) - for k, v := range attrs { - rule.SetAttr(k, v) - } - rule.SetAttr("tags", asExpr([]string{automanagedTag})) - return rule -} - -// findBuildFile determines the name of a preexisting BUILD file, returning -// a default if no such file exists. -func findBuildFile(pkgPath string) (bool, string) { - options := []string{"BUILD.bazel", "BUILD"} - for _, b := range options { - path := filepath.Join(pkgPath, b) - info, err := os.Stat(path) - if err == nil && !info.IsDir() { - return true, path - } - } - return false, filepath.Join(pkgPath, "BUILD.bazel") -} - -// ReconcileRules reconciles, simplifies, and writes the rules for the specified package, adding -// additional dependency rules as needed. -func ReconcileRules(pkgPath string, rules []*build.Rule, managedAttrs []string, dryRun bool) (bool, error) { - _, path := findBuildFile(pkgPath) - info, err := os.Stat(path) - if err != nil && os.IsNotExist(err) { - f := &build.File{} - writeRules(f, rules) - return writeFile(path, f, nil, false, dryRun) - } else if err != nil { - return false, err - } - if info.IsDir() { - return false, fmt.Errorf("%q cannot be a directory", path) - } - b, err := ioutil.ReadFile(path) - if err != nil { - return false, err - } - f, err := build.Parse(path, b) - if err != nil { - return false, err - } - oldRules := make(map[string]*build.Rule) - for _, r := range f.Rules("") { - oldRules[r.Name()] = r - } - for _, r := range rules { - o, ok := oldRules[r.Name()] - if !ok { - f.Stmt = append(f.Stmt, r.Call) - continue - } - if !RuleIsManaged(o) { - continue - } - reconcileAttr := func(o, n *build.Rule, name string) { - if e := n.Attr(name); e != nil { - o.SetAttr(name, e) - } else { - o.DelAttr(name) - } - } - for _, attr := range managedAttrs { - reconcileAttr(o, r, attr) - } - delete(oldRules, r.Name()) - } - - for _, r := range oldRules { - if !RuleIsManaged(r) { - continue - } - f.DelRules(r.Kind(), r.Name()) - } - - return writeFile(path, f, nil, true, dryRun) -} - -// RuleIsManaged returns whether the provided rule is managed by this tool, -// based on the tags set on the rule. -func RuleIsManaged(r *build.Rule) bool { - for _, tag := range r.AttrStrings("tags") { - if tag == automanagedTag { - return true - } - } - return false -} - -// writeFile writes out f to path, prepending boilerplate to the output. -// If exists is true, compares against the existing file specified by path, -// returning false if there are no changes. -// Otherwise, returns true. -// If dryRun is false, no files are actually changed; otherwise, the file will be written. -func writeFile(path string, f *build.File, boilerplate []byte, exists, dryRun bool) (bool, error) { - var info build.RewriteInfo - build.Rewrite(f, &info) - var out []byte - out = append(out, boilerplate...) - // double format the source file as our modification logic sometimes uses - // LiteralExpr where it should use other types of expressions, and this - // prevents issues where kazel thus formats structures incorrectly. - // :this_is_fine: - outData := build.Format(f) - var err error - f, err = build.Parse(path, outData) - if err != nil { - return false, fmt.Errorf("internal error occurred formatting file: %v", err) - } - // also call Rewrite again to run Buildifier against the results as - // visibility rules are not ordered correctly for some reason - build.Rewrite(f, &info) - out = append(out, build.Format(f)...) - if exists { - orig, err := ioutil.ReadFile(path) - if err != nil { - return false, err - } - if bytes.Compare(orig, out) == 0 { - return false, nil - } - if *printDiff { - Diff(orig, out) - } - } - if dryRun { - fmt.Fprintf(os.Stderr, "DRY-RUN: wrote %q\n", path) - return true, nil - } - werr := ioutil.WriteFile(path, out, 0644) - if werr == nil { - fmt.Fprintf(os.Stderr, "wrote %q\n", path) - } - return werr == nil, werr -} - -func compileSkippedPaths(skippedPaths []string) ([]*regexp.Regexp, error) { - regexPaths := []*regexp.Regexp{} - - for _, sp := range skippedPaths { - r, err := regexp.Compile(sp) - if err != nil { - return nil, err - } - regexPaths = append(regexPaths, r) - } - return regexPaths, nil -} diff --git a/vendor/k8s.io/repo-infra/cmd/kazel/sourcerer.go b/vendor/k8s.io/repo-infra/cmd/kazel/sourcerer.go deleted file mode 100644 index 68ef83146b6..00000000000 --- a/vendor/k8s.io/repo-infra/cmd/kazel/sourcerer.go +++ /dev/null @@ -1,109 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -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 main - -import ( - "fmt" - "io/ioutil" - "path/filepath" - - "github.com/bazelbuild/buildtools/build" -) - -const ( - pkgSrcsTarget = "package-srcs" - allSrcsTarget = "all-srcs" -) - -// walkSource walks the source tree recursively from pkgPath, adding -// any BUILD files to v.newRules to be formatted. -// -// If AddSourcesRules is enabled in the kazel config, then we additionally add -// package-sources and recursive all-srcs filegroups rules to every BUILD file. -// -// Returns the list of children all-srcs targets that should be added to the -// all-srcs rule of the enclosing package. -func (v *Vendorer) walkSource(pkgPath string) ([]string, error) { - // clean pkgPath since we access v.newRules directly - pkgPath = filepath.Clean(pkgPath) - for _, r := range v.skippedPaths { - if r.MatchString(pkgPath) { - return nil, nil - } - } - files, err := ioutil.ReadDir(pkgPath) - if err != nil { - return nil, err - } - - // Find any children packages we need to include in an all-srcs rule. - var children []string - for _, f := range files { - if f.IsDir() { - c, err := v.walkSource(filepath.Join(pkgPath, f.Name())) - if err != nil { - return nil, err - } - children = append(children, c...) - } - } - - // This path is a package either if we've added rules or if a BUILD file already exists. - _, hasRules := v.newRules[pkgPath] - isPkg := hasRules - if !isPkg { - isPkg, _ = findBuildFile(pkgPath) - } - - if !isPkg { - // This directory isn't a package (doesn't contain a BUILD file), - // but there might be subdirectories that are packages, - // so pass that up to our parent. - return children, nil - } - - // Enforce formatting the BUILD file, even if we're not adding srcs rules - if !hasRules { - v.addRules(pkgPath, nil) - } - - if !v.cfg.AddSourcesRules { - return nil, nil - } - - pkgSrcsExpr := &build.LiteralExpr{Token: `glob(["**"])`} - if pkgPath == "." { - pkgSrcsExpr = &build.LiteralExpr{Token: `glob(["**"], exclude=["bazel-*/**", ".git/**"])`} - } - - v.addRules(pkgPath, []*build.Rule{ - newRule("filegroup", - pkgSrcsTarget, - map[string]build.Expr{ - "srcs": pkgSrcsExpr, - "visibility": asExpr([]string{"//visibility:private"}), - }), - newRule("filegroup", - allSrcsTarget, - map[string]build.Expr{ - "srcs": asExpr(append(children, fmt.Sprintf(":%s", pkgSrcsTarget))), - // TODO: should this be more restricted? - "visibility": asExpr([]string{"//visibility:public"}), - }), - }) - return []string{fmt.Sprintf("//%s:%s", pkgPath, allSrcsTarget)}, nil -} diff --git a/vendor/modules.txt b/vendor/modules.txt index eeee916ead1..1da83cf0958 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -29,8 +29,6 @@ github.com/Azure/go-autorest/autorest/validation github.com/Azure/go-autorest/logger # github.com/Azure/go-autorest/tracing v0.5.0 => github.com/Azure/go-autorest/tracing v0.5.0 github.com/Azure/go-autorest/tracing -# github.com/BurntSushi/toml v0.3.1 => github.com/BurntSushi/toml v0.3.1 -github.com/BurntSushi/toml # github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534 => github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534 github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/filter @@ -114,40 +112,12 @@ github.com/aws/aws-sdk-go/service/elbv2 github.com/aws/aws-sdk-go/service/kms github.com/aws/aws-sdk-go/service/sts github.com/aws/aws-sdk-go/service/sts/stsiface -# github.com/bazelbuild/bazel-gazelle v0.19.1-0.20191105222053-70208cbdc798 => github.com/bazelbuild/bazel-gazelle v0.19.1-0.20191105222053-70208cbdc798 -github.com/bazelbuild/bazel-gazelle/cmd/gazelle -github.com/bazelbuild/bazel-gazelle/config -github.com/bazelbuild/bazel-gazelle/flag -github.com/bazelbuild/bazel-gazelle/internal/version -github.com/bazelbuild/bazel-gazelle/internal/wspace -github.com/bazelbuild/bazel-gazelle/label -github.com/bazelbuild/bazel-gazelle/language -github.com/bazelbuild/bazel-gazelle/language/go -github.com/bazelbuild/bazel-gazelle/language/proto -github.com/bazelbuild/bazel-gazelle/merger -github.com/bazelbuild/bazel-gazelle/pathtools -github.com/bazelbuild/bazel-gazelle/repo -github.com/bazelbuild/bazel-gazelle/resolve -github.com/bazelbuild/bazel-gazelle/rule -github.com/bazelbuild/bazel-gazelle/walk -# github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89 => github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89 -github.com/bazelbuild/buildtools/api_proto -github.com/bazelbuild/buildtools/build -github.com/bazelbuild/buildtools/build_proto -github.com/bazelbuild/buildtools/buildozer -github.com/bazelbuild/buildtools/edit -github.com/bazelbuild/buildtools/file -github.com/bazelbuild/buildtools/lang -github.com/bazelbuild/buildtools/tables -github.com/bazelbuild/buildtools/wspace # github.com/beorn7/perks v1.0.0 => github.com/beorn7/perks v1.0.0 github.com/beorn7/perks/quantile # github.com/blang/semver v3.5.0+incompatible => github.com/blang/semver v3.5.0+incompatible github.com/blang/semver # github.com/caddyserver/caddy v1.0.3 => github.com/caddyserver/caddy v1.0.3 github.com/caddyserver/caddy/caddyfile -# github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c => github.com/cespare/prettybench v0.0.0-20150116022406-03b8cfe5406c -github.com/cespare/prettybench # github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 => github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 github.com/chai2010/gettext-go/gettext github.com/chai2010/gettext-go/gettext/mo @@ -160,9 +130,6 @@ github.com/cilium/ebpf github.com/cilium/ebpf/asm github.com/cilium/ebpf/internal github.com/cilium/ebpf/internal/unix -# github.com/client9/misspell v0.3.4 => github.com/client9/misspell v0.3.4 -github.com/client9/misspell -github.com/client9/misspell/cmd/misspell # github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313 => github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313 github.com/clusterhq/flocker-go # github.com/container-storage-interface/spec v1.2.0 => github.com/container-storage-interface/spec v1.2.0 @@ -264,8 +231,6 @@ github.com/evanphx/json-patch github.com/exponent-io/jsonpath # github.com/fatih/camelcase v1.0.0 => github.com/fatih/camelcase v1.0.0 github.com/fatih/camelcase -# github.com/fatih/color v1.7.0 => github.com/fatih/color v1.7.0 -github.com/fatih/color # github.com/fsnotify/fsnotify v1.4.9 => github.com/fsnotify/fsnotify v1.4.9 github.com/fsnotify/fsnotify # github.com/ghodss/yaml v1.0.0 => github.com/ghodss/yaml v1.0.0 @@ -508,10 +473,6 @@ github.com/magiconair/properties github.com/mailru/easyjson/buffer github.com/mailru/easyjson/jlexer github.com/mailru/easyjson/jwriter -# github.com/mattn/go-colorable v0.0.9 => github.com/mattn/go-colorable v0.0.9 -github.com/mattn/go-colorable -# github.com/mattn/go-isatty v0.0.9 => github.com/mattn/go-isatty v0.0.9 -github.com/mattn/go-isatty # github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 => github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 github.com/matttproud/golang_protobuf_extensions/pbutil # github.com/miekg/dns v1.1.4 => github.com/miekg/dns v1.1.4 @@ -873,9 +834,6 @@ golang.org/x/crypto/salsa20/salsa golang.org/x/crypto/ssh golang.org/x/crypto/ssh/internal/bcrypt_pbkdf golang.org/x/crypto/ssh/terminal -# golang.org/x/lint v0.0.0-20190409202823-959b441ac422 => golang.org/x/lint v0.0.0-20190409202823-959b441ac422 -golang.org/x/lint -golang.org/x/lint/golint # golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e => golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e golang.org/x/net/bpf golang.org/x/net/context @@ -903,7 +861,6 @@ golang.org/x/oauth2/internal golang.org/x/oauth2/jws golang.org/x/oauth2/jwt # golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e => golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e -golang.org/x/sync/errgroup golang.org/x/sync/singleflight # golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd => golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a golang.org/x/sys/cpu @@ -939,18 +896,11 @@ golang.org/x/time/rate # golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72 => golang.org/x/tools v0.0.0-20190821162956-65e3620a7ae7 golang.org/x/tools/benchmark/parse golang.org/x/tools/container/intsets -golang.org/x/tools/go/analysis -golang.org/x/tools/go/analysis/passes/inspect golang.org/x/tools/go/ast/astutil -golang.org/x/tools/go/ast/inspector -golang.org/x/tools/go/buildutil golang.org/x/tools/go/gcexportdata golang.org/x/tools/go/internal/gcimporter golang.org/x/tools/go/internal/packagesdriver golang.org/x/tools/go/packages -golang.org/x/tools/go/types/objectpath -golang.org/x/tools/go/types/typeutil -golang.org/x/tools/go/vcs golang.org/x/tools/imports golang.org/x/tools/internal/fastwalk golang.org/x/tools/internal/gopathwalk @@ -1086,38 +1036,6 @@ gopkg.in/tomb.v1 gopkg.in/warnings.v0 # gopkg.in/yaml.v2 v2.2.8 => gopkg.in/yaml.v2 v2.2.8 gopkg.in/yaml.v2 -# gotest.tools v2.2.0+incompatible => gotest.tools v2.2.0+incompatible -gotest.tools -# gotest.tools/gotestsum v0.3.5 => gotest.tools/gotestsum v0.3.5 -gotest.tools/gotestsum -gotest.tools/gotestsum/internal/junitxml -gotest.tools/gotestsum/testjson -# honnef.co/go/tools v0.0.1-2019.2.2 => honnef.co/go/tools v0.0.1-2019.2.2 -honnef.co/go/tools/arg -honnef.co/go/tools/cmd/staticcheck -honnef.co/go/tools/config -honnef.co/go/tools/deprecated -honnef.co/go/tools/facts -honnef.co/go/tools/functions -honnef.co/go/tools/go/types/typeutil -honnef.co/go/tools/internal/cache -honnef.co/go/tools/internal/passes/buildssa -honnef.co/go/tools/internal/renameio -honnef.co/go/tools/internal/sharedcheck -honnef.co/go/tools/lint -honnef.co/go/tools/lint/lintdsl -honnef.co/go/tools/lint/lintutil -honnef.co/go/tools/lint/lintutil/format -honnef.co/go/tools/loader -honnef.co/go/tools/printf -honnef.co/go/tools/simple -honnef.co/go/tools/ssa -honnef.co/go/tools/ssautil -honnef.co/go/tools/staticcheck -honnef.co/go/tools/staticcheck/vrp -honnef.co/go/tools/stylecheck -honnef.co/go/tools/unused -honnef.co/go/tools/version # k8s.io/api v0.0.0 => ./staging/src/k8s.io/api k8s.io/api/admission/v1 k8s.io/api/admission/v1beta1 @@ -1928,8 +1846,6 @@ k8s.io/metrics/pkg/client/custom_metrics/fake k8s.io/metrics/pkg/client/custom_metrics/scheme k8s.io/metrics/pkg/client/external_metrics k8s.io/metrics/pkg/client/external_metrics/fake -# k8s.io/repo-infra v0.0.1-alpha.1 => k8s.io/repo-infra v0.0.1-alpha.1 -k8s.io/repo-infra/cmd/kazel # k8s.io/sample-apiserver v0.0.0 => ./staging/src/k8s.io/sample-apiserver k8s.io/sample-apiserver/pkg/admission/plugin/banflunder k8s.io/sample-apiserver/pkg/admission/wardleinitializer